c++ - 为什么 Linux 将干净的 MAP_ANONYMOUS 内存页转储到核心转储?

标签 c++ linux

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

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

最佳答案

the core dump will include that LARGE memory region. Why?

因为内核没有针对在这些条件下减少核心文件大小进行优化。

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

您可以使用谷歌user-level coredumper反而。它会修剪尾随零填充的页面。

关于c++ - 为什么 Linux 将干净的 MAP_ANONYMOUS 内存页转储到核心转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8639399/

相关文章:

c++ - 是否可以为 boost::make_iterator_range 起别名?

linux - 本地 CircleCI 报告 "Unexpected environment preparation error: error looking up self container id: Found multiple cgroups for outer container"

c - 为什么Linux无法映射这个PT_LOAD ELF段?

linux - 在 linux (debian) 中运行 docker 和 nodemcu-build 时出错

java - "ant all"构建无法继续。 'Cannot run program "java ".'

c++ - 为什么 `boost::container::flat_set` 不是 `nothrow_move_constructible` ?

c++ - 将 float* 或其他指针转换为 unsigned char*

c++ - 静态函数作为类模板参数 - 导致可维护性问题

c - g_print 的奇怪输出