【问题标题】:vfork:Understanding Issue:vfork:理解问题:
【发布时间】:2011-09-26 20:22:26
【问题描述】:

我对@9​​87654321@ 的功能感到困惑。我读到在vfork() 的情况下,父进程和子进程用于在它们之间共享页面。它不支持任何写时复制功能。这意味着,如果子进程在其时间片期间进行了一些更改,则所有这些更改将在父进程返回时对父进程可见。还提到,vfork() 系统调用仅在子进程创建后才执行exec 系统调用时才有用。

假设子进程使用ls 执行exec 系统调用。现在,根据exec 调用,ls 程序将被加载到子进程的地址空间。现在,当父进程的时间片启动时,它可能会在其 PC 上执行不同的指令,这可能会导致该进程的行为有所不同。

有人可以向我解释一下这种情况吗,vfork() 电话在这种情况下有何帮助?

【问题讨论】:

  • 不完全;请注意,这个问题的答案都在更高的层次上,而这个问题需要一个较低层次的观点。
  • @Learner:我在你的问题中用时间片替换了时间戳——希望这就是你的意思。如果没有,请随时再次编辑。

标签: operating-system system-calls


【解决方案1】:

vfork() 的重点不是为将立即再次丢弃它的孩子分配新的地址空间。因此,vfork() 省略了 fork() 为子进程创建新地址空间(页表和分配)的部分,而是设置了一个标志,execve() 将其解释为意味着它应该分配一个新的页表和在使用新的可执行文件及其请求的初始堆 (BSS) 填充进程之前,为进程创建堆栈。

【讨论】:

  • 感谢您的回复,因此这意味着 "execve" 系统调用过去在 vfork() 的情况下表现不同。通常,它会覆盖调用进程的二进制映像,但在 vfork() 的情况下,它会创建新的地址空间来执行其作业。纠正我,如果我错了。
  • @Learner:这有点错误。 execve 总是创建一个新的页表、堆栈等。旧的通常同时被销毁,但如果它们与另一个进程(父进程)共享,它们只会减少共享引用。跨度>
【解决方案2】:

execve() 释放当前进程的内存映射并分配新的。退出进程也会最终释放该进程的内存映射。

传统上,vfork() 会暂停父进程,直到子进程停止使用父进程的内存映射。唯一安全的方法是通过execve()_exit()

假设子进程执行 exec 系统调用 ls。现在,根据 exec 调用,将加载 ls 程序 到子进程的地址空间。

其实ls会被加载到一个新的地址空间中,父级的地址空间在子级上释放。

【讨论】:

  • 感谢您对我的查询的答复。你的回复让我现在更好地理解了“geekosaur”的回复。但我仍然想了解更多关于 execve 系统调用的信息。我读到 execve() 系统调用用新的进程映像覆盖当前进程映像,但根据您的回复,它会删除旧的并分配一个新的。能否请您再次更新我的信息?
猜你喜欢
  • 2015-11-21
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2011-08-21
  • 2017-03-12
相关资源
最近更新 更多