Child-runs-first 旧 linux 内核中的语义

Child-runs-first semantics in old linux kernels

我正在阅读 Linux 内核开发并试图理解 fork() 情况下的进程地址 space 语义。当我在内核 v2.6 和较新版本的上下文中阅读时,child 或 parent 中的任何一个可能 运行 首先,我对以下内容感到困惑:

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

根据我对COW的理解,如果使用exec(),COW总会发生,无论是child还是parent先处理运行s。有人可以先解释一下在 child 运行ning 的情况下如何消除 COW 吗? 'overhead' 是否指的是 COW 而不是 'always copy' 语义带来的额外开销?

fork() 创建 parent 的内存地址 space 的副本,其中所有内存页最初在 parent 和 child 之间共享.所有页面都标记为 read-only,并且在第一次写入此类页面时,将复制该页面,以便 parent 和 child 拥有自己的页面。 (这就是 COW 的意义所在。)

exec() 丢弃整个当前地址 space 并为新程序创建一个新地址。

  • 如果child先执行再调用exec(),则共享页面的none需要取消共享。
  • 如果parent先执行并修改了一些数据,那么这些页面将被取消共享。如果 child 然后开始执行并调用 exec(),复制的页面将被丢弃,即实际上不需要取消共享。