《深入理解計算機系統》一

程序翻譯成不同格式

在unix系統上,從源文件到目標文件的轉化是有編譯器驅動程序完成的。

命令:gcc -o hello hello.c    這裏GCC編譯器驅動將hello.c翻譯成一個目標文件hello,這個過程可分爲4個步驟

  1.  預處理階段:根據#開頭的命令修改成宿  如#include<stdio.h>,讀取系統頭文件插入程序文本中
  2. 編譯階段:講程序hello.i翻譯成hello.s,也就是翻譯成彙編語言
  3. 彙編階段:將hello.s方已成機器語言指令並打包成hello.o
  4. 鏈接階段:比如hello程序調用了printf函數,printf函數存在於一個名爲printf.o的單獨的預編譯好了的目標文件中,這個文件需要合併到hello.o的程序中,ld就負責這種合併,得到hello文件,可以被加載到內存中,由系統執行。

 系統的硬件組成

總線

貫穿整個系統的一組電子管道,總線被設計成傳送定長的字節快,也就是字。

I/O設備

系統和外部聯繫通道,如鼠標鍵盤,顯示器磁盤等等。一般io設備都會通過適配器和控制器與I/o總線相連

主存

臨時存儲設備,用來存放和程序處理的數據,從邏輯上說,存儲器就是一個線性的字節數組

處理器

cpu,處理器的核心是一個大小爲一個字的存儲設備,成爲程序計數器,任何時候程序計數器(PC)都指向主存中的某條機器語言指令。

高速緩存

機械原理:較大的存儲設備要比較小的存儲設備運行得慢,而快速設備的造價遠高於同類的低速設備。

高速緩存用於緩解主存和處理器之間速度不匹配的問題

進程

進程是操作系統對一個正在運行的程序的一種抽象,是一系列指令的集合。進程的切換是由操作系統內核管理的,內核是操作系統代碼常駐主存的部分。比如應用程序需要操作系統的某些操作時,比如讀寫文件,它就執行一條特殊的系統調用指令,將控制權給內核。然後內核執行請求並放回給應用程序。內核是系統管理全部進程所用代碼和數據結構的集合。

線程

一個進程可以由多個線程組成,每個線程都運行在進程的上下文中,並共享同樣代碼和全局數據。

進程的虛擬地址空間,從底地址開始:

程序代碼和數據:代碼和數據區是直接按照可執行目標文件的內容初始化的。該區在進程一開始運行的時候就被指定大小。

當調用了malloc和free時,堆可以在運行時動態的擴展和收縮。

共享庫

存放像C標準庫這樣的共享庫的代碼和數據的區域。

編譯器用它來實現函數調用。和堆一樣,可以動態的擴展和收縮。調用一個函數時,棧就會增長,從一個函數返回,棧就收縮。

內核虛擬內存

位於複製空間頂部,用戶代碼不可見的內存(應用程序不可讀寫),爲內核保留的。基本思想把一個進程虛擬內存的內容存儲在磁盤上,然後用主存作爲磁盤的告訴緩存。

文件

文件就是字節序列,每個I/o設備都可以看做是文件,例如:鍵盤,顯示器甚至網絡,系統中的所有I/O操作都是通過 一組稱爲Unix I/O系統的函數調用讀寫文件來實現的。

計算機中的抽象

文件是對I/O設備的抽象,虛擬內存是對儲存的抽象,進程是對一個正在運行的程序的抽象,虛擬機是對計算機的抽象。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章