【问题标题】:simple exercise of unix fork understanding简单练习 unix fork 理解
【发布时间】:2012-06-13 03:50:24
【问题描述】:

考虑以下说明:

for(int i = 0; i < 3; i++)
    fork();

我试图弄清楚创建进程的数量和创建图表的步骤。

所以上面的代码等价于:

fork();
fork();
fork();

这个问题的官方答案如下图所示:

我无法想象这个图表是如何创建的。

这就是我绘制图表的方式。

  1. 因此,第一个 fork 将创建父进程 (p1) 的子副本 (p2)。我们有 2 个流程。

  2. 第二个分叉,将通过创建子进程(p3 和 p4)来复制 p1 和 p2 父进程。

  3. 第三次分叉,将复制 p1、p2、p3 和 p4,通过创建子进程(p5、p6、p7、p8)

如何获得与老师相同的图表?

【问题讨论】:

    标签: unix fork


    【解决方案1】:

    如果您想要一个类似于官方答案的图表,请尝试停止思考事情是如何并发运行的,而是专注于进程的世代(父母、孩子、孙辈等)。

    一开始,有一个进程p0,还有三个fork。在进行这三个分叉时,它会创建有两个分叉的p1,一个有一个分叉的p2,一个没有分叉的p3。然后p0 退出(仅保留p1p2p3)。

    我们可以扔掉p3,因为它已经没有分叉了,只剩下p1p2)。

    进程p1 然后执行它的第二个fork,产生p4,只剩下一个fork,然后执行第三个fork,产生p5,没有剩下一个fork。 p1 现在完成并退出(p2p4p5 仍然存在)。

    类似于p3p5 可以被抛,因为它已经没有叉子了。这留下了p2p4

    同样,p2 只剩下一个叉子,所以它创建 p6 时没有叉子。然后p2p6 都因为没有叉子而退出,留下p4

    进程p4 只剩下一个分叉,因此它创建了没有分叉的p7,然后它们都退出了。

    通过基于父系而不是何时启动进程来绘制具有深度的图表(尽管开始时间(a)控制进程在特定深度水平存在的位置,例如,请参阅@987654350 @、p2p3),您的图表应该与给定的图表匹配。

    所以这样想:

      Sequence within generation -------->
    G
    e           ______p00______
    n          /       |       \
    e       p01       p02       p03
    r      /   \       |
    a   p04     p05   p06
    t    |
    i   p07
    o
    n
    |
    V
    

    (a) 请记住,此处定义的开始时间是流程开始存在的时间 - 流程执行实际有用工作的顺序还取决于日程安排的变幻莫测。

    【讨论】:

    • 非常明确的答案。谢谢,我刚刚意识到 fork() 在循环中也会复制 i..
    • 为了进一步澄清,除了代码之外,衍生进程还继承了程序计数器的值。这就是为什么@paxdiablo 说“两个叉子走”等等。
    【解决方案2】:

    如果我们从 P0 开始,它会生成进程 P1、P2 和 P3,但每个进程会有不同的 i,因为在 fork 时我们已经复制了堆栈上的所有值。

    生成 P1 i = 0
    生成 P2 i = 1
    生成 P3 i = 2
    i = 3 不再
    P1
    生成 P4 i = 1,生成 P4 时 i 设置为 1,因为它是 fork i 递增并且之前为 0。
    生成 P5 i = 2,
    我不再
    P2
    生成 P6 i = 2,再次生成 P6 时 i 为 2,因为在调用 fork 时它为 1。
    我不再
    P3
    我不再
    P4
    生成 P7 i = 2
    我不再

    你明白了....

    【讨论】:

    • 你了解图表的来源吗?
    • 是的,我明白了,我刚刚意识到我在调用 fork 时被复制了..!谢谢!
    • 没问题,这是学习分叉的好方法。最难理解的部分是 forks 复制了进程的状态,所以你必须记住,当调用 forks 时,所有变量都被复制,以及它们所处的状态......令人惊奇的是它复制堆栈和堆,现在这令人印象深刻。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多