作業系統的虛擬記憶體

weixin_33938733發表於2017-07-23

計算機系統中的RAM資源有限,由系統上執行的進行競爭共享。當系統執行的多個應用程式時,所有程式分配的記憶體總量會超過系統上RAM的數量,這是很常見的一種情況。

作業系統支援虛擬記憶體,這樣程式就可以分配和使用比系統上安裝的RAM數量還要多的記憶體。也就是說,程式的空間地址不受物理RAM數量的限制。有了虛擬記憶體,作業系統便可以使用次級儲存器(如硬碟)上的後備儲存空間,儲存無法放到RAM中的程式的地址空間。然而,CPU仍然只能訪問RAM中的地址,因此,作業系統必須在磁碟後備儲存空間和RAM之間交換資料,以便能夠在程式執行時訪問記憶體。

在特定的時刻,程式可能只是需要使用分配的總記憶體的小部分,我們稱之為程式的工作集。只要作業系統將這一工作儲存到RAM中,就可以忽略虛擬記憶體對執行速度的影響。工作集是一個動態實體,根據程式執行時當前使用的資料而變化。

如果程式訪問RAM外部的記憶體地址,則需要從硬碟的後備儲存中讀取對應的資料,放到RAM中。如果當前沒有空閒的RAM使用者資料載入,就需要預先將RAM中現存的一些資料換出並儲存到磁碟,釋放物理RAM。

虛擬記憶體由作業系統處理。使用者程式並不參與這一過程的實現。他不用關心地址空間是否在RAM中,也不用關心訪問的資料是否轉移到了主存中。

使用虛擬記憶體的後果是,程式使用的地址與物理RAM的地址並不對應。只要想一想程式地址空間比RAM大,你就明白了。因此,需要將程式讀寫的地址從程式的虛擬地址空間轉換成物理的RAM地址。由於訪問每個記憶體都要進行地址的轉換,為了減少對執行速度的影響,這些工作全都是CPU執行的。

作業系統一般使用一種稱為“分頁”的方案,來實現虛擬地址到實體地址的轉換。使用分頁記憶體方案時,實體記憶體被劃分偉固定長度的塊,稱為(^-^)頁幀。大多數作業系統,包括mac OS 和 iOS,使用的幀長度均為4096位元組。類似的,每個程式的虛擬地址空間也都可以被劃分為固定長度的塊,稱之為頁。每頁的位元組數與每幀的位元組數始終相同。這樣便可以將程式中的每頁對映到實體記憶體中的一個幀裡。

5423383-e7930e4966e55ead.png
程式地址空間中的頁可以對映到記憶體中的任意頁幀

虛擬記憶體的另一個優點是,程式虛擬地址空間中頁碼連續的緩衝區,可以分佈到實體記憶體中多個不連續的幀裡。這就解決了實體記憶體的碎片問題,因為一個程式分配的記憶體可以分佈到多個實體記憶體段,

相關文章