我想在我的進程中保留以前使用但目前不需要的內存的虛擬地址空間。我對主機內核是Linux並且配置爲防止過度使用(通過詳細記錄所有已提交的內存)的情況感興趣。mmap/mprotect-readonly零頁是否計入已提交的內存?
如果我只是想阻止我的應用程序不再使用從佔用物理內存或交換到磁盤(浪費資源的任何方式)的數據,我可以madvise
它不需要的內核或mmap
新的零頁它的頂部。但是,這些方法都不一定會減少提交的內存數量,然後阻止使用其他進程。
如果我將頁面替換爲標記爲只讀的新頁面,該怎麼辦?我的意圖是,他們不計入承諾的內存,並進一步,我可以稍後使用mprotect
使它們可寫,並且它將失敗,如果使它們可寫將超過承諾的內存限制。我的理解是否正確?這會工作嗎?
一個只讀頁面不應該被考慮在一個進程的提交費用中(我手頭沒有參考,所以這不是一個答案),Linux提供了MAP_NORESERVE標誌,這應該會給你一個更強的保證。但我必須問:爲什麼你覺得需要預留未被使用的內存? – Anon 2010-12-01 21:56:30
如果相同的虛擬地址被mmap(隨機)分配而沒有程序意識到它會發生壞事(tm)。 :-)對於`MAP_NORESERVE`,我擔心可能會讓頁面不再被計數,即使我稍後可以對其進行保護。我想我可以用新的零頁再次對他們進行「映射」。 – 2010-12-01 22:59:23
會發生什麼壞事?爲什麼你的程序不需要重複以前使用的地址空間?這似乎很不尋常。 – Angus 2010-12-01 23:44:43