【发布时间】:2018-09-15 04:28:42
【问题描述】:
我正在使用带有MAP_ANONYMOUS 标志的mmap() 分配一些内存。由于问题的特点,我经常需要将一些数据写入大内存块的一个页面(例如,位于中间),而另一部分保持不变。因此,我不会将大部分未使用的内存进行物理分配。
在我看来,这样的mmap() 调用只是给了我一个指向一些填充为 0 的虚拟页面的指针,但是由于写入时复制和按需分页机制,没有一页(除了第一页)不是实际分配在 RAM 中,直到第一次尝试写入它的内存。
问题是:有一刻我从mmap() 得到了MAP_FAILED(之前有很多成功的调用,分配查询较少),当我试图分配一个大于我的物理RAM 大小的内存块时。所以,看起来实际上分配了更多的页面,即使没有对它们的写访问权限。
我需要你们帮忙解决两个问题,首先: 我对匿名内存分配的看法是否正确,以及(如果不是)有哪些不准确之处?
第二个:
匿名mmap() 完成后,如何测量实际分配的页面数?我试过使用mincore(),结果表明几乎所有页面都“驻留在”内存中(即物理分配的?)。所以,看来mincore() 结果是错误的,或者我完全被卡住了:(
更新。
@Art 提到的内存过度使用似乎确实会影响这一点。但是当我尝试禁用它时(将/proc/sys/vm/overcommit_memory 设置为1 模式或使用mmap() 和MAP_NORESERVE 标志,我的机器严重冻结,并且硬重置是唯一有帮助的。
【问题讨论】: