私はこのコードを持っており、これからいくつのプロセスとスレッドが作成されるかを理解しようとしています:
pid t pid;
pid = fork();
if (pid == 0) { /* child process */
fork();
thread create( . . .);
}
fork();
ifループ内のフォークから2つのスレッドを作成すると思います。と8つのプロセス?しかし、それが正しいかどうかはわかりません
私はこのコードを持っており、これからいくつのプロセスとスレッドが作成されるかを理解しようとしています:
pid t pid;
pid = fork();
if (pid == 0) { /* child process */
fork();
thread create( . . .);
}
fork();
ifループ内のフォークから2つのスレッドを作成すると思います。と8つのプロセス?しかし、それが正しいかどうかはわかりません
実際には、8つのスレッドと6つのプロセスが必要です。
明確にするための図は次のとおりです。
1) after first fork():
|------------------- child of p0 [p1]
---|------------------- parent [p0]
2) after second fork():
|--------------- child of p1 [p2]
|---|--------------- [p1]
---|------------------- [p0]
3) after pthread_create():
----------- thread 1 of p2 [p2t1]
|---/----------- thread 0 of p2 [p2t0]
| ----------- thread 1 of p1 [p1t1]
|---|---/----------- thread 0 of p1 [p1t0]
---|------------------- [p0]
4) after third fork():
|------------ child of p2 [p5]
| ------ [p2t1]
|-|-----/------ [p2t0]
| |---------- child of p1 [p4]
| | ------ [p1t1]
|---|---|---/------ [p1t0]
| |------------ child of p0 [p3]
---|-----|------------ [p0]
重要: fork (2)呼び出しは、それを実行したスレッドのみを複製するため、プロセス4 [p4]にはスレッドが1つしかないことに注意してください(プロセス5 [p5]にも同じことが当てはまります)。
fork
が呼び出されるたびに、1つの追加プロセスが作成されます。
の最初の呼び出しでfork
、親プロセスPはサブプロセスSP1を作成します。フォーク後、親プロセスはfork
再び呼び出し(をスキップif
)、サブプロセスSP2を作成します。
fork
SP1は、内部でforkを呼び出した後if
、サブサブプロセスSSP1を作成します。次に、SP1はスレッドを生成します。SP1はを残しますif
。再度呼び出してfork
、サブサブプロセスSSP2を作成します。
SSP1はスレッドを生成します。SSP1は、を離れてif
呼び出しfork
、サブサブサブプロセスSSSPを作成します。
したがって、作成されたプロセス:SP1、SP2、SSP1、SSP2、SSSP=5プロセス。元のプロセスPを数えると、6つのプロセスがあります。
SP1とSSP1のみがスレッドを生成するため、2つのスレッドが作成されます。すべてのプロセスのすべてのメインスレッドをカウントする場合、元のプロセスPをカウントするかどうかに応じて、7つまたは8つのスレッドがあります。
作成されているプロセスとスレッドの図は、コードに関連付けられています。
P
pid t pid; |
pid = fork(); +------SP1
if (pid == 0) { | |
fork(); | +---------------SSP1
thread create(...); | |-SP1's thread |-SSP1's thread
} | | |
fork(); +-SP2 +-SSP2 +-SSSP
| | | | | |
2つのスレッドと6つのプロセスであるべきではありませんか?
M
| ↘
M A
| |↘
M A* B*
| | |
| ↘ | ↘ |↘
M C A D B E
スレッドを表すために*を使用します。
合計フォークプロセスis=5スレッド作成is=2