程式設計師視角的計算機系統 1.7 作業系統管理硬體
回顧我們的你好程式的例子。當外殼程式載入和執行你好程式時,當你好程式列印了它的訊息
的時候,程式根本沒有直接讀取鍵盤,顯示器,磁碟,記憶體中的任何乙個。然而,它們依賴操作
系統提供的服務。我們能夠認為作業系統介於應用程式和硬體之間的一層軟體,如圖1。10所示
乙個應用程式要操作硬體的所有的嘗試必須通過作業系統。
作業系統有兩個主要的目標,1是保護硬體避免執行的應用的誤操作。2是為應用提供乙個簡單
和統一的操作機制,儘管底層的硬體裝置是各種各樣的。作業系統通過 基礎的抽象實現了這
兩個目標。如圖1。11所示:
程序,虛擬記憶體,和檔案。正如 這個圖所示,檔案是輸入與輸出裝置的抽象,虛擬記憶體是記憶體與
磁碟輸入與輸出裝置的抽象,程序是處理器,記憶體和輸入與輸出裝置的整體性的抽象 。我將
乙個乙個地輪流討論它們。
1.7.1 程序
在乙個現代的系統上,當乙個程式例如你好在執行時,作業系統提供了乙個假相,程式是執行在
系統上的唯一的乙個。程式似乎獨佔了處理器,記憶體,和輸入輸出裝置。處理器似乎執行了程式
中的指令,一條接一條指令,沒有中斷。程式中的**和資料似乎是系統的記憶體中的唯一的物件。
程序的概念提供了這些假相,在電腦科學中,這是最重要和成功的思想之一。
對於乙個執行中的程式,乙個程序是作業系統為它進行的抽象。多個程序能夠併發地執行在同乙個
系統中,每個程序似乎獨佔硬體的使用權。通過併發,我們意味著乙個程序的指令與另乙個程序的
指令交織在一起。在大多數的系統中,程序數比執行它們的處理器的數量更多。傳統的系統在乙個時刻
僅能執行乙個程式,然而,最新的多核處理器,能夠同時執行多個程序。在每乙個情況下,乙個單獨的
**處理器似乎能夠併發地執行多個程序,通過處理器在多個程序之間進行切換。作業系統執行這個機制
上的交織,叫做上下文切換。為了簡化這個討論的其它部分,我們認為乙個單處理器的系統僅包含乙個
處理器。在1.9.1部分中我們將再討論多處理器的系統。
為了執行程序,作業系統保持了對程序需要的所有的狀態資訊的跟蹤。這個狀態,叫做上下文,包括了
資訊,例如程式計數器的當前的值,暫存器檔案,記憶體的內容等。在任何乙個時間點,乙個單處理器僅
能夠執行乙個單獨的程序的**。當作業系統決定把控制權從乙個程序轉移到其它的程序時,它執行乙個
上下文的切換,這個切換的操作是儲存當前的程序的上下文,恢復新的程序的上下文,然後把控制權給
新的程序。當新的程序離開時,它也是如此精確地操作。如圖1.12的顯示,我們的例子你好的基本的思想。
在我們的例子中,有兩個併發的程序存在:外殼程序和你好程序。剛開始時,外殼程序單獨地執行著,等待
命令列上的輸入。當 我們要求它執行你好程式時,外殼執行了我們的請求,它是通過乙個特定的函式,這
個特殊的函式,叫做系統呼叫,它把控制權交給了作業系統。作業系統儲存了外殼的上下文,建立了乙個
新的你好程序和它的上下文,然後把控制權交給了新的你好程序。你好終止執行之後,作業系統恢復了外殼
程序的上下文,把控制權交給了外殼程序,外殼程序繼續等待著下乙個命令列的輸入。
實現程序的抽象需要底層的硬體與作業系統的軟體進行密切的配合。在第8章中,我們
將探索這是如何工作的,應用如何能夠建立和控制它們自己的程序。
1.7.2 執行緒
儘管我們常常認為乙個程序作為乙個單獨的控制流,但是在乙個現代的系統中,乙個程序實際上
能夠由多個執行單元組成,這種執行單元叫做執行緒,每個執行緒執行於程序的上下文之中,它們分享
相同的**和全域性的資料。因為網路伺服器的並行的需求,因為在多執行緒之間比多程序之間更容易
分享資料,因為執行緒一般比程序更加地高效,執行緒成為一種日益重要的程式設計模型。當多個處理器可
供使用之時,多執行緒也是使得程式執行更快的一種方法,在1.9.1部分中,我們將討論這個內容。
在第12章中,你將學習並行的基本的概念,包括如何寫執行緒的程式。
1.7.3 虛擬記憶體
虛擬記憶體是乙個抽象,它提供給每個程序乙個假相,讓程序以為是獨佔記憶體的使用權。每個程序
對於記憶體有乙個相同的統一的視角,這就是虛擬位址空間。對於linux的程序而言,虛擬位址空間
如圖1.13所示(其它的unix系統使用了相似的布局) 在linux中,位址空間的最頂層區域在為了在
作業系統中的對所有的程序而言共同的資料和**保留的。位址空間的更低的區域儲存了使用者的
程序的**和資料。注意的是,在圖中的位址的增長是從底部向上的。
每個程序看到的虛擬位址空間由一系列的定義好的區域組成,每個都有特殊的目的。在本書中,
你將學習到關於這些區域的更多的知識,但你在每個部分都簡單地看一下是有幫助的,從最低的
位址開始,向上看:
程式的**和資料:對於所有的程序,**開始於相同的固定的位址,它緊隨著全域性c變數的資料
位址。在我們的你好例子中,從可執行的目標檔案直接地初始化為**和資料區域。在第7章中,
當我們學習和研究鏈結和載入時,你將學習關於位址空間的部分的更多的知識。
堆 **和資料直接緊隨著執行時的堆。不像**和資料區,一旦程序開始執行,有固定的大小,
在執行時,堆的大小動態地增長和收縮,正如呼叫c標準**庫的程式malloc,free的結果 。在
第9章中,我們學習管理虛擬記憶體時,我們將在細節上研究堆的使用。
共享**庫 在位址空間的中端附近是乙個區域,它儲存共享**庫的資料和**,例如c標準
**庫和數學庫。乙個共享的**庫的概念是乙個強有力的但是稍微有點難度的概念。在
第7章中,我們學習動態鏈結時,我們將學習它們是如何工作的。
棧 在使用者的虛擬位址空間的頂層是使用者的棧,編譯器用它來實現函式呼叫,像堆一樣,隨著
程式的執行,使用者的棧的大小動態的增長和收縮。在特定的情況下,我們每次呼叫函式,棧都
增長。我們每次從乙個函式返回,棧都收縮。在第3章中,你能學習到編譯器是如何使用棧的。
核心虛擬記憶體 記憶體是作業系統 的一部分,它常駐記憶體。位址空間的頂層是為記憶體預留的區域。
應用程式不能讀寫這個區域的內容,或者是直接呼叫在定義在核心**中的函式。
對於虛擬記憶體的工作,乙個在硬體與作業系統 之間要求複雜的互動操作,包括由處理器生成
的每個位址的硬體上的翻譯。在磁碟上,乙個處理器的虛擬記憶體的儲存內容的基本思想,然後
使用記憶體作為磁碟的緩衝。在第9章中,解釋了這是如何工作的,對於現代的系統而言,這種
操作是為什麼如何重要。
1.7.4 檔案
乙個檔案是位元組們的序列,什麼也不多,什麼也不少。每個輸入輸出裝置,包括磁碟,鍵盤,
顯示器,甚至是網路,都被建模為乙個檔案。在系統中的所有的輸入和輸出都通過讀寫檔案
來執行,使用系統呼叫的乙個很小的集合,叫做unix 輸入與輸出。
乙個檔案的簡單的優雅的表示毫無疑問是非常強有力的,因為它提供給應用關於在系統中包括
的各種不同的輸入與輸出裝置的乙個統一的視角。例如,應用程式的程式設計師來操縱 乙個磁碟的
內容,可以不用關心特定的磁碟技術。進而,相同的程式將執行在不同的作業系統上,可以使用
不同的硬碟技術。在第10章中,你將學習到unix的輸入與輸出技術。
程式設計師視角的計算機系統 2 1 2 字
程式設計師視角的計算機系統 2.1.2 字 每個計算機都有乙個字的大小,顯示出整數和指標資料的名義上的大小。因為乙個虛擬位址 被這樣的乙個字進行編碼,字的大小確定的最重要的系統引數是虛擬位址空間的大小。也就是 對於乙個機器而言,乙個w位長的字大小,虛擬位址的範圍是從0到2 w 1,程式能讀取的最多 ...
程式設計師視角的計算機系統 1 5 緩衝問題
程式設計師視角的計算機系統 1.5 緩衝問題 從這個簡單的例子上的乙個重要的課程是乙個系統花費了大量的時間來把資訊從乙個地方 移到另乙個地方。在你好程式中的機器指令剛開始時儲存在磁碟中。當程式被載入時,它 們被複製到記憶體中。當處理器執行程式時,指令從記憶體複製到處理器中。相似的是,資料 字串 he...
程式設計師視角的計算機系統 第一章 計算機系統 之旅
程式設計師視角的計算機系統 第一章 計算機系統 之旅 乙個計算機系統由硬體和系統軟體組成,硬體和軟體一起工作來執行應用程式。系統的特定的實現隨時間的流逝而改變,但是它的本質性的概念不會改變。所有的計算機系統都有相似的硬體和軟體元件來執行相似的功能。這本書為程式設計師 而寫,程式設計師們需要在他們的工...