2013-03-08 2 views
6

У меня есть этот код и пытаясь понять, сколько процессов и потоков будет создан из этого:Сколько процессов и потоков будет создано?

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

Я думаю, что это создает 2 нити, от вилки внутри если петли. и 8 процессов? Но я не уверен, если это правильно

+2

Нет петли. Это «если». – QuentinUK

+0

Почему 8 процессов? один из вызовов 'fork' находится в тесте 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] имеет только один поток (же обратиться процесс 5 [p5]).

+0

Этот вопрос взят из (насколько я могу судить) _Очистить системные концепции 9-го издания_, который заявляет на стр. 183, что если «отдельный процесс не вызывает exec() после форкирования, отдельный процесс должен дублировать все потоки». Это будет означать, что будет 10 потоков. Это неточно? В нем также говорится, что «Некоторые UNIX-системы выбрали две версии fork(), которые дублируют все потоки и другие, которые дублируют только поток, вызывающий системный вызов fork()». – Sammaron

+0

@Sammaron: См. [Эта страница руководства] (http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html). – jxh

7

Один дополнительный процесс будет создан каждый раз, когда вызывается fork.

При первом вызове fork родительский процесс P создает подпроцесс SP1. После того, как fork, родительский процесс вызовет fork еще раз (пропустив if), создав подпроцесс SP2.

SP1 после вызовов fork fork внутри if, создает под-подпроцесс 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.

Иллюстрация процессов и потоков, создаваемых в соответствии с кодом.

      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 

как я использую * для представления нить.

Смежные вопросы