2013-03-08 7 views
6

私はこのコードを持っており、これから作成されますどのように多くのプロセスとスレッド理解しよう:作成されるプロセスとスレッドの数はいくつですか?

pid t pid; 
pid = fork(); 
if (pid == 0) { /* child process */ 
fork(); 
thread create(. . .); 
} 
fork(); 

私はそれがあれば、ループ内のフォークから2つのスレッドが作成されますと思います。と8つのプロセス?しかし、私はそれが正しいかどうかわからない

+2

ループはありません。それは "if"です。 – QuentinUK

+0

なぜ8つのプロセス? 'fork'コールの1つはifテストにあります。 – didierc

答えて

10

実際には、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])。

+0

この質問は、「別のプロセスがfork()後にexec()を呼び出さないと、別のプロセスがすべてのスレッドを複製するはずです」というページ183の_Operating System Concepts 9th Edition_から取られます。これは10スレッドがあることを意味します。これは不正確ですか?また、「一部のUNIXシステムでは、fork()の2つのバージョン(すべてのスレッドを複製するバージョンと、fork()システムコールを呼び出したスレッドのみを複製するバージョン)の両方を選択しました。 – Sammaron

+0

@Sammaron:[このマニュアルページ](http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html)を参照してください。 – jxh

7

forkが呼び出されるたびに、1つの追加プロセスが作成されます。

最初にforkを呼び出すと、親プロセスPがサブプロセスSP1を作成します。 フォーク後、親プロセスはサブプロセスSP2を作成してfork(をスキップ)を再度呼び出します。

SP1 forkifにコールした後、サブサブプロセスSSP1を作成します。 SP1はスレッドを生成します。 SP1はifのままです。 forkを再度呼び出して、サブサブプロセスSSP2を作成します。

SSP1がスレッドを生成します。 SSP1はifを残し、forkを呼び出し、サブサブサブプロセスSSSPを作成します。

したがって、プロセスが作成されました:SP1、SP2、SSP1、SSP2、SSSP = 5プロセス。 元のプロセスPを数えた場合、6つのプロセスがあります。

SP1とSSP1だけがスレッドを生成するため、2つのスレッドが作成されます。すべてのプロセスのメインスレッドをすべてカウントすると、元のプロセス数をカウントするかどうかによって、スレッド数は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 
         | | | |    | | 
0

2つのスレッドと6つのプロセスではいけませんか?

M 
| ↘ 
M  A 
|  |↘ 
M  A* B* 
|  | | 
| ↘ | ↘ |↘ 
M C A D B E 

スレッドを表すために*を使用しています。

関連する問題