【问题标题】:Does fork() duplicate all the memory of the parent?fork() 是否复制父级的所有内存?
【发布时间】:2015-11-14 20:10:35
【问题描述】:

假设我编译并运行 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()?换句话说,子进程是否包含永远不会被父进程执行的代码,反之亦然?或者编译器是否/可以对此进行优化?

【问题讨论】:

  • 是的。但这没关系。优化在操作系统而不是编译器中。文本段将由所有分叉进程共享。也就是说,操作系统会将文本段的相同物理内存映射到每个分叉进程中。事实上,在写入特定数据页之前,即使数据也是共享的(即,写入时复制)。

标签: c memory optimization concurrency fork


【解决方案1】:

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

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

有关更多信息,请参阅关于 forkcopy-on-write 的维基百科文章。

【讨论】:

  • IIRC,fork/exec 在 cygwin 上非常慢,因为 Windows 没有对 fork() 部分的快速支持。我忘记了 cygwin 必须做什么来模拟 Unix 语义的细节。当然,它在所有合适的 Unix 操作系统上都很快。
猜你喜欢
  • 1970-01-01
  • 2014-10-24
  • 2017-09-12
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
相关资源
最近更新 更多