为什么我们需要分叉来创建新流程?

萨尔塔克

在Unix中,每当我们要创建一个新进程时,便会分叉当前进程,并创建一个与父进程完全相同的新子进程。然后我们执行一个exec系统调用,将父流程中的所有数据替换为新流程中的数据。

为什么我们首先创建父流程的副本,而不直接创建新流程?

马克·普洛特尼克

简而言之,fork是在Unix中,因为当时它很容易安装到现有系统中,并且伯克利前身系统已经使用了fork的概念。

摘自Unix分时系统的演进(相关文本已突出显示):

几天之内就设计并实施了现代形式的过程控制。令人惊讶的是,它很容易安装到现有系统中;同时,很容易看到设计中某些稍微不寻常的功能是如何呈现的,因为它们代表了对存在的内容的细微,易于编码的更改一个很好的例子是fork和exec函数的分离。创建新流程的最常见模型包括指定要执行的流程的程序。在Unix中,分叉的进程将继续与其父进程运行相同的程序,直到执行显式的exec。这些功能的分离当然不是Unix独有的,事实上,它存在于汤普森众所周知的伯克利分时系统中。仍然可以合理地假设它存在于Unix中,主要是因为可以很容易地实现fork而不改变其他内容该系统已经处理了多个(即两个)过程。有一个进程表,并且进程在主内存和磁盘之间交换。fork的初始实现只需要

1)扩展过程表

2)添加了一个fork调用,该调用使用已存在的swap IO原语将当前进程复制到磁盘交换区域,并对进程表进行了一些调整。

实际上,PDP-7的fork调用恰好需要27行汇编代码。当然,还需要对操作系统和用户程序进行其他更改,其中一些更改非常有趣且出乎意料。但是,仅仅因为不存在这样的exec,合并的fork-exec就会复杂得多它的功能已经由外壳使用显式IO执行。

从那篇论文开始,Unix就发展了。fork其次exec不再是运行程序的唯一方法。

  • vfork的创建是为了在新进程打算在该分支之后立即执行exec的情况下提高效率。执行vfork之后,父进程和子进程共享相同的数据空间,并且父进程被挂起,直到子进程执行程序或退出。

  • posix_spawn在一个系统调用中创建一个新进程并执行一个文件。它带有许多参数,可让您有选择地共享调用者的打开文件,并将其信号处置和其他属性复制到新进程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们需要adsense来注册admob

来自分类Dev

为什么我们需要创建新的Icollection类型属性实例

来自分类Dev

为什么我们需要创建新的Icollection类型属性实例

来自分类Dev

为什么我们需要创建CFC的实例?

来自分类Dev

为什么我们需要创建CFC的实例?

来自分类Dev

我们为什么需要容器?

来自分类Dev

为什么我们需要IO?

来自分类Dev

为什么我们使用损失来更新我们的模型,但使用指标来选择我们需要的模型?

来自分类Dev

为什么我们需要安装 http 模块来运行我们的 node js 应用程序?

来自分类Dev

为什么我们需要测试用例来针对纯POJO运行

来自分类Dev

为什么我们需要框架来做依赖关系解析器?

来自分类Dev

为什么我们需要时间采样来绘制平稳信号?

来自分类Dev

为什么我们需要另一个模式来进行模式缝合?

来自分类Dev

为什么我们需要`Asyncio.sleep`来启动循环?

来自分类Dev

为什么我们需要时间采样来绘制平稳信号?

来自分类Dev

为什么我们需要放置源名称来进行重定向?

来自分类Dev

为什么我们需要用圆括号来定义析构函数?

来自分类Dev

为什么我们需要通过 InterfaceFactory 来获取对象而不是仅仅传递特定的对象

来自分类Dev

为什么我们需要从网上下载程序来编程?

来自分类Dev

为什么我们需要在应用加载时使用 BeginInvokeOnMainThread 来显示 DisplayAlert

来自分类Dev

为什么我们应该创建一个 Maven 项目来编写测试脚本

来自分类Dev

为什么我们需要为守护程序创建一个新会话?

来自分类Dev

为什么在Scala中创建List时我们需要Nil?

来自分类Dev

为什么我们需要ClientConfig创建客户端(使用球衣)

来自分类Dev

为什么我们需要为 openstack 创建 localrc 文件

来自分类Dev

什么是BIOS,为什么我们需要它?

来自分类Dev

我们为什么要创建一个新的 kafka 用户?

来自分类常见问题

为什么我们需要使用flatMap?

来自分类Dev

为什么我们需要Clojure中的'in(require'[...]])?

Related 相关文章

  1. 1

    为什么我们需要adsense来注册admob

  2. 2

    为什么我们需要创建新的Icollection类型属性实例

  3. 3

    为什么我们需要创建新的Icollection类型属性实例

  4. 4

    为什么我们需要创建CFC的实例?

  5. 5

    为什么我们需要创建CFC的实例?

  6. 6

    我们为什么需要容器?

  7. 7

    为什么我们需要IO?

  8. 8

    为什么我们使用损失来更新我们的模型,但使用指标来选择我们需要的模型?

  9. 9

    为什么我们需要安装 http 模块来运行我们的 node js 应用程序?

  10. 10

    为什么我们需要测试用例来针对纯POJO运行

  11. 11

    为什么我们需要框架来做依赖关系解析器?

  12. 12

    为什么我们需要时间采样来绘制平稳信号?

  13. 13

    为什么我们需要另一个模式来进行模式缝合?

  14. 14

    为什么我们需要`Asyncio.sleep`来启动循环?

  15. 15

    为什么我们需要时间采样来绘制平稳信号?

  16. 16

    为什么我们需要放置源名称来进行重定向?

  17. 17

    为什么我们需要用圆括号来定义析构函数?

  18. 18

    为什么我们需要通过 InterfaceFactory 来获取对象而不是仅仅传递特定的对象

  19. 19

    为什么我们需要从网上下载程序来编程?

  20. 20

    为什么我们需要在应用加载时使用 BeginInvokeOnMainThread 来显示 DisplayAlert

  21. 21

    为什么我们应该创建一个 Maven 项目来编写测试脚本

  22. 22

    为什么我们需要为守护程序创建一个新会话?

  23. 23

    为什么在Scala中创建List时我们需要Nil?

  24. 24

    为什么我们需要ClientConfig创建客户端(使用球衣)

  25. 25

    为什么我们需要为 openstack 创建 localrc 文件

  26. 26

    什么是BIOS,为什么我们需要它?

  27. 27

    我们为什么要创建一个新的 kafka 用户?

  28. 28

    为什么我们需要使用flatMap?

  29. 29

    为什么我们需要Clojure中的'in(require'[...]])?

热门标签

归档