一篇神文讓你深入理解計算機系統——學習筆記

計算機系統漫遊

先看一段程式碼:

#includeint main(){ printf(“Hello, world\n”); return 0;}

讓我們看看這段程式的組成,以及它是如何執行的

程式組成

一篇神文讓你深入理解計算機系統——學習筆記

可以看到,這段程式是以位元組序列的方式儲存在檔案中的,每個位元組都有一個整數值,對應某些字元,這就是ASCII碼

只由ASCII碼組成的檔案稱為文字檔案,其餘檔案稱為二進位制檔案

程式編譯過程

像hello。c這樣的高階語言寫出來的程式,雖然能讓人看懂,但卻無法在系統上直接執行。為了能讓系統也讀懂這段程式碼,需要對該程式碼進行多次轉換

一篇神文讓你深入理解計算機系統——學習筆記

預處理階段

預處理器(cpp)根據以字元#開頭的命令,修改原始的C程式,主要是將讀取的系統標頭檔案stdio。h中的內容插入到程式文字中。所得的另一個C程式以。i作為副檔名

編譯階段

編譯器(cll)將hello。i程式翻譯為組合語言,翻譯後的檔案以。s作為副檔名。這裡只放出main函式的組合語言:組合語言為不同的高階語言的不同編譯器提供了通用的輸出語言

彙編階段

彙編器(as)將hello。s程式翻譯為機器語言指令,並將其打包成

可重定位目標程式

的格式,並將結果儲存在hello。o中。這是一個二進位制檔案

連結階段

因為hello程式中呼叫了printf函式,這是標準C語言庫中的一個函式,存在與一個名為printf。o的單獨的預編譯好了的檔案中。為了呼叫此函式,就必須將這個檔案以某種方式合併到我們的程式中,聯結器(ld)就負責處理這種合併。最終得到的hello檔案,就是一個可執行檔案,可以被載入到記憶體中,由系統使用

系統的硬體組成

一篇神文讓你深入理解計算機系統——學習筆記

匯流排

貫穿整個系統的一組點句子管道,攜帶資訊位元組並負責在各個部位間傳遞。通常被設計為傳送定長的位元組塊

I/O 裝置

I/O(輸入/輸出)裝置時系統與外部世界的聯絡通道,如作為輸入裝置的鍵盤滑鼠,作為輸出裝置的顯示器等。透過控制器與介面卡與I/O匯流排相連

主存

一個臨時儲存裝置,用於存放程式和程式處理的資料

處理器

中央處理單元(CPU)簡稱處理器,是解釋(或執行)儲存在主存中指令的引擎處理器的核心是一個大小為一個字的儲存裝置(或暫存器),稱為程式計數器(PC)。PC會一直指向主存中的某條機器語言指令,並進行執行CPU執行指令的過程圍繞著主存,暫存器檔案(register file)和算術/邏輯單元(ALU)進行。暫存器檔案是一個小的儲存裝置,由一些單個字長的暫存器組成,且每個暫存器都有唯一的名字。ALU則計算新的資料和地址值CPU大致能夠執行以下一些操作:載入:從主存複製一個位元組或者一個字到暫存器,覆蓋暫存器原來的內容儲存:從暫存器複製一個位元組或者一個字到主存中的某個位置,覆蓋該位置上原本的內容操作:把兩個暫存器的內容複製到ALU,ALU對這兩個字做算術運算 ,並將結果存放到一個暫存器中跳轉:從指令本身中抽取一個字,將這個字輔助到PC中,覆蓋PC原本的值等等

程式執行過程

接下來我們看看hello程式在執行過程中都發生了什麼:

若我們要在Unix系統中執行hello程式,就需要將程式的檔名輸入到一個名為shell的應用程式中

我們在鍵盤上輸入“。/hello”字串後,shell程式將字元逐一讀入暫存器,再將其存放到記憶體中

一篇神文讓你深入理解計算機系統——學習筆記

當我們敲下回車鍵時,shell程式就知道我們已經結束了命令的輸入,shell會執行一系列指令載入可執行的hello檔案。這些指令將hello目標檔案中的程式碼和資料從磁碟複製到主存。這裡利用了

直接儲存器存取(DMA)

技術,讓資料可以不透過處理器而直接從磁碟到主存

一篇神文讓你深入理解計算機系統——學習筆記

目標檔案hello中的程式碼和資料被載入到主存後,處理器就開始執行hello程式的main函式中的機器語言指令。這些指令將“hello, world\n”字串中的位元組從主存複製到暫存器檔案,再從暫存器檔案中複製到顯示裝置,最終顯示在螢幕上

一篇神文讓你深入理解計算機系統——學習筆記

抽象

檔案是對I/O裝置的抽象,虛擬記憶體是對主存和I/O裝置的抽象,程序是對處理器,主存和I/O裝置的抽象

程序

程式執行時系統看上去總是隻有這個程式在執行,就好像這個程式獨佔了CPU,主存和I/O裝置。但執行程式的數量總比CPU數量多,這是由

上下文切換

實現的

在任何一個時刻,單處理器系統都只能執行一個程序的程式碼。當作業系統決定要把控制權從當前程序轉移到新程序時,就會發生

上下文切換

。CPU會不斷切換正在執行的程序,給人CPU在併發地執行多個程序的感覺

執行緒

現代系統中,一個程序可以由多個稱為

執行緒

的執行單元組成。每個

執行緒

都執行在程序的上下文中,並共享程式碼和全域性資料

虛擬記憶體

虛擬記憶體提供了一個假象:每個程序都在獨佔地使用主存。每個程序看到的記憶體都是一致的,稱為

虛擬地址空間

每個程序看到的虛擬地址空間都由大量準確定義地區構成,每個區都有專門的功能。

一篇神文讓你深入理解計算機系統——學習筆記

檔案

檔案就是位元組序列,每個I/O裝置,包括磁碟,鍵盤,顯示器,甚至網路,都可以看成是檔案。

檔案嚮應用程式提供了一個統一的檢視,來讓程式可以在使用不同磁碟技術的不同系統上執行