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

时间:2015-08-21 01:09:52

标签: c memory optimization concurrency 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;
}

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

1 个答案:

答案 0 :(得分:7)

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

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

有关详细信息,请参阅Wikipedia