深入理解計算機系統 第一章 計算機系統漫遊
- 2021 年 1 月 9 日
- 筆記
- 深入理解計算機系統筆記
第一章 計算機系統漫遊
1.1 信息就是位+上下文
系統中的所有信息,包括磁盤文件,內存中的程序,內存中存放的用戶數據以及網絡上傳送的數據,都是由一串比特表示的。區分不同數據對象的唯一方法是我們讀到這些數據對象的上下文。
1.2 程序被其他程序翻譯成不同格式
一個程序的生命周期是從一個高級C語言程序開始的,為了能在系統上運行該程序,每條語句都必須被其他程序轉換成一系列低級機器語言,然後這些指令按照可執行目標程序的格式打包好,並以二進制文件的形式存儲起來。得到可執行目標文件。
這個翻譯過程可歸為四個階段,預處理,編譯,彙編,鏈接,四個階段構成了編譯系統。
預處理階段
預處理器根據預編譯指令,對C程序進行文本替換。得到.i文件。
編譯階段
編譯器將.i翻譯成.s,得到一個彙編語言程序。C語言和Fortran編譯器產生的輸出文件都是一樣的彙編語言。
彙編階段
將.s文件翻譯成機器語言指令,並打包成可重定位目標程序,把存在目標文件.o中。.o是二進制文件。
鏈接
C語言頭文件中中的函數存在了預編譯好的目標文件,因此該階段將調用的函數合併到我們的.o文件中,得到可執行目標文件。該文件可以被加載到內存中由系統執行。
1.3 了解編譯系統如何工作的益處
-
優化程序性能
我們需要了解一些機器代碼以及編譯器如何將C轉換為機器代碼的方式。不同循環語句的比較,switch和ifelse的比較等。
-
理解鏈接時出現的錯誤
-
避免安全漏洞,如緩衝區溢出等
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 並發和並行
-
線程級並發
構建在進程抽象之上,我們能夠設計出同時有多個程序執行的系統,這就導致了並發。自20世紀60年代出現時間共享以來,計算機系統就開始有了對並發執行的支持,但只是簡單的使任務按時間切換。這種配置稱為單處理器系統。
後來隨着多核處理器,超線程的出現,我們廣泛使用了多處理器系統,將多個CPU(核)集成到集成電路芯片上,每個核都有自己的L1和L2緩存,而共用L3緩存.
而超線程技術則允許一個核並行執行多個控制流。在使用超線程的核中,程序計數器核寄存器有多個備份,共用其他資源。
-
指令級並行
在CPU中,使用流水線技術來極大加快指令的執行。如果指令速度快於一周期一條,則可成為超標量處理器。
-
單指令,多數據並行
許多處理器擁有特殊的硬件,允許一條指令產生多個並行的數據操作。如SIMD指令可以並行加法,通常需要在編程時顯式聲明。