由于父进程使用大量内存,因此在内核过量使用策略的某些配置下,fork可能会因ENOMEM的errno而失败.即使子进程可能只执行低内存消耗程序,如ls. 为了澄清问题,当/ proc / sys / vm / overcommit_me
为了澄清问题,当/ proc / sys / vm / overcommit_memory配置为2时,(虚拟)内存的分配仅限于SWAP MEMORY * ration(默认为50%).
当一个进程分叉时,由于COW没有复制虚拟内存.但是内核仍然需要分配虚拟内存空间.作为类比,fork就像malloc(虚拟内存空间大小),它不会分配物理内存,写入共享内存会导致分配虚拟内存和物理内存的副本.当overcommit_memory配置为2时,由于虚拟内存空间分配,fork可能会失败.
在以下条件下,是否可以在不继承父进程的虚拟内存空间的情况下分叉进程?
>如果子进程在fork之后调用exec
>如果子进程没有调用exec,并且不会使用父进程中的任何全局或静态变量.例如,子进程只执行一些日志记录然后退出.