【问题标题】:How is unnecessary copying prevented in fork-exec?在 fork-exec 中如何防止不必要的复制?
【发布时间】:2012-12-05 00:35:20
【问题描述】:

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

  1. fork() 返回后,子进程准备执行
  2. 由于 Copy On Write 机制,fork-exec 序列可以保证防止不必要的父内存复制

我所说的 fork-exec 序列是这样的:

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

据我所知翻译成这个(用伪asm写的):

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

让我们假设 parent 已被授予足够的 CPU 时间来一次执行上述所有行。

  1. fork 返回 0,因此跳过第 3 行
  2. 当 0 存储在“i”中时,子级尚未执行,因此 COW 开始执行 (不必要地)复制父母的记忆。

那么在这种情况下如何防止不必要的复制? 看起来不是,但我认为 linux 开发人员足够聪明,可以做到这一点;)

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

【问题讨论】:

  • 我不认为 COW 是这里的角色。

标签: process linux-kernel fork


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 2017-12-18
      • 2021-07-25
      • 2021-06-24
      • 2021-10-09
      • 2015-02-06
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多