關於《深入理解計算機系統》
老趙的這一番話,深深的觸動了我,確實,這本書用怎麼說呢,並不是深入,而是涉及的知識比較廣,但又都是廣大程式猿不得不知道的知識,下面我們就來慢慢品嚐這本書吧。工作之餘,學習學習,總是好的。言歸正傳,接下來,享讀《computer systems: a programmer』s perspective》的中hello world程式都幹了些啥。
1.資訊在計算機的中表示
當我們輸入以下程式,編譯執行,計算機從螢幕輸出hello, world。整個過程計算機都怎麼運作的呢?
#include int main()
printf(「hello, world\n」);
我們知道,資訊在計算機中都是用0或1表示的。計算機通過這些位資訊以及上下文來解讀這些0/1。也即:計算機中的資訊=位+上下文。
我們輸入的hello程式就是由0、1組成的序列,將這些位8位組織成乙個位元組,每個位元組用來表示乙個文字字元。ascii碼給出了一種字元與數字的一一對應關係。
hello, world程式以位元組方式存放於檔案中,如下圖所示。其每個字元對應乙個數字,具體可參考ascii碼表。
圖1 hello world程式的ascii碼表示
2.將程式翻譯成機器可讀的格式
因為我們輸入的hello, world程式是人可讀的,機器並不能直接識別它們。我們需要把這些文字翻譯成機器可執行的二進位制檔案。這一部分的工作是由編譯系統完成的。編譯系統由預處理器、編譯器、彙編器、聯結器四部分組成。以hello, world程式為例,各部分共同完成將原始檔編譯成二進位制可執行檔案。各個部分完成的具體工作如下:
l 預處理器:根據以#開頭的命令,修改源程式。如根據#include 行,預處理器讀取系統標頭檔案stdio.h中的內容,代替此行內容。源程式經過預處理後,得到另乙個c程式,此程式通常以.i為字尾儲存。
l 編譯器:將預處理後的.i檔案轉換成匯程式設計序。編譯器將不同的高階語言(如c語言,c++語言)轉換成嚴格一致的組合語言格式進行輸出。組合語言以標準的文字格式確切的描述每機器語言指令。編譯器得到的檔案通常以.s為字尾儲存。
l 彙編器:將組合語言(.s檔案)翻譯成機器語言指令,並將這些指令打包成一種可定位目標程式格式。彙編後得到的檔案即為二進位制檔案,通常以.o為字尾。
l 鏈結器:hello, world程式中呼叫過printf函式,它是乙個c標準庫里的函式。printf函式存放在乙個名為printf.o的單獨預編譯的檔案中。而這個檔案必須以適當的方式併入到我們的程式中,這個工作由鏈結器完成。將外部的.o檔案併入後,得到乙個完整的hello, world可執行檔案。可執行檔案載入到儲存器後,由系統複製執行。
圖2 編譯系統
在linux系統上,輸入編譯命令列:
viidiot>gcc hello.c -o hello
將執行上圖所示的四個步驟,得到可執行二進位制檔案hello。
3.處理器讀取並解釋儲存在儲存器中的指令
shell:命令列直譯器,為使用者提供了乙隻與系統打交道的方式。它等待使用者的輸入,當使用者輸入一行命令後,shell先判斷它是不是乙個shell內建命令,如果不是,shell會假定使用者輸入為乙個可執行檔案的名字,從而去載入並執行該檔案。因此,當我們通過編譯系統將原始檔編譯成可執行二進位制檔案後,在shell中輸入我們得到的可執行二進位制檔名,shell將其從磁碟中載入到儲存器(注:我們的可執行檔案是存放在磁碟上的),並通過處理器進行解釋執行,得到最終的結果,輸出到終端(顯示器)上進行顯示。自此,我們的hello, world程式完成了其生命週期。
4.計算機系統硬體結構
為了弄清楚hello, world執行時,系統究竟發生了什麼,我們先來了解下乙個典型的計算機硬體結構。
圖3 典型的計算機硬體構成
【cpu:**處理器 alu:算術/邏輯運算單元 pc:程式計數器 usb:統一序列介面】
下面簡單說一下各個部件在系統中所起的作用。
匯流排:在各個部件之間傳輸資料。現在的匯流排寬度一般為32位或者64位,即一次傳輸的資料為4位元組或者8位元組。
i/o裝置:io裝置是系統與外界通訊的通道,如滑鼠,鍵盤,顯示器都是典型的io裝置。
主儲存器:簡稱主存,是處理器執行程式時用於臨時存放程式及其資料。主存由一組動態隨機儲存器晶元組成。
處理器的操作主要是圍繞pc、alu、主存來進行運作的。處理器首先從pc所指向的主存儲存單元讀取指令,解釋指令中的位,執行該指令指示的簡單操作,然後更新pc暫存器,使其指向下一條要執行的指令。cpu會執行的操作有:
載入:把乙個位元組或乙個字從主存複製到暫存器,覆蓋掉暫存器中原來的值。
儲存:把乙個位元組或乙個從暫存器複製到主存,並覆蓋主存中原來的值。
操作:把兩個暫存器的內容複製到alu,alu對兩個字做算術運算後存回其中的乙個暫存器,該暫存器中原來的值會被覆蓋。
在了解了一些基本的硬體結構,以及各個部分的作用後,我們再來看看之前的hello, world程式的執行過程。
圖4 載入可執行檔案到主存的過程
在linux系統下,我們在shell中敲入以下命令
viidiot>./hello
由於shell沒有內建hello命令,因此shell將我們輸入的hello視為乙個可執行檔案,從而通過執行一系列機器指令,將可執行檔案hello從磁碟複製到主存,如圖4所示。
注意,如果通過dma方式引導程式,則不需要通過cpu,而是將hello可執行檔案直接從磁碟複製到主存,示意圖如圖5。
圖5 dma方式引導程式到主存
可執行程式載入到主存後,cpu就執行hello程式的機器指令,而這些指令完成的工作便是將」hello,world\n」這幾個字元從主存中複製暫存器檔案中(register file),再將其從寄存寄檔案中複製到顯示裝置上進行顯示。過程示意圖如圖6所示。
圖6 cpu執行指令,將 「hello,world\n」從記憶體複製到顯示裝置
至此,hello,world程式的執行過程已經完成。
題外話:
從上面的程式例項我們可以看到,程式花費了大量的時間將資料從乙個部件複製到另外乙個部件。程式載入時,將hello程式的機器指令從磁碟複製到主存,程式執行時,又將其從主存複製到cpu,最後又從cpu複製到外部顯示器。將根據機械原理,大容量的儲存裝置速度比小容量儲存裝置慢,快速裝置的造價比慢速裝置的造價高。對於計算機硬體系統,cpu的速度遠高於主存的速度,而主存的速度遠高於磁碟,不同部件的速度嚴重不對等,從而快的裝置的效能沒能得到充分發揮。為解決各類裝置速度不匹配的問題,引入了快取記憶體裝置來緩解速度匹配問題。如圖7所示,為加入了快取記憶體後的系統部分結構。
圖7 快取記憶體儲存器
現代計算機為提高系統效能,一般都加入了多級快取結構。快取記憶體取樣的是靜態隨機儲存器硬體(sram)技術,速度快於主存(取樣動態隨機儲存器技術)。如圖8是儲存器結構金字塔,越往上速度越快,造價也更昂貴。
圖8 儲存器金字塔
計算機原理
計算機 實質是資料儲存和資料流動 資料是儲存在磁碟上的,磁碟是由磁顆粒點組成,磁顆粒點可以帶電,帶電是1,不帶電是0,磁碟上有保護膜,不直接與空氣接觸,乙個磁顆粒點就是1bit,1b 8bit,資料傳輸就是傳輸電平 1t 8 9萬億顆粒點 對顆粒點需要管理,機械盤內部有很多光碟,顆粒點在光碟的正反兩...
計算機組成原理cu 計算機組成原理 計算機概論
現代計算機樣式千奇百怪,常見的有我們的筆記本,台式電腦,也有各種伺服器 手機 攝像頭等都屬於計算機範疇。計算機包含我們看得見摸得著的計算機實體,稱為計算機硬體,如cpu 記憶體 各種掛接裝置等 還有我們看不見摸不著的軟體,它支援著硬體按照我們的預想在操作,包括系統軟體和應用軟體 計算機硬體樣式千奇百...
計算機原理 硬碟原理
簡介 硬碟作為現在計算機內部最後的機械儲存部件,速度相比較記憶體和cache而言會慢好幾個數量級。但所幸的是,硬碟的成本是遠遠低於記憶體的。因此硬碟作為永久儲存器是比較合適的,所幸的是為了克服硬碟慢速帶來的問題,作業系統會對硬碟的使用有乙個優化,下面讓我們先來看硬碟的原理。乙個典型的硬碟如圖所示,網...