深入理解計算機系統(2) 計算機系統漫遊

2022-01-29 01:38:51 字數 2944 閱讀 7620

這一節的內容有些枯燥,很多內容都是文字描述。但是對於後續的學習是有幫助的,一些概念提前有個簡單的了解多少會有些幫助。

這一節的學習內容都是一些概念和知識的簡要介紹,沒有過多地深入,旨在為後續學習做個鋪墊。

上文最後部分提到,計算機內部執行程式時,用到了很多複製的操作,此處為鏈結。從程式設計師的角度來說,這些複製操作就是開銷,占用了程式執行的一部分時間。因此,系統設計者的乙個主要目標就是減少這些複製操作所用的時間。

根據機械原理,容量大的裝置要比容量小的裝置執行速度慢。磁碟可能比主存大1000倍,但就處理器而言,對主存訪問資料的時間開銷要比對磁碟小1000萬倍。主存和暫存器之間也有類似的結論。於是人們想出一種方法:在處理器和乙個又大又慢的裝置(例如主存)之間插入乙個更小更快的儲存裝置(主要是快取記憶體)。實際上,每個計算機系統中的儲存裝置都被組織成了乙個儲存器層次結構。如下圖所示

在這個結構中,從上到下,裝置容量越來越大,執行速度越來越慢,同時造價也越來越便宜。

儲存器層次結構的主要思想是上一層的儲存器作為下一層儲存器的快取記憶體。上圖中頂層的暫存器是l1的快取記憶體,l1是l2的快取記憶體,以此類推。

從這個角度講,程式設計師可以利用對整個儲存器層次結構的理解來提高程式的效能。

計算機系統的分層檢視如下所示

可見,是作業系統進行對硬體的管理,並與應用程式進行互動。

以hello程式為例,當shell載入和執行hello world程式,以及由該程式輸出訊息時,shell和hello程式都沒有直接訪問鍵盤、記憶體和磁碟、顯示器。它們只是使用了作業系統提供的服務。作業系統是應用程式和硬體的「中間人」,負責管理硬體,並給應用程式提供介面,所有應用程式對硬體的操作嘗試都要經過作業系統。

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

防止硬體被失控的應用程式濫用;

向應用程式提供簡單一致的機制來控制複雜的低階硬體裝置。

作業系統通過幾個抽象的基本概念(程序、虛擬儲存器和檔案)來實現以上兩個基本功能。如下圖所示,

圖中,檔案是對i/o裝置的抽象表示,虛擬儲存器是對主存和磁碟i/o裝置的抽象表示,程序是對處理器、主存和i/o裝置的抽象表示。(再高一級就是虛擬機器,把作業系統也進行了抽象表示)

下面分別介紹這幾個基本概念。

像hello這樣的程式在現代作業系統上執行時,作業系統會提供一種假象,即好像作業系統上只有這個程式在執行,只有這個程式在使用處理器、主存和i/o裝置。這種假象是通過程序的概念來實現的。

程序是作業系統對正在執行的程式的一種抽象。乙個系統上可以同時執行多個程序,每個程序好像獨佔的使用硬體。所謂併發,是說乙個程序的指令和另乙個程序的指令交錯執行。作業系統實現這種交錯執行的機制稱為上下文切換。

作業系統跟蹤程序執行所需的所有狀態資訊(也就是上下文),任何乙個時刻,處理器只能執行乙個程序。當作業系統決定要把控制權從當前程序轉移到乙個新程序時,就要進行上下文切換,即儲存當前程序的上下文,恢復新程序的上下文,然後將控制權轉交給新程序,新程序就從上次停止的地方開始執行。以hello程式為例,併發的過程如下所示

圖中有兩個併發的程序:shell(程序a)和hello程式(程序b)。起初只有shell程式在執行,等待命令輸入;當我們讓它執行hello程式時,shell通過呼叫乙個專門的函式(系統呼叫)來執行我們的請求;系統呼叫將控制權交給作業系統,作業系統儲存shell程序的上下文,建立hello程序及其上下文,然後將控制權轉交給hello程序;hello程序終止後,作業系統回覆shell程序的上下文,把控制權轉交給它,然後shell程序繼續等待下一條命令輸入。

在現代作業系統中,乙個程序可以由多個稱為執行緒的執行單元組成。每個執行緒都執行在程序的上下文中,並共享同樣的**和全域性資料。後續會詳細討論。

虛擬儲存器為每個程序提供了乙個假象,好像每個程序在獨佔的使用記憶體。每個程序看到的是一致的儲存器,稱為 虛擬位址空間。如圖所示為linux程序的虛擬位址空間,

圖中位址從下往上是增大的。這裡先簡單了解一下每個區(從下往上)。

程式**和資料:對於所有的程序來說,**是從同一固定位址開始,緊接著的是和c全域性變數對應的資料位置。**和資料區是直接按照可執行目標檔案的可執行內容進行初始化的,這裡 也就是hello程式。

堆          :**和資料區後緊隨著執行時堆。**和資料區是在程序一開始執行時就固定了大小,而堆可以在執行時動態地擴充套件和收縮。

共享庫      :大約在位址空間的中間位置放置像c標準庫和數學庫等共享庫的**和資料。

棧         :位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現系統呼叫。與堆一樣,執行時棧的大小可動態地擴充套件收縮。

核心虛擬儲存器:核心總是駐留在記憶體中,是作業系統的一部分。

檔案就是位元組序列。每個i/o裝置都可以視為檔案。

從單個系統來看,網路就相當於乙個i/o裝置。如下圖所示

系統從主存複製一些位元組到網路介面卡,資料流經過網路到達另一台機器。相似地,系統也可以讀取其他機器的資料,複製到自己的主存上去。

以hello程式為例,利用telnet通過網路遠端執行hello程式的過程,如下圖所示

以上就是本次的學習總結,後面的記錄將會更加深入的學習每一部分。

深入理解計算機系統 計算機系統漫遊

第一章 計算機系統漫遊 計算機系統是由硬體和系統軟體組成的。所有計算機系統都是由相似的硬體和軟體組成,它們又執行著相似的功能。以hello程式為例。1.1資訊就是位 上下文 hello程式的生命是從源程式 原始檔 開始的。源程式是程式設計師編寫的,hello.c。源程式是 0和1 的位元位,8個一組...

深入理解計算機系統之計算機系統漫遊

我帶著乙個要成為程式設計大牛的理想,下定決心開始看 深入理解計算機系統 這本書了。由於正在讀研究生,沒有全力去看這本書,更新速度比較慢。但是,這是乙個起點,我相信也不是乙個終點。應該帶著目標去學習。我們就以解決問題為導向開始著手這件事。文章記錄一些我比較關心的知識點。越來越發現,書中的圖才是精華。能...

深入理解計算機系統 計算機系統漫遊

1 程式編譯階段 以hello world 程式為例,介紹計算機系統的基本組成結構和程式的編譯過程。include int main 該程式的執行經歷這樣乙個過程 源程式首先經預處理器處理 將 include中的內容插入到源程式中,得到另乙個程式hello.i 編譯階段 hello.i程式經過編譯,...