当前位置 : 主页 > 手机开发 > 其它 >

是否可以在没有继承父进程的虚拟内存空间的情况下派生进程?

来源:互联网 收集:自由互联 发布时间:2021-06-19
由于父进程使用大量内存,因此在内核过量使用策略的某些配置下,fork可能会因ENOMEM的errno而失败.即使子进程可能只执行低内存消耗程序,如ls. 为了澄清问题,当/ proc / sys / vm / overcommit_me
由于父进程使用大量内存,因此在内核过量使用策略的某些配置下,fork可能会因ENOMEM的errno而失败.即使子进程可能只执行低内存消耗程序,如ls.

为了澄清问题,当/ proc / sys / vm / overcommit_memory配置为2时,(虚拟)内存的分配仅限于SWAP MEMORY * ration(默认为50%).
当一个进程分叉时,由于COW没有复制虚拟内存.但是内核仍然需要分配虚拟内存空间.作为类比,fork就像malloc(虚拟内存空间大小),它不会分配物理内存,写入共享内存会导致分配虚拟内存和物理内存的副本.当overcommit_memory配置为2时,由于虚拟内存空间分配,fork可能会失败.

在以下条件下,是否可以在不继承父进程的虚拟内存空间的情况下分叉进程?

>如果子进程在fork之后调用exec
>如果子进程没有调用exec,并且不会使用父进程中的任何全局或静态变量.例如,子进程只执行一些日志记录然后退出.

我不知道有任何方法可以做(2),但对于(1)你可以尝试使用vfork,它将分叉一个新进程而不复制父进程的页表.但是出于多种原因通常不建议这样做,包括因为它会导致父项阻止,直到孩子执行execve或终止.
网友评论