2011-12-26 124 views
2

我想使用mmap將LARGE連續內存區域映射到我的進程中。這只是一個大的預分配緩衝區,其中大部分不太可能被使用。實際上,我可以創建Terabytes這樣的內存區域,即使這超過了我的物理內存+硬盤大小。當我訪問映射區域中的地址時,Linux將映射頁面。不幸的是,如果我在調用mmap後生成核心轉儲,但在觸及新的內存區域之前,核心轉儲將包含該大內存區域。爲什麼? Linux將不得不在頁面中填入零填充內存的新頁面,以便將其寫入核心文件。爲什麼linux轉儲乾淨MAP_ANONYMOUS內存頁到核心轉儲?

爲什麼我要這樣做?如果我的製作者總是可以將數據附加到單個連續的緩衝區,並且我的客戶可以讀取生產者後面的數據並假定其讀取頭和生產者的寫入頭之間的所有數據都是可使用的,我的代碼會更簡單和更高效。在我的讀取高級傳遞頁面邊界後,我計劃使用madvise,讓操作系統知道它不再需要爲我保存這些內存頁面。

+0

您是否考慮過對第一張大地圖使用「MAP_NORESERVE」? – 2011-12-27 07:28:52

+0

MAP_NORESERVE有助於放鬆啓發式檢查,允許mmap在可能沒有的地方成功。不幸的是,它不會阻止核心轉儲在覈心轉儲中包含未修改的零填充頁面。 – 2011-12-27 19:11:06

回答

2

核心轉儲將包含該大內存區域。爲什麼?

因爲在這些條件下內核沒有經過優化以減少核心文件大小。

內核可能會查看給定內存區域中的每個頁面,並跳過所有未修改的頁面。我不確定這樣的補丁會被接受。

您可以改用google user-level coredumper。它確實修剪尾部零填充頁面。