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

Process 如何在fork exec中防止不必要的复制?,process,linux-kernel,fork,Process,Linux Kernel,Fork,今天我参加了一个关于linux进程的讲座。老师说: fork()返回后,子进程就可以执行了 由于写时复制机制,fork exec序列可以保证防止不必要地复制父内存 我所说的fork exec sequence是指类似的内容: if(!fork()) { exec(...); } i = 0; 据我所知,这可以转化为(用伪asm编写): 让我们假设父级已被授予足够的CPU时间,以便在一次运行中执行上述所有行 fork返回0,因此跳过第3行 当0存储在“i”中时,子对象还没有执行,所以CO

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

  • fork()返回后,子进程就可以执行了
  • 由于写时复制机制,fork exec序列可以保证防止不必要地复制父内存
  • 我所说的fork exec sequence是指类似的内容:

    if(!fork())
    {
        exec(...);
    }
    i = 0;
    
    据我所知,这可以转化为(用伪asm编写):

    让我们假设父级已被授予足够的CPU时间,以便在一次运行中执行上述所有行

  • fork返回0,因此跳过第3行
  • 当0存储在“i”中时,子对象还没有执行,所以COW开始执行 复制(不必要地)父级内存
  • 那么在这种情况下如何防止不必要的复制呢? 看起来不是,但我认为linux开发人员足够聪明,可以做到这一点;)

    可能的答案:子级总是首先运行(父级在调用fork()后被抢占) 1.这是真的吗?
    2.如果是,这能保证在所有情况下都能防止不必要的复制吗?

    答案基本上是,必要的复制——对托管任何更改数据的页面进行复制,而不必要的复制——对自fork以来任何一个进程都没有更改过的页面进行复制

    后者通常不仅包括未修改的数据,还包括那些保存程序本身及其加载的共享库的数据——通常包括许多可以共享的页面,而只有少数页面必须复制


    一旦子进程调用exec函数,共享(以及将来写入时复制的任何需要)就会终止。

    答案基本上是,必要的复制(托管任何已更改数据的页面)会发生,而不必要的复制(自fork以来未被任何一个进程更改的页面)不会发生

    后者通常不仅包括未修改的数据,还包括那些保存程序本身及其加载的共享库的数据——通常包括许多可以共享的页面,而只有少数页面必须复制


    一旦孩子调用exec函数,共享(以及以后写时复制的任何需要)就会终止。

    基本上两个人可以阅读同一本书。但是,如果一个人开始在页边空白处写笔记,那么另一个人就需要一份该页的复印件。没有在页边空白处书写的人不想看到书中其他人的注释。

    基本上两个人可以阅读同一本书。但是,如果一个人开始在页边空白处写笔记,那么另一个人就需要一份该页的复印件。没有在页边空白处书写的人不想看到书中其他人的笔记。

    我不认为COW在这里起作用。我不认为COW在这里起作用。
    call fork
    jz next
    call exec(...)
    next:
    load 0
    store i