fork() 是否复制父级的所有内存?

Does fork() duplicate all the memory of the parent?

假设我编译 运行 fork() 的教科书示例。

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(void)
{
        pid_t pid;
        pid = fork();

        if (pid == -1)
                return 1;

        if (pid == 0)
                puts("From child process.");
        else
                puts("From parent process.");

        return 0;
}

if (pid == 0) 语句的两个分支的代码是否都到达 fork()?换句话说,子进程是否包含父进程永远不会执行的代码,反之亦然?或者does/can编译器优化这个?

fork() 重复整个过程。唯一的区别在于 fork() 调用自身的 return 值——在 parent 中它 return 是 child 的 PID,在 child 它 returns 0.

大多数操作系统使用一种称为写时复制 的技术对此进行了优化。 child 不是复制所有内存,而是共享 parent 的内存。然而,所有的内存页面都被标记为copy-on-write,这意味着如果任何一个进程修改了页面中的某些东西,它会在那个时候被复制并且修改它的进程将被更改为使用副本(和COW原始页面的标志也将被关闭。

有关详细信息,请参阅 fork and copy-on-write 上的维基百科文章。