標籤:電腦系統
程式的編譯過程
為了說明程式的編譯過程,我們用經典的hello world程式作為例子
#include <stdio.h>int main(int argc, char const *argv[]){ printf("hello world!!!\n"); return 0;}
在linux系統中,我們用GCC編譯器將來源程式檔案helloworld.c編譯成可執行目標檔案helloworld。
zengwh@zengwh:~/test_code$ gcc helloworld.c -o hellozengwh@zengwh:~/test_code$ ./hellohello world!!!
這個過程經過四個階段,分別是預先處理階段,編譯階段,彙編階段和連結階段。執行這個四個階段的程式分別是前置處理器,編譯器,彙編器和連結器,一起構成了編譯系統。
- 預先處理階段:前置處理器(cpp)根據‘#’包含的標頭檔,將標頭檔的內容加進來源程式中。得到新的程式檔案文本,以“.i”為副檔名。比如說helloworld程式包含stdio.h標頭檔,這個階段將這個標頭檔的內容插進來源程式中
- 編譯階段:編譯器(ccl)將文字檔hello.i翻譯成組譯工具hello.S。也就是將進階語言翻譯成彙編代碼,低級的機器語言指令。
- 彙編階段:彙編器(as)將組譯工具hello.S翻譯成機器指令,將這些指令打包成可重定位目標程式的格式,並把結果儲存在hello.o檔案中,hello.o是個二進位檔案。
- 連結階段:連結器(ld)將會把一個工程中所有的.o檔案連結合并成一個可執行目標檔案,可以被載入在記憶體中,由系統運行。
系統硬體組成
快取(Caches)
快取用來存放處理器近期可能需要的資訊,用來加快程式在CPU的運行,是一個典型系統中的快取儲存空間。
位於處理器晶片上的L1快取訪問速度跟訪問寄存器的速度幾乎一樣快,L2快取通過一條特殊的匯流排串連到CPU,訪問速度比L1慢5倍左右,但比訪問主存要快5-10倍。更新的系統還會有L3快取,他們都是用一種SRAM的硬體技術實現的。這樣,系統就可以獲得很大的一Block Storage器,而且訪問速度也很快。
程式具有訪問局部地區裡的資料和代碼的趨勢。通過將可能經常訪問的資料儲存在快取中的方法,大部分的儲存空間操作都將在快速的快取中完成,程式效能大大提升。
作業系統管理硬體
在處理器中,指令集結構是對實際處理器硬體的抽象,在作業系統中,檔案是對I/O的抽象,虛擬儲存空間是對程式儲存空間的抽象,進程是對一個正在啟動並執行程式的抽象,虛擬機器則是對整個電腦(包括作業系統,處理器和程式)的抽象
進程
進程是作業系統中對一個正在啟動並執行程式的一個抽象。一個系統可以同時運行多個進程程式,而每個進程都好像獨佔使用硬體。並發運行則是說一個進程的指令和另一個進程的指令是交錯啟動並執行。
線程
一個進程可以由多個線程組成,每個線程運行在進程的上下文中,並共用同樣的代碼和全域資料。
虛擬儲存空間
虛擬儲存空間是一個抽象概念,為每個進程提供一個假象,即每個進程好像在獨佔使用主存。每個進程看到的是一致的儲存空間,即是虛擬位址空間。圖中的地址是從下往上增大。
- 程式碼和資料:對所有進程來說,代碼都是從同一固定地址開始,接著就是全域變數對應的資料位元置。代碼和資料區一開始運行就已經規定大小。
- 堆:堆可以啟動並執行時候動態地擴充和收縮,比如調用malloc或free函數的時候。
- 共用庫:大約在地址中間,用來存放像C標準庫或數學庫這樣共用程式碼和資料區域。
- 棧:位於使用者虛擬位址空間頂部的是棧,編譯器同它來實現函數調用。和堆一樣,在程式運行期間可以動態地擴充和收縮。每調用函數,棧增長,函數返回,棧收縮。
-
深入理解電腦系統學習筆記(一)