我有這樣的代碼,並試圖瞭解有多少進程和線程將從此被創建:將創建多少個進程和線程?
pid t pid;
pid = fork();
if (pid == 0) { /* child process */
fork();
thread create(. . .);
}
fork();
我認爲它會創建2個線程,從叉如果循環中。和8個進程?但林不知道這是否正確
我有這樣的代碼,並試圖瞭解有多少進程和線程將從此被創建:將創建多少個進程和線程?
pid t pid;
pid = fork();
if (pid == 0) { /* child process */
fork();
thread create(. . .);
}
fork();
我認爲它會創建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]只有一個線程(同樣適用於過程5 [p5])。
這個問題取自(據我所知)_Operating System Concepts 9th Edition_,在第183頁上說明,如果「單獨的進程在分叉後不調用exec(),則單獨的進程應該複製所有線程。」這意味着將有10個線程。這是不準確的嗎?它還指出:「一些UNIX系統選擇了兩個版本的fork(),一個複製所有線程,另一個只複製調用fork()系統調用的線程。」 – Sammaron 2016-02-24 23:47:09
@Sammaron:查看[此手冊頁](http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html)。 – jxh 2016-03-24 18:40:17
每次調用fork
時會創建一個額外的進程。
在第一次調用fork
時,父進程P創建子進程SP1。 分叉後,父進程再次調用fork
(跳過if
),創建子進程SP2。
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個線程。如果您計算所有進程的所有主線程,則有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
| | | | | |
不應該是2個線程和6個進程嗎?
M
| ↘
M A
| |↘
M A* B*
| | |
| ↘ | ↘ |↘
M C A D B E
因爲我用*來表示線程。
沒有循環。這是一個「如果」。 – QuentinUK 2013-03-08 18:33:27
爲什麼8個進程?其中一個fork調用在if測試中。 – didierc 2013-03-08 18:50:32