如果没有过度使用,每个 fork() 都需要足够的空闲存储空间来复制地址空间,即使绝大多数页面从未经历过写入时复制。
上述陈述摘自 Robert Love 的书(Linux System Programming 2nd edition, Memory management chapter, Overcommitting and OOM topic)。
如果我们关闭交换,我就不能过度使用主内存。在这种情况下,将在主内存中进行写时复制(即 fork、malloc、mmap 等),还是会尝试在内存中预分配整个数据而不使用任何惰性分配机制?
如果我遗漏任何东西,请纠正我。
更新:朋友们,最初我认为一旦我们关闭交换,我就不能过度使用。就像下面讨论中提到的那样,即使我们关闭交换,我们也可以过度使用。
您可以在没有交换的情况下过度使用。在这种情况下,Robert Love 书中的“存储”一词指的是物理 RAM。在 Copy-on-Write 的情况下,内核为尚未包含到物理 RAM 的映射或指向共享页框的进程设置内存空间。映射是在访问页面时按需创建的。假设不是同时需要所有映射,因此过度使用相对安全。
这是一篇好文章:pivotal - Overcommit
实际上有一个默认的内存限制,具体取决于
/proc/sys/vm/
文件的配置。如果您设置为“no overcommit”,并选择一个百分比,您将获得:Memory Allocation Limit = Swap Space + RAM * (Overcommit Ratio / 100)
默认比例为 50(%);对于 4G RAM 和 4G Swap,这将 6G 作为分配限制。
在这种特殊的“no-overcommit”模式(通过
/proc/sys/vm/overcommit_memory
)中,overcommitment意味着您指望主动使用多少交换。这是有道理的,因为如果您分配 8 GB 并大量使用它们,就会太慢。所以交换空间“计数”一半。如果您想要严格限制 RAM 的大小,并且没有交换,您可以将 overcommit_memory 设置为 2 (=no overcommit) 并将 overcommit_ratio 设置为 100%。
在默认情况下,内核会进行一些检查:
(第三种模式是:不检查,即overcommit直到OOM发生)