fork()机制的某些部分

时间:2012-08-19 16:23:51

标签: linux linux-kernel fork

阅读“Linux内核开发”后,我看到了下一个状态:

  

传统上,在fork()之后,父项拥有的所有资源都是重复的   复制给了孩子。这种方法很简单,效率很低,因为它复制很多   否则可能会共享的数据。更糟糕的是,如果新流程立即进行   执行一个新的图像,所有复制将浪费

为什么fork()需要复制所有父资源?为什么我们不能简单地为新流程所需的所有资源分配新的空间?为什么复制需要?最后一个查询 - 如果新进程要立即执行新映像,为什么复制会浪费?

3 个答案:

答案 0 :(得分:4)

  

为什么我们不能简单地为所有资源分配新的空间块   新流程需要

forks(2)的语义表示当你这样做时,另一个进程从那一点开始执行 。因此,如果它开始执行,它自然会对声明的变量,它们的值等有一些期望。您需要复制父母有权访问的所有内容。

int x = 42;
fork();
if (parent)
    /* x == 42. */
else
    /* I can haz x ? */
  

如果新进程要立即执行新映像,为什么要进行复制呢?   浪费

如果新过程结果不需要从那一点开始继续,则此复制完全没用。例如,如果新进程只是想开始执行新程序,则不需要上面提到的任何变量。

答案 1 :(得分:3)

嗯,效率低下并不是那么低效。 AFAIK,fork()执行写时复制。此机制仅在子进程尝试写入内存时才复制内存。因此,如果子进程没有写入它,则不会复制x,但它可以访问该变量进行读取。写入尝试通常由称为“内存管理单元”的硬件检测。

另一方面,有些应用程序从子进程继承状态变量非常有用,因此在这种情况下“清理”内存空间是没有用的。

答案 2 :(得分:1)

如果我们没有像我们使用管道那样执行新图像,那么复制所有父资源非常重要。当他们实现fork()时,无论程序员如何使用它都应该是通用的。所以复制父项资源是有意义的。