2010-03-13 52 views
44

我知道內存必須在提交之前保留。當它被保留時,沒有其他進程可以使用它。但是,保留內存不計入可用RAM。但不是嗎?因爲如果沒有人可以使用它,那麼它有什麼好處?保留和提交的內存有什麼區別?

還是有一些更大的區別?

+0

您能否提供一個參考資料,指出您在哪裏找到「保留」的定義? –

+0

http://msdn.microsoft.com/en-us/library/aa366887%28VS.85%29.aspx – glutz78

+3

查看Mark Russinovich在PDC 10上的演示文稿。它被稱爲'PDC10:揭示Windows內存管理之謎:部分一。'他廣泛地談論這件事。 http://player.microsoftpdc.com – NigelTufnel

回答

44

在Win32的上下文中,「保留」意味着地址空間在請求它的進程內被分配了。例如,這可以用來爲一個大型緩衝區預留空間,這個緩衝區並不是馬上需要的,但是當它需要時,它需要是連續的。

保留內存根本不與其他進程交互,因爲每個進程都有自己的私有地址空間。因此,「當它被保留時,沒有其他進程可以使用它」的說法是沒有意義的,因爲進程通常無法在另一個進程的地址空間中正常分配內存。

當請求保留的頁面被提交(爲它們分配後備存儲)時,由於缺少物理內存(或頁面文件),該操作可能會失敗。

+1

「分配給他們的後備存儲」:你的意思是什麼時候只存儲在緩存中的數據被稱爲保留,當它被寫入RAM或頁面文件時,它被稱爲提交? – idbrii

+7

@pydave:不,「cache」和「reserved」是不相關的概念。保留內存有點像一個房地產開發商聲稱後來將包含房屋的土地。那裏什麼也沒有,但是沒人能在那裏建房子。承諾實際上是建造房屋並建立電力和下水道等基礎設施。另一方面,緩存是一種優化,使CPU運行得更快,所有的數據仍然存儲在RAM的某處。 –

+1

那麼將數據寫入內存頁面會導致頁面被提交? (然後保留和提交之間的區別是保留已分配,但已提交已使用。) – idbrii

4

進程虛擬內存(地址空間)和實際RAM都不同。您可以擁有512MB物理RAM,但您的進程仍然可以處理4GB虛擬地址空間(2GB用戶空間)。 進程中的每個地址都可以被視爲自由,保留或在任何給定時間提交。

一個過程開始的所有地址免費,這意味着他們可以自由地致力於 到內存或爲將來預留use.Before任何空閒地址可以使用,作爲保留OR承諾必須先分配。但是不需要保留它以便實現它。

預留內存意味着爲將來的目的保留虛擬地址空間。它不與物理RAM(映射到RAM地址)相關聯。如提交的內存意味着它將與實際的RAM相關聯,以便您可以在其中存儲數據。

http://msdn.microsoft.com/en-us/library/ms810627.aspx

+2

A quibble:虛擬內存在提交之前不需要保留_作爲單獨的步驟。 VirtualAlloc可以在一次調用中保留並提交。但是「儲備」確實需要完成。另外,提交併不實際「分配」RAM;只有後續的頁面錯誤纔會這樣做。我(試圖?)相應地編輯「它將被關聯」到「它可以關聯」。我還會在結尾添加以下句子:「在訪問提交區域之前,不會分配實際的RAM,並且是逐頁完成的。」還有一件事:另一種使用空閒頁面的方式是映射內存。 –

7

我喜歡觀看Reserved爲預訂地址空間,這樣沒有人可以分配它(但因爲它是尚未公佈,我不能在該地址使用的內存)。並且Committed映射表示地址空間爲物理內存以便它可以使用。

爲什麼我要儲備?爲什麼不只是獲得承諾的內存?有幾個原因,我心裏有:

  1. 一些應用程序需要一個特定的地址範圍,從說要爲0x400000 0x600000,但並不需要存儲任何的記憶。它用於捕獲內存訪問。例如,如果某些代碼訪問此區域,它將被捕獲。 (由於某些原因有用)。

  2. 某些線程需要逐步擴展數據。數據需要在一塊連續的內存中。最好不要一次性提交大量的物理內存,因爲它不是必需的,並且會是如此浪費。內存可以被其他一些線程首先使用。物理內存僅在需求時提交。

相關問題