【问题标题】:How many processes and threads will be created?将创建多少进程和线程?
【发布时间】:2013-02-24 09:37:21
【问题描述】:

我有这段代码,并试图了解从中创建多少进程和线程:

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

我认为它从 if 循环内的 fork 创建了 2 个线程。和8个过程?但我不确定这是否正确

【问题讨论】:

  • 没有循环。那是一个“如果”。
  • 为什么是 8 个进程? fork 调用之一在 if 测试中。

标签: multithreading fork pid


【解决方案1】:

总分叉进程=5 线程创建是=2

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

不应该是2线程6进程吗?

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

因为我使用 * 来表示线程。

【讨论】:

    【解决方案3】:

    每次调用fork 时都会创建一个额外的进程。

    在第一次调用fork 时,父进程 P 创建子进程 SP1。 fork 后,父进程再次调用fork(跳过if),创建子进程SP2。

    SP1在if内部fork调用fork后,创建子子进程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
                             | |    | |             | |
    

    【讨论】:

      【解决方案4】:

      其实应该有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:见this man page
      • 为什么pthread_create后p1和p2下有2个线程?
      猜你喜欢
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 2017-02-25
      • 2012-01-04
      相关资源
      最近更新 更多