我想使用mmap将大的连续内存区域映射到我的进程中。这只是一个很大的预先分配的缓冲区,其中大部分不太可能每次都被使用。实际上,我可以创建my级的内存区域,即使这超出了我的物理内存+硬盘大小。当我访问映射区域中的地址时,Linux将在页面中进行映射。不幸的是,如果我在调用mmap之后生成一个核心转储,但在触及新的内存区域之前,核心转储将包括那个大的内存区域。为什么?Linux将不得不在一个新的页面中填满零容量的内存,仅仅是为了将其写出到核心文件中。
我为什么要这样做呢?如果我的生产者总是可以将数据附加到一个连续的缓冲区中,而我的消费者可以读取生产者后面的数据,并假设它的读头和生产者的写头之间的所有数据都是可使用的,那么我的代码将变得更简单和高效。我计划在我的读取头提前通过一个页面边界后使用me,让操作系统知道它不再需要为我保存这些内存页面。
发布于 2011-12-27 06:44:43
核心转储将包括该大内存区域。为什么?
因为在这些情况下内核没有被优化来减小核心文件大小。
内核很可能会查看给定内存区域中的每一页,并跳过所有未修改的页。不过,我不确定这样的补丁是否会被接受。
你可以使用google user-level coredumper来代替。它确实会修剪尾随的以零填充的页面。
https://stackoverflow.com/questions/8639399
复制相似问题