我当时正在阅读Linux开发,并试图理解fork()情况下的进程地址空间语义。当我在Kernel v2.6的上下文中阅读时,以及在新版本中,任何子版本或父版本都可能先运行,但我对以下内容感到困惑:
Back in do_fork(), if copy_process() returns successfully, the new child is woken up
and run. Deliberately, the kernel runs the child process first. In the common case of the
child simply calling exec() immediately, this eliminates any copy-on-write overhead根据我对or的理解,如果使用exec (),无论是子进程还是父进程,总是会发生。有人能解释一下在孩子先跑的情况下奶牛是如何被淘汰的吗?“开销”指的是额外的开销,而不是“始终复制”语义吗?
发布于 2019-11-18 09:14:31
fork()创建父级内存地址空间的副本,其中所有内存页最初在父级和子级之间共享。所有的页面都被标记为只读,并且在第一次写入这样的页面时,页面就会被复制,这样父母和孩子就有了自己的页面。(这就是奶牛的意义。)
exec()丢弃整个当前地址空间,并为新程序创建一个新地址空间。
exec(),则所有共享页都不需要被取消共享。如果父程序先执行并修改某些数据,则这些页面不需要共享。如果子程序随后开始执行并调用exec(),则复制的页面将被丢弃,也就是说,取消共享实际上并不是必要的。https://stackoverflow.com/questions/58908535
复制相似问题