当交换关闭时,主内存中的写时复制会工作吗?

当交换关闭时,主内存中的写时复制会工作吗?

如果没有过度使用,每个 fork() 都需要足够的可用存储空间来复制地址空间,即使绝大多数页面从未经历过写入时复制。

上面的说法摘自Robert Love的书(Linux系统编程第2版,内存管理章节,过度提交和OOM主题)。

如果我们关闭交换区,我就无法过度使用主内存。在这种情况下,将在主内存工作中进行写时复制(即 fork、malloc、mmap 等),还是会尝试在内存中预分配整个数据而无需任何惰性分配机制?

如果我遗漏了什么,请纠正我。

更新:朋友们,最初我以为一旦我们关闭交换我就不能过度使用。正如下面的讨论中提到的,即使我们关闭交换,我们也可以过度使用。

答案1

您可以过量使用而无需交换。 Robert Love 书中的“存储”一词在此上下文中指的是物理 RAM。内核为进程设置一个内存空间,该空间尚未包含到物理 RAM 的映射,或者在写入时复制的情况下指向共享页帧。当访问页面时,映射是按需创建的。假设并非同时需要所有映射,因此过量使用相对安全。

答案2

这是一篇好文章:关键 - 过度使用

实际上有一个默认的内存限制,具体取决于 /proc/sys/vm/文件的配置。如果您设置为“无过量使用”并选择一个百分比,您将得到:

Memory Allocation Limit = Swap Space + RAM * (Overcommit Ratio / 100)

默认比例为50(%);对于 4G RAM 和 4G Swap,分配限制为 6G。

在这种特殊的“无过度使用”模式(通过/proc/sys/vm/overcommit_memory过度承诺意味着您期望积极使用多少交换空间。这是有道理的,因为如果您分配 8 GB 并大量使用它们,速度会太慢。因此交换空间“算”一半。


如果您希望严格限制 RAM 的大小,并且不进行交换,则可以将 overcommit_memory 设置为 2(=无过量使用),并将 overcommit_ratio 设置为 100%。

在默认情况下内核一些检查:

应用启发式算法来确定是否有足够的可用内存。

(第三种模式是:不检查,即overcommit,直到OOM发生)

相关内容