在阅读“Linux 内核开发”后,我看到了下一条语句:
传统上,在 上
fork()
,父级拥有的所有资源都被复制,并将副本提供给子级。这种方法是幼稚且低效的,因为它复制了许多否则可能被共享的数据。更糟糕的是,如果新进程要立即执行一个新的图像,所有的复制都会浪费
为什么fork()
需要复制所有父级的资源?为什么我们不能简单地为新进程所需的所有资源分配新的空间块?为什么需要抄袭?最后一个查询 - 如果新进程要立即执行新图像,为什么复制会浪费?
在阅读“Linux 内核开发”后,我看到了下一条语句:
传统上,在 上
fork()
,父级拥有的所有资源都被复制,并将副本提供给子级。这种方法是幼稚且低效的,因为它复制了许多否则可能被共享的数据。更糟糕的是,如果新进程要立即执行一个新的图像,所有的复制都会浪费
为什么fork()
需要复制所有父级的资源?为什么我们不能简单地为新进程所需的所有资源分配新的空间块?为什么需要抄袭?最后一个查询 - 如果新进程要立即执行新图像,为什么复制会浪费?
为什么我们不能简单地为新进程所需的所有资源分配新的空间块
forks(2)
说当你这样做时另一个进程从那个点开始执行的语义。所以如果它开始执行,它自然会对声明的变量、它们的值等有一些期望。您需要复制父母有权访问的所有内容*。
int x = 42;
fork();
if (parent)
/* x == 42. */
else
/* I can haz x ? */
如果新进程要立即执行新映像,为什么复制会浪费
如果新过程证明不需要从那个点继续,那么这种复制是完全没有用的。例如,如果新进程只是想开始执行一个新程序,它就不需要上面提到的任何变量。
好吧,这种低效率并不是那么低效率。AFAIK,fork()
执行写时复制。这种机制使内存只有在子进程尝试写入时才被复制。因此,x
如果子进程不写入,则不会被复制,但它可以访问变量进行读取。写入尝试通常由称为“内存管理单元”的硬件检测。
另一方面,在某些应用程序中,从子进程继承状态变量非常有用,因此在这种情况下“清理”内存空间将没有用处。
如果我们没有像使用管道那样执行新图像,那么复制所有父资源非常重要。当他们实现 fork() 时,无论程序员如何使用它都应该是通用的。所以复制父资源是有意义的。