fork产生的唯一开销是页表复制和进程ID创建

时间:2013-05-23 22:01:53

标签: linux process operating-system kernel fork

fork()产生的唯一开销是父页面表的重复 并为孩子创建一个唯一的过程描述符。 在Linux中,实现了fork() 通过使用写时复制页面。写时复制(或COW)是一种技术 延迟或完全阻止复制数据。

那么为什么需要复制页面表呢?只要进程以只读模式共享页面或直到它们写入某些内容,就不需要复制页表,因为父进程和子进程的转换是相同的吗?

有人可以解释..

提前致谢

1 个答案:

答案 0 :(得分:4)

因为COW的工作原理是页面是只读的,所以我们需要一个只读的页表副本。当新进程写入某处时,页面错误被视为写入只读页面的结果。页面错误处理程序查看页面的状态,确定是否应该写入(如果不是,segfault,就像在原始进程中写入只读一样)并将相关的原始页面复制到新页面处理。

对于某些条目,原始页表是可读写的,因此至少必须复制这些条目。我相信整个页面表被复制(因为它使一些其他代码更简单,并且页表条目不是很大 - 每页四或八个字节[每4096KB加一个条目,每4009 * 4096KB加一个)等等。层次结构]。

还有一些有趣的方面,例如,我们有一些代码可以:

 char *ptr = malloc(big_number);
 // Fill ptr[...] with some data. 
 if(!fork())
 {
      // child process works on ptr data. 
      ...
 }
 else
 {
    free(ptr);
 }

现在,将删除父进程中的页表条目。如果我们与子进程共享这些,我们需要知道这些页表条目是共享的。

通过网络接收/发送数据,写入磁盘,交换页面等等时会出现很多其他类似的问题。