我知道內存必須在提交之前保留。當它被保留時,沒有其他進程可以使用它。但是,保留內存不計入可用RAM。但不是嗎?因爲如果沒有人可以使用它,那麼它有什麼好處?保留和提交的內存有什麼區別?
還是有一些更大的區別?
我知道內存必須在提交之前保留。當它被保留時,沒有其他進程可以使用它。但是,保留內存不計入可用RAM。但不是嗎?因爲如果沒有人可以使用它,那麼它有什麼好處?保留和提交的內存有什麼區別?
還是有一些更大的區別?
在Win32的上下文中,「保留」意味着地址空間在請求它的進程內被分配了。例如,這可以用來爲一個大型緩衝區預留空間,這個緩衝區並不是馬上需要的,但是當它需要時,它需要是連續的。
保留內存根本不與其他進程交互,因爲每個進程都有自己的私有地址空間。因此,「當它被保留時,沒有其他進程可以使用它」的說法是沒有意義的,因爲進程通常無法在另一個進程的地址空間中正常分配內存。
當請求保留的頁面被提交(爲它們分配後備存儲)時,由於缺少物理內存(或頁面文件),該操作可能會失敗。
進程虛擬內存(地址空間)和實際RAM都不同。您可以擁有512MB物理RAM,但您的進程仍然可以處理4GB虛擬地址空間(2GB用戶空間)。 進程中的每個地址都可以被視爲自由,保留或在任何給定時間提交。
一個過程開始的所有地址免費,這意味着他們可以自由地致力於 到內存或爲將來預留use.Before任何空閒地址可以使用,作爲保留OR承諾必須先分配。但是不需要保留它以便實現它。
預留內存意味着爲將來的目的保留虛擬地址空間。它不與物理RAM(映射到RAM地址)相關聯。如提交的內存意味着它將與實際的RAM相關聯,以便您可以在其中存儲數據。
A quibble:虛擬內存在提交之前不需要保留_作爲單獨的步驟。 VirtualAlloc可以在一次調用中保留並提交。但是「儲備」確實需要完成。另外,提交併不實際「分配」RAM;只有後續的頁面錯誤纔會這樣做。我(試圖?)相應地編輯「它將被關聯」到「它可以關聯」。我還會在結尾添加以下句子:「在訪問提交區域之前,不會分配實際的RAM,並且是逐頁完成的。」還有一件事:另一種使用空閒頁面的方式是映射內存。 –
我喜歡觀看Reserved
爲預訂地址空間,這樣沒有人可以分配它(但因爲它是尚未公佈,我不能在該地址使用的內存)。並且Committed
爲映射表示地址空間爲物理內存以便它可以使用。
爲什麼我要儲備?爲什麼不只是獲得承諾的內存?有幾個原因,我心裏有:
一些應用程序需要一個特定的地址範圍,從說要爲0x400000 0x600000,但並不需要存儲任何的記憶。它用於捕獲內存訪問。例如,如果某些代碼訪問此區域,它將被捕獲。 (由於某些原因有用)。
某些線程需要逐步擴展數據。數據需要在一塊連續的內存中。最好不要一次性提交大量的物理內存,因爲它不是必需的,並且會是如此浪費。內存可以被其他一些線程首先使用。物理內存僅在需求時提交。
您能否提供一個參考資料,指出您在哪裏找到「保留」的定義? –
http://msdn.microsoft.com/en-us/library/aa366887%28VS.85%29.aspx – glutz78
查看Mark Russinovich在PDC 10上的演示文稿。它被稱爲'PDC10:揭示Windows內存管理之謎:部分一。'他廣泛地談論這件事。 http://player.microsoftpdc.com – NigelTufnel