fork()机制的一部分

在阅读“Linux Kernel Development”之后,我看到了下一个陈述:

传统上,通过使用fork() ,父类拥有的所有资源都会被复制,并将副本提供给子级。这种方法太天真,效率低下,因为它复制了许多可能被共享的数据。更糟糕的是,如果新进程是立即执行一个新的图像,所有的复制将浪费

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

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

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

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

如果新的过程是立即执行新的形象,为什么要复制浪费

如果新的过程结果不需要继续从这一点,这种复制是完全没有用的。 例如,如果新进程只是想开始执行一个新程序,则不需要上述任何变量。

那么低效就不是那么低效。 AFAIK, fork()执行copy-on-write 。 这种机制使得内存只有在子进程试图写入时才被复制。 所以,如果子进程没有写入, x将不会被复制,但它可以访问变量进行读取。 写入尝试通常由称为“存储器管理单元”的一个硬件来检测。

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

如果我们不像在使用管道的情况下执行新的图像,则复制所有父母资源是非常重要的。 当他们实现fork()时,无论程序员如何使用它,都应该是通用的。所以,复制父类资源是有道理的。