mmap 在使用 MAP_PRIVATE 与 MAP_SHARED 时的最坏内存使用情况

mmap's worst case memory usage when using MAP_PRIVATE vs MAP_SHARED

我没有在任何地方明确看到这一点,所以我只是想澄清一下。这都是在单线程程序的上下文中:假设我们有一个 10GB 的文本文件,当我们使用 mmap 打开时,使用 MAP_PRIVATE 选项。当然,最初我应该期望看到使用 0GB 常驻内存。现在假设我修改了文件中的每个字符。这会需要 10GB 的常驻内存吗?如果没有,为什么不呢?

现在,如果我们使用 MAP_SHARED 做同样的事情,我应该期望常驻内存使用情况如何?

MAP_SHARED 创建一个由原始文件支持的映射。对数据的任何更改都会写回该文件(假设 read/write 映射)。

MAP_PRIVATE 创建一个由原始文件支持的映射 只读 。如果您更改映射中的字节,则 OS 会创建一个新页面,该页面占用物理内存并由交换(如果有)支持。

对常驻集大小的影响不依赖于映射类型:如果页面被主动访问(读取或写入),它们将位于您的常驻集中。如果 OS 需要物理内存,则未主动访问的页面将被删除(如果干净),或写入原始文件或交换(如果脏,并取决于映射类型)。

这两种类型的不同之处在于对物理内存和交换的完全承诺。共享映射不会增加这种承诺,私有映射会。如果您没有足够的组合内存和交换空间来保存私有映射的每一页,并且您写入每一页,那么您(或可能是其他进程)将被 out-of-memory 守护程序杀死。

更新:我上面写的适用于memory-mapped文件。您可以将匿名块 (MAP_ANONYMOUS) 映射到 MAP_SHARED,在这种情况下,内存由交换而不是文件支持。