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();
此问题的官方答案如下图所示:
我无法想象这个图形是如何创建的
这就是我绘制图表的方式
我怎样才能得到与我的老师相同的图表?如果你想要一个类似于官方答案的图表,试着停止思考事物是如何并发运行的,而是专注于一代又一代的过程(父母、孩子、孙子等等) 一开始,有一个进程
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 好吧,你明白了……