考虑以下说明:
for(int i = 0; i < 3; i++)
fork();
我试着弄清楚创建过程的数量和图表创建的步骤。
所以上面的代码等同于:
fork();
fork();
fork();
此图表说明了此问题的正式答案:
我无法想象如何创建此图表。
这就是我绘制图表的方式。
因此,第一个fork将创建父进程(p1)的子副本(p2)。我们有2个流程。
第二个分支,将通过创建子进程(p3和p4)复制p1和p2父代。
第三个分支,将通过创建子进程(p5,p6,p7,p8)复制p1,p2,p3和p4
如何获得与我老师相同的图表?
答案 0 :(得分:6)
如果你想要一个类似官方答案的图表,试着不要再考虑事情是如何同时运行的,而是集中在几代人的过程(父母,孩子,孙子女等)上。
一开始,有一个进程p0
,有三个分叉。在执行这三个分支时,它会创建p1
,其中有两个分叉,p2
有一个分叉,p3
没有分叉。然后p0
退出(仅p1
,p2
和p3
仍然存在。)
我们可以抛弃p3
,因为它没有任何货叉,仅留下p1
和p2
。
进程p1
然后执行第二个fork生成p4
,剩下一个fork,然后执行第三个fork p5
而没有左叉。 p1
现已完成并退出(p2
,p4
和p5
仍然存在。)
与p3
类似,p5
可以被抛出,因为它没有任何叉子。这会留下p2
和p4
。
同样地,p2
剩下一个叉子,因此它创建p6
而没有任何叉子。然后p2
和p6
退出,因为没有任何货叉,只留下p4
。
流程p4
剩下一个分叉,因此它创建没有分叉的p7
,然后它们都退出。
通过基于父母而不是开始进程绘制深度图表(尽管开始时间(a)控制进程在特定深度水平存在的位置,例如,请参阅{{ 1}},p1
和p2
),您的图表应与给定的图表匹配。
所以想一想:
p3
(a)请记住,此处定义的开始时间是流程何时出现 - 流程执行实际有用工作的顺序也取决于调度的变幻莫测。
答案 1 :(得分:1)
如果我们从P0开始它将生成进程,P1,P2和P3,但每个进程将有不同的i,因为在fork的那一刻我们已经复制了堆栈上的所有值。
生成P1 i = 0
生成P2 i = 1
生成P3 i = 2
i = 3不再&lt; 3
P1
生成P4 i = 1,生成P4时i设置为1,因为它是fork i增加,之前是0。
生成P5 i = 2,
我不再&lt; 3
P2
生成P6 i = 2,生成P6时i为2,因为调用fork时为1
我不再&lt; 3
P3
我不再&lt; 3
P4
生成P7 i = 2
我不再&lt; 3
嗯,你明白了......