2010-03-17 58 views
2

我正在玩MSDN示例進行內存壓力測試(請參閱:http://msdn.microsoft.com/en-us/magazine/cc163613.aspx)以及該工具的擴展吃物理記憶(見http://www.donationcoder.com/Forums/bb/index.php?topic=14895.0;prev_next=next)。雖然虛擬和物理內存之間的差異讓我感到困惑。我認爲每個進程都有2GB的虛擬內存(儘管我也因爲「開銷」而讀取了1.5GB。我的理解是這個虛擬內存中的一些/全部/沒有可能是物理內存,以及物理內存的數量進程可能會隨着時間而改變(內存可能會換成光盤等)我進一步認爲,一般來說,當您分配內存時,操作系統可能會使用物理內存或虛擬內存,因此我總結dwAvailVirtual應該始終如果我的問題沒有很好地形成,我很抱歉,我仍然在努力,但是,我經常(總是)看到相反的結果。讓我的頭腦在Windows中的整個內存管理系統中得到解決。教程/說明/書籍recs是最受歡迎的!爲什麼在Windows Vista上調用GlobalMemoryStatus中的可用物理內存(dwAvailPhys)>可用虛擬內存(dwAvailVirtual)x64

安德魯

回答

1

虛擬內存量受地址空間大小的限制 - 每個進程在32位系統上的大小爲4GB。您必須從中減去爲系統使用保留的區域大小以及進程已經使用的虛擬機數量(包括映射到其地址空間的所有庫)的大小。另一方面,物理內存總量可能高於系統爲您的進程騰出的虛擬內存空間量(現在通常是這些天)。

這意味着如果您的存儲空間超過〜2GB或RAM,則無法在一個進程中使用所有物理內存(因爲沒有足夠的虛擬內存空間來映射它),但它可以被多個流程。請注意,該限制在64位系統中被刪除。

+0

啊!我想我錯過了一些基本的東西,而你(懶鬼)似乎正在指出它。 dwAvailVirtual是否指向該進程的可用內存,而dwAvailPhys是指整個系統的可用RAM?那麼通常dwAvailPhys> dwAvailVirtual會有意義。這個過程幾乎可以用完所有的2GB(或4GB?),但是仍然有大量的物理內存可用(用於其他進程)。 謝謝,Andrew – Dave 2010-03-17 23:19:05

+0

另外,你說每個進程在32位系統上獲得4GB 。然後你提到2GB?每個進程的限制是什麼?什麼是外行的解釋?32位如何轉換爲4GB? 謝謝 – Dave 2010-03-17 23:21:01

+0

就是這樣。每個進程都有自己的虛擬內存空間,而物理內存(顯然)是由整個系統共享的,一個32位的數字可以有2^32 = 4G的不同值,如果它被用作字節地址,這意味着它可以尋址4G不同的字節,現在它的一部分保留給內核使用,並且內核地址不能用於用戶代碼,在Win32上,默認情況下是2GB的地址空間 - 在第二個地址空間剩下2GB e應用程序。 – slacker 2010-03-18 18:17:54

2

這只是在過去的日子,當內存昂貴的時候。操作系統根據需要將虛擬內存頁面映射到RAM。如果沒有足夠的RAM來滿足程序的請求,它將開始取消映射頁面以騰出空間。如果這樣的頁面包含數據而不是代碼,它將被寫入分頁文件。只要程序再次訪問該頁面,它就會產生一個分頁錯誤,讓操作系統從磁盤讀回頁面。

如果機器內存很少,消耗虛擬內存頁面的進程很多,那麼可能會引起非常不愉快的效果,稱爲「抖動」。操作系統不斷訪問磁盤,機器性能變慢。

更多的RAM意味着更少的磁盤訪問。沒有理由不在32位操作系統上使用3 GB或4 GB的RAM,它很便宜。即使你沒有使用全部4 GB,但由於在地址總線上佔用空間的硬件設備(主要是視頻),並非全部都是可尋址的。但是這不會改變用戶代碼可訪問的虛擬內存的大小,它仍然是2千兆字節。

Windows Internals是一本很好的書。

+0

謝謝。將購買Windows內部。 – Dave 2010-03-17 20:51:51

+0

在32位機器上,2 GB VA限制是每個進程。我提出這個問題是因爲一個普遍的誤解是它跨越了所有的過程。因此,只要涉及多個進程,用戶代碼就可以利用超過2 GB的優勢。還有一個/ 3GB的Windows操作系統啓動開關,使這個限制爲3GB,而不是... – 2010-03-18 03:55:24

1

我不知道這是不是你的問題,但MSDN page for the GlobalMemoryStatus function包含以下警告:

在有超過4 GB的內存的計算機上,GlobalMemoryStatus函數可以返回不正確的信息,報告值爲-1表示溢出。因此,應用程序應該使用功能代替。

此外,該網頁說:

在具有超過2 GB和小於4 GB的內存英特爾的x86計算機上,GlobalMemoryStatus功能將始終在dwTotalPhys返回2 GB成員MEMORYSTATUS結構。同樣,如果總可用內存在2到4 GB之間,那麼MEMORYSTATUS結構的成員將向下取整爲2 GB。如果使用鏈接器選項將可執行文件鏈接起來,那麼函數將返回兩個成員中正確數量的物理內存。

既然你指的是像dwAvailPhys代替ullAvailPhys成員,這聽起來像您使用的是MEMORYSTATUSEX結構的MEMORYSTATUS結構,而不是。我不知道在64位平臺上會有什麼後果,但是在32位平臺上肯定會導致報告不正確的內存大小。

+0

謝謝丹尼爾。我在MSDN上看到了這一點,並且已經注意到了這一點。但是,我不認爲這會影響我。警告說,dwAvailPhys membor可能在它的真正價值之下。它被截斷爲2GB。這很好(現在)。我不明白的是爲什麼物理內存不止是虛擬內存。再次,這可能源於我完全的無知。它確定似乎總是dwAvailVirtual> = dwAvailPhys,但顯然並非如此。我有4 GB的內存(1stwarning大於4 GB)。我想我會試試Ex,以防萬一我得到虛假價值。 – Dave 2010-03-17 20:45:58

相關問題