通過C語言HelloWord程序對計算系統理解
HelloWord程序C語言代碼
#include<stdio.h>
void main(){
printf("HelloWord\n");
}
要了解一個helleword程序的運行,首先要知道一個計算系系統的基本組成部分:
1.中央處理單元CPU
包括程序計數器(PC).寄存器文件,算術/邏輯運算器(ALU)高速緩存
程序計數器是一個字長的存儲設備(也叫寄存器),程序計數器永遠指向主存中某個的機械語言指令(也就是含有有該指令的地址)。
寄存器文件是有一些很小的由一個字長組成寄存器組成。每個寄存器都有唯一的名字。
算術/邏輯運算器主要計算新的數據和地址。
從計算機通電開始CPU就在不停的執行PC中的指令並更新PC,使其指向下一個地址。處理器看上去是由一個非常簡單是指令模型來操作的,這個模型由指令集決定。處理器的操作是圍繞PC,寄存器文件,主存,ALU來進行的。
加載:將一個字節或者一個字從主存中復制到寄存器中,覆蓋寄存器中的內容。
存儲:將寄存器中的一個字節或字復制到主存的某個位置中,覆蓋主存中原來的內容。
操作:將兩個寄存器中的值復制到ALU中。ALU對著兩個值進行運算在將得到的結果復制到一個寄存器中,覆蓋原來的內容。
轉跳:從指令中抽取一個字,復制到PC中,覆蓋PC中的值。
2.總線
總線是連接計算機所有部位的通道,傳送一個固定長度的字節塊,這樣的一個字節塊的大小叫做字長,我現在用的操作系統就是8個字節組成的64位操作系統。
3.I/O設備
I/O設備通過控制器(主板芯片)和適配器與字長相連。如硬盤。
4.主存
主存物理上是由許躲動態隨機存儲器(DRAM)芯片組成,邏輯上是一個線性數組字節,每個字節有唯一的地址(數組索引)。
一個HelloWord程序的運行首先需要通過編譯器進行編譯,編譯分為4個階段:
1.預處理階段,預處理器根據以#開頭的命令修改HelloWord程序。將<stdio.h>加入到HelloWord程序中。一般文件用.i結尾。HelloWord.i
2.編譯階段,將修改過的程序變為匯編語言。文件以.o結尾。HelloWord.o
3.匯編階段,將匯編語言轉化為二進制,文件以.s結尾,HelloWord.s
4.連接階段,連接C語言自己自帶的函數,如HelloWord程序中的printf函數,printf存在於一個單獨編譯好的目標文件中。連接之後HelloWord程序將變成一個二進制文件,也是可執行文件。
HelloWord程序運行時,外殼程序將其讀入到寄存器中,再把它存放在存儲器中。處理器開始執行HelloWord程序中的main指令。指令將“HelloWord”字符串從主存復制到寄存器。然後顯示到顯示器上。
進程
進程是對一個正在運行的程序的抽象。是對CPU,虛擬存儲器,文件的抽象。一個系統可以運行多個進程,他們之間的切換時通過上下文來進行的。
線程
進程並非只有一個單一的控制流,它是通過多種叫做線程的執行單元來實現的。
虛擬出存儲器
它為進程提供了一個假象,即每個進程單獨占用主存。每個進程看到的都會一致的存儲器,稱為虛擬存儲空間。Linux的虛擬存儲空間包括如下
程序代碼和數據區:對於所有進程來說,代碼是從一個固定地方開始的,緊接著是和C全局變量相對應的數據位置。代碼和數據區是按可執行文件初始化的。
堆:代碼和數據區後面跟著運行時堆,代碼和數據區一開始就被規定的大小。而堆不同,比如當調用malloc和free這樣的C標準函數時,堆可以動態的擴大和縮小。
共享庫:大約在數據的中心位置。存放像C語言中的標準庫和數學庫這樣共享庫的數據和代碼。共享庫概念強大難懂。
棧:實現函數調用,調用時擴大,函數返回時收縮。
內核虛擬存儲器:內核總是駐留在內存中,是操作系統的一部分,是為內核保留的,不允許應用程序讀寫和調用代碼定義的函數。
文件就是字節序列。
線程可以並發進行,多線程(超線程)處理器。
指令集並行。指令放在流水線上執行。
單指令、多數據並行。
通過C語言HelloWord程序對計算系統理解