1. 程式人生 > 實用技巧 >深入理解計算機系統 第一章 計算機系統漫遊

深入理解計算機系統 第一章 計算機系統漫遊

第一章 計算機系統漫遊

1.1 資訊就是位+上下文

系統中的所有資訊,包括磁碟檔案,記憶體中的程式,記憶體中存放的使用者資料以及網路上傳送的資料,都是由一串位元表示的。區分不同資料物件的唯一方法是我們讀到這些資料物件的上下文。

1.2 程式被其他程式翻譯成不同格式

一個程式的生命週期是從一個高階C語言程式開始的,為了能在系統上執行該程式,每條語句都必須被其他程式轉換成一系列低階機器語言,然後這些指令按照可執行目標程式的格式打包好,並以二進位制檔案的形式儲存起來。得到可執行目標檔案。

這個翻譯過程可歸為四個階段,預處理,編譯,彙編,連結,四個階段構成了編譯系統。

預處理階段

前處理器根據預編譯指令,對C程式進行文字替換。得到.i檔案。

編譯階段

編譯器將.i翻譯成.s,得到一個組合語言程式。C語言和Fortran編譯器產生的輸出檔案都是一樣的組合語言。

彙編階段

將.s檔案翻譯成機器語言指令,並打包成可重定位目標程式,把存在目標檔案.o中。.o是二進位制檔案。

連結

C語言標頭檔案中中的函式存在了預編譯好的目標檔案,因此該階段將呼叫的函式合併到我們的.o檔案中,得到可執行目標檔案。該檔案可以被載入到記憶體中由系統執行。

1.3 瞭解編譯系統如何工作的益處

  1. 優化程式效能

    我們需要了解一些機器程式碼以及編譯器如何將C轉換為機器程式碼的方式。不同迴圈語句的比較,switch和ifelse的比較等。

  2. 理解連結時出現的錯誤

  3. 避免安全漏洞,如緩衝區溢位等

1.4 處理器讀並解釋儲存在記憶體中的指令

當程式被編譯完成後,我們可通過shell指令

linux> ./hello

來執行程式

1.4.1 系統的硬體組成

為了理解執行hello程式時發生了什麼,我們需要了解系統的硬體組織。

這是一張近期Intel產品族的模型

匯流排

貫穿於整個系統的電子管道,攜帶資訊位元組並負責在各個部件間傳遞。匯流排傳輸的數是個重要的系統引數。

IO裝置

IO裝置是系統與外部的聯絡通道,每個IO裝置通過控制器或介面卡與IO匯流排相連。控制器和介面卡的差別在於他們的封裝方式。控制器是IO裝置本身或系統的主印刷電路板,介面卡是插在主機板插槽上的卡。

主存

主存用來存放程式和資料,由DRAM構成。按位元組編址。

處理器

處理器按照指令模型來操作,該模型由指令集架構決定。指定按照嚴格的順序執行,並更新PC暫存器。

1.4.2 執行hello程式

shell將hello檔案載入到記憶體中,通過dma技術,檔案可以直接從磁碟到記憶體,不經過cpu。

hello程式將字串中的位元組從主存複製到暫存器,再從暫存器複製到顯示裝置,輸出到磁碟。

1.5 快取記憶體至關重要

如上的簡單示例說明了一個重要問題,計算機會經常進行IO操作。這些開銷減慢了程式執行的速度。因此係統設計者的一個重要目標就是使IO操作儘快完成。

處理器與主存之間存在著巨大的速度差距,並且還在一直擴大。針對這種差異,系統設計者採用了更小更快的高速緩衝儲存器作為暫時儲存。L1快取記憶體通常可達數萬位元組,訪問速度幾乎和訪問暫存器一樣快。通過該方案,能讓記憶體操作基本都在快取中完成,基於程式區域性性原理。

1.6 儲存器的層次結構

計算機的各儲存部件間形成了層次結構,底層速度快,造價高,容量小,高層相反。通過該層次結構,就可以用高層的價格和容量,達到底層的速度。

1.7 作業系統管理硬體

當我們執行程式時,程式並沒有直接訪問計算機硬體,而是通過作業系統提供的服務來訪問。我們可以把作業系統看作是應用程式和硬體之間插入的一層軟體。

作業系統有兩個基本功能:

防止硬體被應用程式濫用,嚮應用程式提供簡單一致的機制來控制硬體裝置。作業系統通過幾個抽象服務來實現,如程序,虛擬記憶體,檔案等。

1.8 系統之間利用網路通訊

現代系統經常通過網路和其它系統連線到一起,網路可視作一個IO裝置,資料流可以通過網路直接發給另一臺機器,不經過本地磁碟,也可通過網路直接讀取資料到主存中。

1.9 重要主題

1.9.1 Amdahl定律

對系統的某一部分加速時,其對系統整體效能影響取決於該部分的重要性和加速程度。

由此可知,想要顯著加速整個系統,必須提升全系統中相當大部分的速度

1.9.2 併發和並行

  1. 執行緒級併發

    構建在程序抽象之上,我們能夠設計出同時有多個程式執行的系統,這就導致了併發。自20世紀60年代出現時間共享以來,計算機系統就開始有了對併發執行的支援,但只是簡單的使任務按時間切換。這種配置稱為單處理器系統。

    後來隨著多核處理器,超執行緒的出現,我們廣泛使用了多處理器系統,將多個CPU(核)整合到積體電路晶片上,每個核都有自己的L1和L2快取,而共用L3快取.

而超執行緒技術則允許一個核並行執行多個控制流。在使用超執行緒的核中,程式計數器核暫存器有多個備份,共用其他資源。

  1. 指令級並行

    在CPU中,使用流水線技術來極大加快指令的執行。如果指令速度快於一週期一條,則可成為超標量處理器。

  2. 單指令,多資料並行

    許多處理器擁有特殊的硬體,允許一條指令產生多個並行的資料操作。如SIMD指令可以並行加法,通常需要在程式設計時顯式宣告。