1. 程式人生 > >虛擬記憶體(Virtual Memory,VM)和交換檔案(Pagefile,PF)

虛擬記憶體(Virtual Memory,VM)和交換檔案(Pagefile,PF)

在保護模式下,Win32 程式可以定址 2GB 或 3GB 虛擬記憶體,對每一個程序來說,它定址的範圍都是這麼多。OS 負責把程序提交的虛擬記憶體按頁(一頁 4KB,工作集)對映到實體記憶體的實際頁幀上(駐留集)。如果設定了硬碟上的交換檔案(Pagefile.sys),那麼 OS 也會在實體記憶體和交換檔案之間交換記憶體頁,不活動的程序,它的虛擬記憶體頁會被從實體記憶體中交換到硬碟上,等它活動的時候再交換回來(分頁)。所以,如果設定了硬碟上的交換檔案,而實體記憶體不足(對映所有的虛擬記憶體頁)的時候,電腦就會頻繁將實體記憶體裡的頁和硬碟進行交換。如果沒有設定硬碟上的交換檔案,實體記憶體不足(對映所有的虛擬記憶體頁)的時候電腦就會告訴你“虛擬記憶體不足了”。

如果設定了硬碟上的交換檔案,Windows 總是會將不太活動的程序的記憶體頁交換到那裡去。對於一個程序來說,它在實體記憶體中對映的駐留集少於它想要的工作集,就會引發分頁而降低效率。對於實體記憶體相當大的電腦,除非需要執行會檢查硬碟上的交換檔案的程式,否則可以取消硬碟上的交換檔案。比如早期的 PhotoShop,那個時候的電腦,記憶體比較小,所以會強制要求啟用硬碟上的交換檔案。新版本的 PhotoShop 沒有這個強制檢查,你可以分配幾十 GB 實體記憶體給它用(x64 的版本)。

虛擬記憶體的使用總量是所有工作集的綜合,因此它包括了分頁到硬碟的部分,如果有的話。值得注意的是,共享的 DLL 只使用自己一部分工作集,雖然幾個程序使用了它,但由於 Windows 允許程序間共享頁幀,所以用工作管理員檢視記憶體使用的時候,要注意這個方面的區別。而且,工作管理員檢視記憶體使用顯示的是已經提交的虛擬記憶體,如果程序沒有提交,是不會告訴你的。





PF使用率是290M,是不是這290M存在硬碟?
實體記憶體使用率是362M,這指的是消耗的實際記憶體?
這290M和362M有沒有交叉?

PF 就是指 Pagefile,即啟用在硬碟上的交換檔案,它用了 290MB;PM 用了 362MB,總共提交的就是 652MB,其中 PM 的 362MB 就是駐留集,而整個工作集有 290MB 在硬碟,如果有一個程序試圖訪問自己的資料,但正好它不在駐留的 362MB 裡面,就會引發分頁,系統會到硬碟的 290MB 裡面去尋找,然後把它拿出來 --- 如果實體記憶體很寬裕,拿出來就是拿出來了;如果實體記憶體很緊張,就會先把一部分其它程序的駐留集分頁到硬碟再說。

你可以開啟工作管理員選擇列中的“分頁錯誤”,看看每一個程序的分頁錯誤是多少,這個錯誤反映了這個程序在記憶體管理器排程下,和硬碟交換的頻繁程度。值得注意的是,微軟在這裡又發顛了,這個資料應該分為軟錯誤和硬錯誤,軟錯誤是指程序的工作集提交變大,記憶體管理器不得不分配新的可用記憶體,但此時不會和硬碟發生頁交換(只是記憶體和記憶體發生了頁交換);而硬錯誤就是沒有實體記憶體可以頁交換了,只能和硬碟交換。微軟統計的是兩個的合。

轉載自:http://hi.baidu.com/dzlxue/blog/item/d203a618f3b9d2bc4aedbc82.html