unix fork理解的简单练习

unix fork理解的简单练习,unix,fork,Unix,Fork,考虑到以下指示: for(int i = 0; i < 3; i++) fork(); 此问题的官方答案如下图所示: 我无法想象这个图形是如何创建的 这就是我绘制图表的方式 因此,第一个fork将创建父进程(p1)的子副本(p2)。我们有两个过程 第二个分支将通过创建子进程(p3和p4)复制p1和p2父进程 第三个fork将通过创建子进程(p5、p6、p7、p8)复制p1、p2、p3和p4 我怎样才能得到与我的老师相同的图表?如果你想要一个类似于官方答案的图表,试着停止思考事物

考虑到以下指示:

for(int i = 0; i < 3; i++)
    fork();
此问题的官方答案如下图所示:

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

这就是我绘制图表的方式

  • 因此,第一个fork将创建父进程(p1)的子副本(p2)。我们有两个过程

  • 第二个分支将通过创建子进程(p3和p4)复制p1和p2父进程

  • 第三个fork将通过创建子进程(p5、p6、p7、p8)复制p1、p2、p3和p4


  • 我怎样才能得到与我的老师相同的图表?

    如果你想要一个类似于官方答案的图表,试着停止思考事物是如何并发运行的,而是专注于一代又一代的过程(父母、孩子、孙子等等)

    一开始,有一个进程
    p0
    ,还有三个分叉。当执行这三个分叉时,它会创建带有两个分叉的
    p1
    p2
    带有一个分叉,而
    p3
    没有剩余分叉。然后退出
    p0
    (只剩下
    p1
    p2
    p3

    我们可以扔掉
    p3
    ,因为它没有叉子了,只剩下
    p1
    p2

    进程
    p1
    然后执行第二个fork生成
    p4
    ,只剩下一个fork,然后执行第三个fork生成
    p5
    ,不剩下任何fork<代码>p1现在完成并退出(
    p2
    p4
    p5
    保留)

    p3
    类似,
    p5
    可以被抛出,因为它没有叉子了。这就剩下了
    p2
    p4

    类似地,
    p2
    只剩下一个叉子,因此它创建了
    p6
    ,没有叉子。然后,
    p2
    p6
    由于没有叉子留下而退出,留下
    p4

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

    通过使用基于父级而非进程启动时的深度绘制图表(尽管启动时间(a)控制进程在特定深度水平存在的位置,例如,请参见
    p1
    p2
    p3
    ),您的图表应该与给定的图表匹配

    因此,请这样想:

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


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

    如果您想要类似于官方答案的图表,试着停止思考事物是如何并行运行的,而是专注于一代又一代的过程(父母、孩子、孙子等等)

    一开始,有一个进程
    p0
    ,还有三个分叉。当执行这三个分叉时,它会创建带有两个分叉的
    p1
    p2
    带有一个分叉,而
    p3
    没有剩余分叉。然后退出
    p0
    (只剩下
    p1
    p2
    p3

    我们可以扔掉
    p3
    ,因为它没有叉子了,只剩下
    p1
    p2

    进程
    p1
    然后执行第二个fork生成
    p4
    ,只剩下一个fork,然后执行第三个fork生成
    p5
    ,不剩下任何fork<代码>p1现在完成并退出(
    p2
    p4
    p5
    保留)

    p3
    类似,
    p5
    可以被抛出,因为它没有叉子了。这就剩下了
    p2
    p4

    类似地,
    p2
    只剩下一个叉子,因此它创建了
    p6
    ,没有叉子。然后,
    p2
    p6
    由于没有叉子留下而退出,留下
    p4

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

    通过使用基于父级而非进程启动时的深度绘制图表(尽管启动时间(a)控制进程在特定深度水平存在的位置,例如,请参见
    p1
    p2
    p3
    ),您的图表应该与给定的图表匹配

    因此,请这样想:

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


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

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

    生成P1 i=0
    生成p2i=1
    生成P3 i=2
    i=3不再<3

    P1
    生成P4 i=1,在生成P4时,i设置为1,因为右键是fork,i递增,之前为0。
    生成P5 i=2,
    我不再<3

    P2
    生成P6 i=2,生成P6时i也是2,因为调用fork时i是1。
    我不再<3

    P3
    我不再<3

    P4
    生成P7 i=2
    我不再<3


    好的,你明白了…

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

    生成P1 i=0
    生成p2i=1
    生成P3 i=2
    i=3不再<3

    P1
    生成P4 i=1,在生成P4时,i设置为1,因为右键是fork,i递增,之前为0。
    生成P5 i=2,
    我不再<3

    P2
    生成P6 i=2,生成P6时i也是2,因为调用fork时i是1。
    我不再<3

    P3
    我不再<3

    P4
    生成P7 i=2
    我不再<3

    好吧,你明白了……