2011-12-26 66 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。它确实修剪尾部零填充页面。