虛擬記憶體

虛擬記憶體(英語:Virtual memory)是電腦系統主記憶體管理的一種技術。它使得應用程式認為它擁有連續可用的主記憶體(一個連續完整的地址空間),而實際上實體記憶體通常被分隔成多個主記憶體碎片,還有部分暫時儲存在外部磁碟記憶體上,在需要時進行數據交換。與沒有使用虛擬記憶體技術的系統相比,使用這種技術使得大型程式的編寫變得更容易,對真正的實體記憶體(例如RAM)的使用也更有效率。此外,虛擬記憶體技術可以使多個行程共用同一個執行庫,並通過分割不同行程的主記憶體空間來提高系統的安全性。

要注意的是,虛擬記憶體不只是「用磁碟空間來擴充實體記憶體」的意思——這只是擴充主記憶體級別以使其包含硬碟機而已。把主記憶體擴充到磁碟只是使用虛擬記憶體技術的一個結果,它的作用也可以通過覆蓋或者把處於不活動狀態的程式以及它們的數據全部交換到磁碟上等方式來實現。對虛擬記憶體的定義是基於對地址空間的重定義的,即把地址空間定義為「連續的虛擬記憶體地址」,以藉此「欺騙」程式,使它們以為自己正在使用一大塊的「連續」地址。

那些需要快速存取或者響應時間非常穩定的嵌入式系統,以及其他的具有特殊應用的電腦系統,可能會為了避免讓運算結果的可預測性降低,而選擇不使用虛擬記憶體。

用途與實現

虛擬記憶體技術是現代電腦系統結構中不可分割的一部分。現代所有用於一般應用的作業系統都對普通的應用程式使用虛擬記憶體技術,例如文書處理軟件,電子製表軟件,多媒體播放器等等。大部分架構通過CPU中獨立的硬件主記憶體管理單元來輔助實現這一功能。部分仿真器虛擬機器也能夠通過宿主系統中的硬件來提高效能。[1]老一些的作業系統,如DOS和1980年代的Windows[2],或者那些1960年代的大型電腦,一般都沒有虛擬記憶體的功能——但是Atlas英語Atlas_(computer)B5000英語Burroughs_large_systems#B5000蘋果公司Lisa都是很值得注意的例外。

Intel 80286開始,X86指令集通過保護模式引入了虛擬記憶體技術,但是由於其使用的記憶體分段技術對大主記憶體段的支援不佳,後續的80386在分段技術框架下支援了主記憶體分頁技術。

Windows作業系統的虛擬記憶體

對於32位元行程,其邏輯主記憶體空間為4G。Windows API提供了一套函數操縱行程的虛擬記憶體:

  • VirtualAlloc(PVOID開始地址,SIZE_T大小,DWORD主記憶體類型,DWORD保護屬性)。 主記憶體類型有MEM_RESERVE(保留)、MEM_RELEASE(釋放)和MEM_COMMIT(提交)。保留是指佔用一塊邏輯地址空間,但未實際分配實體記憶體;提交是實際分配實體記憶體。MEM_RESET用於把主記憶體清零。 保護屬性為: PAGE_NOACCESS、PAGE_READONLY、PAGE_READWRITE、PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE。
  • VirtualProtect(PVOID基地址,SIZE_T大小,DWORD新保護屬性,DWORD舊保護屬性)。更改保護屬性。
  • VirtualFree(PVOID基地址,SIZE_T大小,DWORD主記憶體類型)。頁面釋放。主記憶體類型是MEM_DECOMMIT或者MEM_RELEASE
  • VirtualLock
  • VirtualUnlock
  • VirtualQuery

參見

參考資料

  1. ^ AMD-V™ Nested Paging (PDF). AMD. [28 April 2015]. (原始內容 (PDF)存檔於2022-03-21). 
  2. ^ Windows Version History. Microsoft. 2005-07-19 [2008-12-03]. (原始內容存檔於2015-02-26).