为什么linux将干净的MAP_ANONYMOUS内存页转储到核心转储?



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

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

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

因为在这些条件下,内核没有优化到减少内核文件大小。

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

你可以用google用户级coreddump代替。

最新更新