为什么linux转储清理MAP_ANONYMOUS内存页面到核心转储?

时间:2011-12-26 22:01:30

标签: c++ linux

我想使用mmap将LARGE连续内存区域映射到我的进程中。这只是一个大的预分配缓冲区,其中大部分都不太可能被使用。我实际上可以创建太字节这样的内存区域,即使它超过我的物理内存+硬盘大小。当我访问映射区域中的地址时,Linux将在页面中映射。不幸的是,如果我在调用mmap之后生成核心转储,但在触及新内存区域之前,核心转储将包含该LARGE内存区域。为什么? Linux必须在零填充内存的新页面中进行分页才能将其写入核心文件。

为什么我要这样做?如果我的生产者总是可以将数据附加到单个连续缓冲区并且我的消费者可以读取生产者后面的数据并假设其读头和生产者的写头之间的所有数据都是可消耗的,那么我的代码会更简单,更有效。我计划在读取头部高级传递页面边界后使用madvise让操作系统知道它不再需要为我保存那些内存页面。

1 个答案:

答案 0 :(得分:2)

  

核心转储将包含该LARGE内存区域。为什么呢?

因为在这些条件下内核没有经过优化以减少核心文件的大小。

内核可能查看给定内存区域中的每个页面,并跳过所有未修改的页面。我不确定会接受这样的补丁。

您可以使用Google user-level coredumper代替。它确实修剪了零填充页面。