gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:20:59 25 4
gpt4 key购买 nike

我想使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com