fork-exec中如何防止不必要的复制?

时间:2012-12-17 21:08:27

标签: process linux-kernel fork

今天我参加了一个关于linux进程的讲座。老师说:

  1. 在fork()返回后,子进程已准备好执行
  2. 由于Copy On Write机制,fork-exec序列可以保证防止不必要的父内存复制
  3. 通过fork-exec序列,我的意思是:

    if(!fork())
    {
        exec(...);
    }
    i = 0;
    

    据我所知,转换成这个(用伪asm编写):

    call fork
    jz next
    call exec(...)
    next:
    load 0
    store i
    

    假设父级已被授予足够的CPU时间来在一次运行中执行上述所有行。

    1. fork返回0,因此跳过第3行
    2. 当0存储在“i”中时,孩子尚未执行,因此COW开始执行 复制(不必要地)父母的记忆。
    3. 那么在这种情况下如何防止不必要的复制? 它看起来不是,但我认为Linux开发人员足够聪明,可以做到这一点;)

      可能的答案:孩子总是先跑(父亲在调用fork()之后会被提前)  那是真的吗?  2.如果是,这是否可以保证在所有情况下防止不必要的复制?

2 个答案:

答案 0 :(得分:1)

基本上两个人可以阅读同一本书。但是,如果一个人开始在边缘写作笔记,那么另一个人在此之前需要该页面的副本。没有写入页面边缘的人不希望看到书中的其他人注释。

答案 1 :(得分:0)

答案基本上是必要的复制 - 托管任何变更数据的页面 - 发生,而不必要的复制 - 自从fork以来没有被任何一个进程改变的页面 - 没有。

后者通常不仅包括未经修改的数据,还包括那些持有程序本身和已加载的共享库的数据 - 通常是可以共享的许多页面,而不是必须复制的几个页面。

一旦孩子调用了exec函数,就会终止共享(以及将来对copy-copy的任何需要)。