How many processes and threads will be created?

空扰寡人 提交于 2019-11-29 10:28:41

Actually, there should be 8 threads and 6 processes.

Here's the diagrams to make it clear:

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]

important: Remember that the fork(2) call clones just the thread which executed it, thus process 4 [p4] has only one thread (same apply to process 5[p5]).

One extra process will get created each time fork is called.

On first call to fork, parent process P creates sub-process SP1. After fork, parent process calls fork again (skipping the if), creating sub-process SP2.

SP1 after fork calls fork inside if, creates sub-sub-process SSP1. SP1 then spawns a thread. SP1 leaves the if. and calls fork again, creating sub-sub-process SSP2.

SSP1 spawns a thread. SSP1 leaves the if, and calls fork, creating sub-sub-sub-process SSSP.

So, processes created: SP1, SP2, SSP1, SSP2, SSSP = 5 processes. If you count the original process P, there are 6 processes.

Only SP1 and SSP1 spawn threads, so there are 2 threads created. If you count all the main threads of all the processes, there are 7 or 8 threads, depending on whether or not you count the original process P.

An illustration of the processes and threads being created correlated to the code.

                         P
pid t pid;               |
pid = fork();            +------SP1
if (pid == 0) {          |      |
 fork();                 |      +---------------SSP1
 thread create(...);     |      |-SP1's thread  |-SSP1's thread
}                        |      |               |
fork();                  +-SP2  +-SSP2          +-SSSP
                         | |    | |             | |
mccneedle

shouldn't it be 2 threads and 6 processes?

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

as I use * to represent thread.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!