深入理解計算機系統 第九章 虛擬記憶體
為了更加有效地管理記憶體並且少出錯,現代系統提供了一種對主存的抽象概念,叫做虛擬記憶體(VM)。
虛擬記憶體提供了三個重要的能力:
(1)它將主存看成是一個儲存在磁碟上的地址空間的告訴快取,在主存中只儲存活動區域,並根據需要在磁碟和主存之間來回傳送資料,通過這種方式,它高效地使用了主存
(2)它為每個程序提供了一致的地址空間,從而簡化了記憶體管理
(3)它保護了每個程序的地址空間不被其它程序破壞
虛擬記憶體在工作中,不需要程式設計師做任何干涉,但是程式設計師還是需要理解它,原因如下:
(1)虛擬記憶體是核心的
虛擬記憶體遍及計算機系統的所有層面,在硬體異常、彙編器、連結器、載入器、共享物件、檔案和程序的設計中扮演著重要角色。理解虛擬記憶體將幫助我們更好地理解系統通常是如何工作的。
(2)虛擬記憶體是強大的
虛擬記憶體給予應用程式強大的能力,可以建立和小灰記憶體片、將記憶體片對映到磁碟檔案的某個部分,以及與其他程序共享記憶體。比如,你知道可以通過讀寫記憶體位置讀或者修改一個磁碟檔案的內容嗎?或者可以載入一個檔案到記憶體中,而不需要進行任何顯示地複製嗎?理解虛擬記憶體將幫助你利用它的強大功能在應用程式中新增動力
(3)虛擬記憶體是危險的
每次應用功能程式引用一個變數、間接引用一個指標,或者呼叫一個諸如 malloc 這樣的動態分配程式時,它就會和虛擬記憶體發生互動。如果虛擬記憶體使用不當,應用將遇到複雜危險的與記憶體有關的錯誤。例如,一個帶有錯誤指標的程式可以立即崩潰於“段錯誤”或者“保護錯誤”,它可能在崩潰之前還默默地運行了幾個小時,或者最令人驚慌地,執行完成卻產生不正確的結果。理解虛擬記憶體以及諸如 malloc 之類的管理虛擬記憶體的分配程式,可以幫助你避免這些錯誤。
地址空間的概念很重要,因為它清楚地區分了資料物件(位元組)和它們的屬性(地址)。一旦認識到了這種區別,那麼我們就可以將其推廣,允許每個資料物件有多個獨立的地址,其中每個地址都選自一個不同的地址空間。這就是虛擬記憶體的基本思想。主存中的梅子姐都有一個選自虛擬地址空間的虛擬地址和一個選自實體地址空間的實體地址。
概念上而言,虛擬記憶體被組織為一個由放在磁碟上的 N 個連續的位元組大小的單元組成的陣列。梅子姐都有一個唯一的虛擬地址,作為到陣列的索引。磁碟上陣列的內容被快取在主存中。和儲存器層次結構中其他快取一樣,磁碟(較低層)上的資料被分隔成塊,這些塊作為磁碟和主存(較高層)之間的傳輸單元。VM 系統通過將虛擬記憶體分割為稱為虛擬頁的大小固定的塊來處理這個問題。每個虛擬頁的大小為 P=2^p 位元組。類似地,實體記憶體被分割為物理頁,大小也為 P 位元組(物理頁也成為頁幀)。