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

2022-05-05 17:15:08 字數 2895 閱讀 3978

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

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

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

預處理階段

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

編譯階段

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

彙編階段

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

鏈結

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

優化程式效能

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

理解鏈結時出現的錯誤

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

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

linux> ./hello
來執行程式

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

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

匯流排

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

io裝置

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

主存

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

處理器

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

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

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

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

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

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

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

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

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

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

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

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

執行緒級併發

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

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

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

指令級並行

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

單指令,多資料並行

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

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

計算機系統是由硬體和系統軟體組成的,他們共同工作來執行應用程式。深入理解底層計算機系統以及它對應用程式的影響有助於提高程式的效能。1.1 資訊就是位 上下文 源程式實際上就是乙個由值0和1組成的位序列。程式是由文字字元表示的,8個位被組織成一組,成為位元組,每個位元組表示為程式中的文字字元。文字字元...

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

本著對計算機執行原理的好奇以及個人職業發展的需要,開始閱讀這本書。以下分節記錄讀書筆記 1.1 資訊就是位 上下文 計算機系統中存放的所有資訊都是由一串位元 bit 表示的,但值得注意的是,同樣的位元資訊在不同的上下文中所代表的意思是不同的。在這裡,我們可以將 上下文 理解為對位元資訊的解讀方式。每...

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

1 本章從乙個程式的生命週期講起,分別對程式的建立 編譯 執行 輸出 終止進行了詳細的解讀,從中引出了關於資訊上下文 編譯系統 快取記憶體 作業系統等重要概念。網上找到一張框架圖 2 乙個程式的生命週期是從源程式開始的,通過編譯器建立並儲存的文字檔案。源程式實際上是乙個由0和1組成的位序列,又叫做位...