3

在阅读“Linux 内核开发”后,我看到了下一条语句:

传统上,在 上fork(),父级拥有的所有资源都被复制,并将副本提供给子级。这种方法是幼稚且低效的,因为它复制了许多否则可能被共享的数据。更糟糕的是,如果新进程要立即执行一个新的图像,所有的复制都会浪费

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

4

3 回答 3

4

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

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

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

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

如果新过程证明不需要从那个点继续,那么这种复制是完全没有用的。例如,如果新进程只是想开始执行一个新程序,它就不需要上面提到的任何变量。

于 2012-08-19T16:28:08.210 回答
3

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

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

于 2012-08-19T17:10:48.953 回答
1

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

于 2013-08-16T14:09:21.160 回答