2013-03-08 86 views
6

我有這樣的代碼,並試圖瞭解有多少進程和線程將從此被創建:將創建多少個進程和線程?

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

我認爲它會創建2個線程,從叉如果循環中。和8個進程?但林不知道這是否正確

+2

沒有循環。這是一個「如果」。 – QuentinUK 2013-03-08 18:33:27

+0

爲什麼8個進程?其中一個fork調用在if測試中。 – didierc 2013-03-08 18:50:32

回答

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

這個問題取自(據我所知)_Operating System Concepts 9th Edition_,在第183頁上說明,如果「單獨的進程在分叉後不調用exec(),則單獨的進程應該複製所有線程。」這意味着將有10個線程。這是不準確的嗎?它還指出:「一些UNIX系統選擇了兩個版本的fork(),一個複製所有線程,另一個只複製調用fork()系統調用的線程。」 – Sammaron 2016-02-24 23:47:09

+0

@Sammaron:查看[此手冊頁](http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html)。 – jxh 2016-03-24 18:40:17

7

每次調用fork時會創建一個額外的進程。

在第一次調用fork時,父進程P創建子進程SP1。 分叉後,父進程再次調用fork(跳過if),創建子進程SP2。

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.

正在創建的進程和線程的示例與代碼相關。

      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 

因爲我用*來表示線程。

相關問題