1

次の指示を考慮してください。

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

作成されたプロセスの数とグラフ作成の手順を把握しようとします。

したがって、上記のコードは次のものと同等です。

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

この問題に対する公式の回答は、次のグラフに示されています。

グラフ

このグラフがどのように作成されるかを視覚化できません。

これが私がグラフを描いた方法です。

  1. したがって、最初の fork は親プロセス (p1) の子コピー (p2) を作成します。2つのプロセスがあります。

  2. 2 番目のフォークは、子プロセス (p3 および p4) を作成することにより、p1 および p2 の親を複製します。

  3. 3 番目のフォークは、子プロセス (p5、p6、p7、p8) を作成することにより、p1、p2、p3、および p4 を複製します。

どうすれば先生と同じグラフを取得できますか?

4

2 に答える 2

6

公式の回答に似たグラフが必要な場合は、物事がどのように同時に実行されるかを考えるのをやめ、代わりにプロセスの世代 (親、子、孫など) に集中してください。

最初は 1 つのプロセスがありp0、3 つのフォークがあります。これらの 3 つのフォークを実行すると、残りのフォークp1が 2 つ、残りのフォークp2が 1 つになり、p3残りのフォークがなくなります。次にp0終了します ( のみp1p2およびp3残ります)。

フォークが残っていないので、と)p3だけを残して捨てることができます。p1p2

次に、プロセスは 1 つのフォークを残しp1て 2 番目のフォーク生成p4を実行し、次にフォークを残さずに 3 番目のフォーク作成p5を実行します。p1これで完了し、終了します ( p2p4およびp5残ります)。

と同様にp3p5フォークが残っていないため、投げることができます。これはp2と を残しp4ます。

同様に、p2フォークが 1 つ残っていたので、フォークが残っていない状態で作成p6されます。次に、フォークが残っていないため、p2との両方がp6終了し、 を残しp4ます。

プロセスp4にはフォークが 1 つ残っていたため、フォークなしで作成p7され、両方とも終了します。

プロセスがいつ開始されるかではなく、親子関係に基づいた深さでチャートを描くことによって (ただし、開始時間(a)はプロセスが特定の深さで水平方向に存在する場所を制御します。たとえば、 および を参照p1p2てくださいp3)、図は与えられたものと一致するはずです。

したがって、次のように考えてください。

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

(a)ここで定義されている開始時刻は、プロセスが存在するときであることに注意してください。プロセスが実際の有用な作業を実行する順序は、スケジューリングの気まぐれにも依存します。

于 2012-06-13T04:03:15.963 に答える
1

P0 から開始すると、プロセス P1、P2、および P3 が生成されますが、フォークの時点でスタック上のすべての値がコピーされているため、各プロセスの i は異なります。

P1 を生成 i = 0
を生成 P2 i = 1
を生成 P3 i = 2 を生成
i = 3を生成

P1
を生成 P4 i = 1 を生成 i は P4 を生成するときに 1 に設定.
P5 i = 2 を生成します
。i はもはや < 3ではありません

。P2
は P6 i = 2 を生成します。フォークが呼び出されたときは 1 だったので、P6 を生成するときの i は 2 です。
i が < 3 ではなくなった

P3
i が< 3 ではなくなった

P4
が P7 を生成する i = 2
i が < 3 ではなくなった

そして、あなたはアイデアを得る....

于 2012-06-13T04:14:57.697 に答える