虛擬記憶體(virtualmemory)是windows管理所有可用記憶體的方式。對於32位windows系統,每個程序所用到的虛擬記憶體位址從0到2^32-1,總容量4gb,其中2gb是與作業系統以及其他所有程序所共享,另外2gb分派給程序獨佔(這就是常說的32位windows中乙個程序最多能用2g記憶體的由來)。
4gb虛擬位址空間(virtual addressspace,vas)中,2gb的程序獨佔vas是程序隔離的,換句話說,每個程序都可以從ram或者硬碟上對映到屬於自己的2gbvas。所以雖然32位windows每個程序最多只能獲得4gb可用虛擬記憶體,但是所有程序總和可以使用總量超過4gb的虛擬記憶體。可惜xp只支援4gb ram,也就是說超出部分一定得靠頁面檔案補足;而比如2003企業版通過pae支援32gbram,可以減少頁面檔案的用量。(但單個程序最多仍然只有4gb虛擬記憶體位址空間,而不是32gb)
所以,乙個簡單的計算示例:三個程序最多能用掉多少vas?
2gb(共享)+2gb(獨佔)×3=8gb
這4gb的虛擬位址空間,按照4kb的大小進行分頁(page),然後以頁為單位對映到實際儲存單元中,包括:
·物理記憶體(ram)
·頁面檔案(page file,在win9x中稱為交換檔案swap file,即win386.swp)
·其他檔案自身(比如一些長時間未活動的程序的exe檔案自身)
可見,通常人們所說的虛擬記憶體實際上只是指其中的頁面/交換檔案而已,這是對虛擬記憶體的乙個錯誤的理解。虛擬記憶體≠頁面檔案
ram中除了儲存最近讀寫的檔案快取(filecache,相當於win9x中的vcache)主要用來儲存正在使用的程式**和資料,當ram資源緊張,或者有程式碼或資料長時間未使用時,xp通常會將非活躍程式碼所在的位址頁對映回程式檔案(exe、dll等),將資料所在的位址頁對映到頁面檔案(pagefile.sys)中並拷貝資料,然後將它們本來占用的ram空間釋放。這個過程稱為頁出(page out)。
當系統讀取某個虛擬記憶體位址,而該位址所在的頁不在ram中時,將產生乙個頁面錯誤(pagefault)中斷,告訴系統從頁面檔案或者程式檔案中取回包含該位址的虛擬記憶體頁,即將內容拷回到ram並建立新的虛擬位址對映,並將頁面檔案中對應部分標記為未使用,這個過程就是頁入(page in)。頁入成功的話就是乙個valid page fault,否則就是invalid pagefault。前者非常普遍,(可以在任務管理器的程序頁監視到)而後者是由程式或硬體錯誤引起,如果發生在程序上會導致非法操作,如果是系統自身則很可能藍屏。
記憶體用量可以在任務管理器的效能頁中看到。其中物理記憶體的總量、可用數等是指安裝的ram容量和剩餘ram容量,而記憶體使用(2000下的正確翻譯,m注)或者提交更改(xp下的錯誤翻譯,m注)的總量和限制是指虛擬記憶體的commit limit和committedbytes,可以理解成系統可以使用的虛擬記憶體總量和當前使用量,其中總量是由ram大小+頁面檔案大小決定的。
而在任務管理器的程序頁中,「記憶體使用」和「虛擬記憶體大小」造成的誤解很多,而實際上,這兩個值是對應效能監視器中該程序的workingset和private bytes,workingset是指乙個程序的4gb虛擬位址空間中被對映到ram中的部分的大小,通常是該程序的虛擬記憶體中的活躍部分。表面看來這個表述和「程序占用的ram大小」沒有太大區別,但至少有兩種情況導致了例外的發生:第一種是這部分虛擬記憶體如果是屬於2g的系統共享虛擬記憶體,那麼它對映到的ram位址可能和其他程序有重複,計算多個程序占用ram總和就不正確,使得所有程序的workingset之和比實際占用ram要大。第二種是乙個程序中可能有同一段ram內容的多個引用,比如乙個檔案被loop多次,此時虛擬空間中會有多段位址被對映到同一段ram上,從而造成該程序的working set比實際占用ram要大。
private bytes是乙個程序的2gb獨佔虛擬位址空間中用到的部分的大小,無論這部分是在ram中還是在頁面檔案中,甚至是在exe、dll等檔案中。所以,任務管理器程序頁中的虛擬記憶體絕對不反映pagefile.sys的用量。
所以,任務管理器無論是程序頁還是效能頁都不能直接反映pagefile的使用情況,諸如「關掉pagefile還能看到虛擬記憶體」之類的疑問,應該很清楚了。
(再次抱怨一下windows中文版糟糕的專業術語翻譯,m注)
下面是乙個簡單圖示,兩個程序,各自擁有2g獨佔vas,共同擁有2g共享vas,w代表對映到ram中的部分(working set),p代表頁出的部分。
0 …………………2gb獨佔vas………………… 2g ………2gb共享vas……… 4g
程序1 |-----pppp------------ww-----pppp--------|
||
|| --pppppppppppp--wwwwwwww--|
|| |||| | ||||||||||| ||||||||
(exe2磁碟exe1) ramemory pagefile | 共享核心/dll等 共享ram空間
|||| |||| || |
程序2 |-pppp-----------wwww---------pp----p----|
然後,任務管理器的程序頁中的「記憶體」就是上圖中的w,所以所有程序的記憶體項加起來肯定比實際用的ram大,因為有共享部分此外還有重複引用。而任務管理器程序頁中的「虛擬記憶體」就是上圖中左半部分,「獨佔vas」。可見pagefile只是其中的一部分,而ram,只要用於獨佔vas,一樣計入了該處「虛擬記憶體」。
最後,實際的頁面檔案用量(pagefile.sys中實際使用部分),可以在效能監視器中看到,即paging file下的% usage和%usage peak配合當前pagefile.sys的大小就可以計算出位元組數,這個值可以做為設定頁面檔案最小值的乙個參考,而不是用任務管理器程序頁的所有程序的虛擬記憶體大小相加做為頁面檔案最小值的參考。
虛擬記憶體,物理記憶體,頁面檔案,還有任務管理器
虛擬記憶體 virtual memory 是windows管理所有可用記憶體的方式。對於32位windows系統,每個程序所用到的虛擬記憶體位址從0到2 32 1,總容量4gb,其中2gb是與作業系統以及其他所有程序所共享,另外2gb分派給程序獨佔 這就是常說的32位windows中乙個程序最多能用...
物理記憶體 頁面檔案 交換區和虛擬記憶體
物理記憶體,顧名思義,就是實實在在存在的那個東西,插在你電腦主機板上的記憶體條所提供的空間。頁面檔案,這個是硬碟上的一塊空間,在windows下表現為乙個檔案。這個頁面檔案存在的意義就是在物理記憶體被占用滿以後,將物理記憶體中的東西移動到硬碟上的這個空間,騰出物理記憶體給需要的應用程式來使用。交換區...
記憶體管理 物理記憶體 虛擬記憶體
記憶體管理 物理記憶體 pc上有三條匯流排,分別是資料匯流排 位址匯流排和控制匯流排。32位的cpu的定址能力為4gb 2 32 個位元組。使用者最多 可以使用4gb的真實的物理記憶體。記憶體管理 虛擬記憶體 windows的所有程式 包括ring0層和ring3層的程式 可以操作的都是虛擬記憶體。...