【发布时间】:2015-10-14 18:14:20
【问题描述】:
由于父进程正在使用大量内存,在某些内核过度使用策略配置下,fork 可能会以errno 或ENOMEM 失败。即使子进程可能只有exec ls 之类的低内存消耗程序。
为了澄清问题,当 /proc/sys/vm/overcommit_memory 配置为 2 时,(虚拟)内存的分配限制为 SWAP + MEMORY * ration(default to 50%)。
当一个进程分叉时,由于COW,虚拟内存不会被复制。但是内核仍然需要分配虚拟内存空间。打个比方,fork 就像 malloc(virtual memory space size),不会分配物理内存,写入共享内存会导致复制虚拟内存,分配物理内存。当 overcommit_memory 配置为 2 时,fork 可能会因为虚拟内存空间分配而失败。
在下列情况下是否可以fork一个进程不继承父进程的虚拟内存空间?
如果子进程在
fork之后调用exec如果子进程不调用
exec并且不会使用来自父进程的任何全局或静态变量。例如,子进程只是做一些记录然后退出。
【问题讨论】:
-
我不太明白;这不是共享虚拟内存写时复制吗?因此,任何额外的内存实际上都是子进程私有的。不共享虚拟内存不会加剧问题吗?
-
@trojanfoe 当进程分叉时,由于 COW,虚拟内存不会被复制。但是内核仍然需要分配虚拟内存空间。打个比方,fork 就像 malloc(virtual memory space size),不会分配物理内存,写入共享内存会导致复制虚拟内存,分配物理内存。当 /proc/sys/vm/overcommit_memory 为 2 时,内存分配限制为 SWAP+MEMORY*ratio。因此,fork 可能会因 ENOMEM 失败。