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

neb*_*uch 5 c memory concurrency optimization fork

假设我编译并运行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;
}
Run Code Online (Sandbox Code Playgroud)

来自if (pid == 0)语句的两个分支的代码是否得到了fork()?换句话说,子进程是否包含对于永远不会被它执行的父代码,反之亦然?或者编译器是否可以对此进行优化?

Bar*_*mar 7

fork()复制整个过程.唯一的区别在于fork()调用本身的返回值- 在父级中它返回子级的PID,在它返回的子级中0.

大多数操作系统使用称为写入时复制的技术对此进行优化.孩子不是复制所有内存,而是共享父母的内存.但是,所有内存页都标记为写时复制,这意味着如果任一进程修改了页面中的某些内容,那么它将在那时被复制,并且修改它的进程将被更改为使用副本(和COW)也将关闭原始页面的标志).

有关详细信息,请参阅维基百科.