考虑以下说明:
for(int i = 0; i < 3; i++)
fork();
Run Code Online (Sandbox Code Playgroud)
我试着弄清楚创建过程的数量和图形创建的步骤.
所以上面的代码等同于:
fork();
fork();
fork();
Run Code Online (Sandbox Code Playgroud)
此图表说明了此问题的官方答案:
我无法想象如何创建此图表.
这就是我绘制图形的方法.
所以,第一个fork将创建父进程(p1)的子副本(p2).我们有2个过程.
第二个fork,将通过创建子进程(p3和p4)复制p1和p2父级.
第三个分支,将通过创建子进程(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而没有左叉.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
Run Code Online (Sandbox Code Playgroud)
(a)请记住,此处定义的开始时间是流程何时成立 - 流程执行实际有用工作的顺序也取决于调度的变幻莫测.