阅读“Linux内核开发”后,我看到了下一个状态:
传统上,在
fork()
之后,父项拥有的所有资源都是重复的 复制给了孩子。这种方法很简单,效率很低,因为它复制很多 否则可能会共享的数据。更糟糕的是,如果新流程立即进行 执行一个新的图像,所有复制将浪费
为什么fork()
需要复制所有父资源?为什么我们不能简单地为新流程所需的所有资源分配新的空间?为什么复制需要?最后一个查询 - 如果新进程要立即执行新映像,为什么复制会浪费?
答案 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()时,无论程序员如何使用它都应该是通用的。所以复制父项资源是有意义的。