1. 程式人生 > >通過C語言HelloWord程序對計算系統理解

通過C語言HelloWord程序對計算系統理解

lin 數據並行 stdio.h 設備 相對 () 根據 malloc 並行

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程序對計算系統理解