我想在我的进程中保留以前使用但目前不需要的内存的虚拟地址空间。我对主机内核是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