1. 程式人生 > >第一章 計算機系統漫遊(1.5-1.7)

第一章 計算機系統漫遊(1.5-1.7)

1.5快取記憶體

☆原理:較大的儲存裝置要比較小的儲存裝置執行的慢,而快速裝置的造價遠高於同類的低速裝置。

☆舉例:暫存器檔案儲存幾百位元組的資訊,而主存可以存放幾十億位元組。然而,處理器從暫存器檔案中讀一個字的時間開銷要比主存中讀取要快100倍。

☆措施:針對處理器與記憶體之間的差異,出現了快取記憶體器(cache memory)作為暫時的集結區域,存放處理器近期可能需要的資訊。訪問速度的提高還有一個原因:程式具有訪問區域性區域裡的資料和程式碼的趨勢。

1.6處理裝置形成層次結構

在這裡插入圖片描述 儲存器層次結構的主要思想是上一層的儲存器作為低一層的高階快取。

1.7作業系統管理硬體

所有應用程式對硬體的操作嘗試都必須通過作業系統。

作業系統功能: ☆防止硬體被失控的應用程式濫用。 ☆嚮應用程式提供簡單一致的機制來控制複雜而又通常大不相同的低階硬體裝置。

抽象:檔案是對I/O裝置的抽象表示;虛擬記憶體是對主存和磁碟I/O裝置的抽象表示,程序則是對處理器、主存和I/O裝置的抽象表示。

1.7.1程序

程序是對作業系統對一個執行的程式的一種抽象。

☆併發執行:多個程序指令交錯執行。無論是在單核還是多核系統中,一個CPU看上去都像是併發地執行多個程序,這是通過處理器在程序間切換來實現的。作業系統實現這種交錯執行的機制稱為上下文切換。

☆上下文:作業系統保持跟蹤程序執行所需的所有狀態資訊。這種狀態就是上下文,包括:程式計數器和暫存器檔案的當前值,以及主存的內容等等。在任何一個時刻,單核處理器系統都只能執行一個程序的程式碼。當作業系統決定把控制權從當前程序轉移到某個新程序時,就會進行上下文切換,即儲存當前上下文、恢復新程序的上下文,然後將控制器傳遞到新程序。

☆例項場景:shell程序和hello程序。最開始,只有shell程序在執行,即等待命令列上的輸入。當我們讓它執行hello程式時,shell通過呼叫一個專門的函式,即系統呼叫來執行我們的請求,系統呼叫會將控制權傳遞給作業系統。作業系統儲存shell程序的上下文,建立一個新的hello程序以及上下文,然後將控制權傳給新的hello程序。hello程式終止後,作業系統恢復shell程序的上下文,並將控制權交給它,shell程序繼續等待下一個命令列輸入。(從一個程序到另一個程序的轉換是由作業系統的核心(kernel)管理的。核心是作業系統程式碼常住主存的部分。當應用程式需要作業系統的某些操作時,比如讀寫檔案,它就執行一條特殊的系統呼叫指令,將控制權傳遞給核心然後核心執行被請求的操作並返回應用程式。核心是系統管理全部程序所用程式碼和資料結構的集合)。 在這裡插入圖片描述

1.7.2執行緒

程序可以由一個也可以由多個執行緒執行單元組成,每個執行緒都執行在程序的上下文中,並共享同樣的程式碼和全域性資料。由於網路伺服器中對並行處理的需求,執行緒成為越來越重要的程式設計模式,因為多執行緒比多程序更容易共享資料,執行緒比程序更高效。

1.7.3虛擬記憶體

它為每個程序提供一個假象,即每個程序都在獨佔地使用主存,每個程序看到的記憶體都是一致的,稱為虛擬地址空間。Linux程序的虛擬地址空間如圖: 在這裡插入圖片描述 Linux中,地址空間最上面的區域是保留給作業系統中的程式碼和資料的,這對所有程序來說都是一樣。地址空間的底部區域存放使用者定義的程式碼和資料,地址從下往上增大。

每個程序看到的虛擬地址空間由大量準確定義的區域構成,每個區都有專門的功能: ☆程式資料和程式碼:對所有的程序來說,程式碼是從同一固定地址開始的,緊接著是C全域性變數相對應的資料位置。程式碼和資料區是直接按照可執行檔案的內容初始化的。

☆堆:程式碼和資料區後緊隨執行時堆,程式碼和資料區在程序一開始執行時就被指定了大小,而當呼叫malloc和free這樣的C標準庫函式時,堆可以在執行時動態地擴充套件和收縮。

☆共享庫:大約在地址空間的中間一部分一塊用來放C標準庫和書序庫這樣的共享程式碼和資料的區域。

☆棧:位於使用者虛擬地址頂部的是使用者棧,編譯器用它實現函式的呼叫。和堆一樣,使用者棧可以在程式執行過程中動態地擴充套件和收縮。每呼叫一個函式時,棧就好增長;從一個函式返回時,棧就會收縮。

☆核心虛擬記憶體。地址空間頂部的區域為核心保留。不允許應用程式讀寫這個區域的內容或者直接呼叫核心程式碼定義的函式,但是可以通過呼叫核心來執行這些操作。虛擬記憶體的運作需要硬體和作業系統軟體直接精密複雜的互動,包括對處理器生成的每個地址的硬體翻譯。基本思想是把一個程序虛擬記憶體的內容儲存在磁碟上,然後用主存作為磁碟的快取記憶體。

1.7.4檔案

檔案就是位元組序列。每個I/O裝置,包括磁碟、鍵盤、顯示器,甚至網路,都可以看做檔案。系統中的所有輸出輸入都是通過使用一小組Unix I/O系統函式呼叫讀寫檔案來實現的。