2011-01-14 204 views
7

我的系統: 物理內存:3GB
的Windows XP Service Pack 3中(32位) 交換文件大小:30GB
最大內存映射分配大小?

目標:爲了找到儘可能大的內存映射大小,我可以在我的機器上分配。

當我運行下面的代碼來分配2GB內存映射文件時,調用失敗。處理= CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE | SEC_COMMIT,0,INT_MAX,NULL);

我一直很困惑這一點,因爲我可以通過不斷調用CreateFileMapping(每次100mb)來分配一個內存映射文件,直到系統交換文件大小爲30gb。

重新啓動計算機後,重新運行請求2GB內存映射文件的應用程序到CreateFileMapping,它將起作用並返回有效句柄。所以這引起我有點困惑,在窗戶的引擎蓋下發生了什麼?

所以情況是這樣的,我可以使用所有系統頁面文件(30GB)創建很多小內存映射文件,但是當要求單個2GB分配時,調用失敗。重啓機器並運行相同的應用程序時,調用成功!

一些注意事項:
1)內存映射文件未被加載到proccess虛擬地址空間中,該文件沒有視圖。
2)操作系統可以爲30gb的系統頁面文件分配小的100mb內存映射文件!

現在我唯一可以得出的結論是,Windows XP SP3(32位)虛擬內存管理器無法在系統頁面文件中成功保留所請求的2gb,然後由於系統內存碎片而失敗(它似乎需要保留內存的連續分配,即使頁面文件每個都是4kb)。重新啓動後,我假設系統內存碎片較少,從而允許相同的調用成功並分配大小爲2GB的內存映射文件。

我已經運行一些實驗,機器運行一天後,我開始一個小的應用程序,將分配300MB的內存馬培德文件,然後將其釋放。然後它會增加1mb的大小,然後再試一次。最後它停在700mb並報告(系統資源不足)。然後,我會通過並關閉每個應用程序,這將反過來停止錯誤消息,並最終繼續分配一個3.5GB大小的內存映射文件!

所以我的問題是這裏發生了什麼?虛擬內存管理器內部必須存在某種類型的內存碎片,因爲分配100mbs的內存映射文件會佔用系統頁面文件的30gb(提交限制)。

更新
結論是,如果你要創建與INVALID_HANDLE_VALUE系統頁面文件支持大內存映射文件,那麼系統頁面文件(交換文件)需要調整到所需要的尺寸和在大分配> 2gb處於非零碎狀態!儘管IO負載很重,但仍然可能會失敗。爲了解決所有這些問題,您可以創建自己的具有所需文件大小的文件(我做了1tb),然後使用內存映射到該文件。

最後更新
我跑在Windows 7箱相同的測試,並讓我驚訝它的作品每一次(最多系統頁面文件大小)不接觸任何東西。所以我想這只是一個錯誤,Windows XP上的大內存分配可能會比Windows 7更頻繁地失敗。

+0

我唯一能得出的結論是,容納2GB大小的4kb頁面文件的表對於系統內存來說太大了,無法處理,因此失敗。 – Chad 2011-01-14 15:22:52

+0

這是一個謎。無論您的虛擬內存和物理內存有多大,無論您運行多少個進程,都無法在32位Windows上創建大於〜300MB的mem映射文件。 – 2011-01-14 15:44:21

回答

5

問題的一個因素是內部文件碎片。物理內存(RAM)與這裏的任何東西無關。在虛擬內存系統中,「內存」是從文件系統分配的。物理內存只是一種優化,可加速對內存的訪問。

當您請求具有寫入權限的內存映射文件時,系統必須有一個連續頁面可用的文件。系統交換文件通常是分段的。如果您的磁盤驅動器進行了很好的碎片整理,您應該可以使用您選擇的文件(而不是系統頁面文件)創建大型內存映射文件。

因此,如果您確實需要2GB內存映射文件,則需要在安裝時在驅動器上創建一個。這將創建一個連續的2GB文件的問題轉移到安裝,但一旦創建,你應該沒問題。

0

讓我們來看看Windows開發人員的立場。 假設某些用戶執行以下步驟:

  1. 創建內存映射。
  2. 填充一些存儲敏感數據
  3. 不映射從文件
  4. 繼續使用內存
  5. 的Windows需要卸載這些網頁的關鍵任務。

分辨率映射的內存應該適合交換。但這並不意味着映射將被交換。

3

所以我的問題是這裏發生了什麼?虛擬內存管理器內部必須存在某種類型的內存分割,因爲分配100mbs的內存映射文件會佔用系統頁面文件的30gb(提交限制)。

聽起來正確。如果你不需要大量連續的內存塊,不要問他們是否可以在較小的塊中獲得相同數量的內存。

查找我可以在我的機器上分配的最大可能內存映射大小。

  • 大小爲X.試試吧
  • 如果失敗,大小爲X/2和重複嘗試。

這讓你在運行一個塊,也許沒有確切的最大可能塊,但2

+0

我的第一個想法是虛擬地址空間碎片。然而,這不應該在這裏扮演一個角色,因爲還沒有涉及虛擬地址 - 只有在您映射視圖後纔會分配這些虛擬地址。還有其他什麼碎片? – Suma 2011-01-14 15:17:41