做MMAP / mprotect的,只读的零页对提交内存算不算?

问题描述 投票:8回答:2

我要保持我的记忆的过程,以前使用,但目前并不需要保留的虚拟地址空间。我有兴趣在主机内核就是Linux的情况,它的配置,以防止过量使用(它确实通过详细的占所有提交的内存)。

如果我只是想阻止我的应用程序不再占用物理内存使用或得到交换到磁盘(浪费资源无论哪种方式)的数据,我可以madvise,它是不需要的内核,或mmap新的零页在它的上面。但是,这些方法都不必然减少的存储器计为致力于量,这其他进程正在然后使用防止。

如果我被标记为只读新鲜零页替代哪些网页?我的意图是,他们不计入提交内存,并进一步指出,我以后可以使用mprotect让他们写,如果让他们写会超过提交的内存限制,它会失败。我的理解是正确的吗?将这项工作?

c linux mmap memory-overcommitment
2个回答
1
投票

如果你不使用的页面(读取或写入的话),就不会致力于为您的地址空间(仅保留)。

但是,你的地址空间是有限的,所以只要你想,你无法播放/喜欢它。

例如见ElectricFence可能会失败,因为“NUL页/保护页”(没有匿名访问内存)的插入了大量分配。看看这些主题:“则mprotect()失败:无法分配内存”:http://thread.gmane.org/gmane.comp.lib.glibc.user/538/focus=976052


1
投票

在Linux上,假设过量使用没有被禁用,则可以使用MAP_NORESERVE标志mmap,这将确保有问题的网页不会被访问之前,计入分配的内存。如果过量使用已经完全禁用,可以看看下面的多个映射页面。

需要注意的是linux的零个网页上的行为在过去的时代已经改变;一些内核版本,只需阅读的页面会导致它被分配。与他人,写是必要的。需要注意的是保护标志并不直接导致分配;但它们也可以防止意外触发分配。因此,最可靠的结果,你应该避免与mprotect PROT_NONEing在所有访问该页面。

作为另一种更便携的选项,你可以映射在多个位置相同的页面。也就是说,创建和打开一个空的临时文件,取消该关联,ftruncate到的网页上有一些合理的号码,然后mmap反复偏移0到文件中。这将绝对保证内存只有对你的程序的内存使用情况计数一次。你甚至可以使用MAP_PRIVATE来自动重新分配它,当你写的页面。

这可能有更高的内存利用率比MAP_NORESERVE技术(无论是内核跟踪数据,并为临时文件本身的页面),然而,我会建议使用MAP_NORESERVE代替时可用。如果你使用这个技术,尽量使该区域被映射相当大的(并把它放在/dev/shm如果在Linux上,以避免实际的磁盘IO)。每个人mmap通话将消耗一定量的(非热插拔)内核内存来跟踪它,所以这是很好的保持这种倒计时。

© www.soinside.com 2019 - 2024. All rights reserved.