请考虑以下用C语言编写的代码。在执行while(1);
时,我们将分别具有多少个进程和线程?
int main(void)
{
int i;
for (i=0; i<3; i++)
fork();
while(1);
}
进程将始终具有主线程,否则它将无法将其自身调度到线程队列中,从而使物理处理器无法执行指令。
此外,您可以产生多少个进程/线程没有真正的限制,因为它受系统上内存量的限制。
您的以下代码,假设fork没有失败,除了您的父进程,将生成3个进程,每个进程1个线程
这意味着包括您的父进程,4个进程和4个线程。
请参阅David Schwartz回答
一种简单的判断方法是在while(1)
循环之前添加此行:
printf("I am process: %d, my parent is %d\n", (int) getpid(), (int) getppid());
示例输出:
我正在处理:4365,我的父母是8358我正在处理:4366,我的父母是4365我正在处理:4367,我的父母是4365我正在处理:4369,我的父母是4365我正在处理:4368,我的父母是4366我正在处理:4370,我的父母是4366我正在处理:4371,我的父母是4367我正在处理:4372,我的父母是4368
总共有8个进程,每个进程有一个线程。
发生了什么事? 8358是我的外壳。当我执行此代码时,它创建了进程4365。就是这样。
4365创建了三个进程,一个进程有两个要循环的循环(4366),一个进程有一个要循环的循环(4367),最后一个循环(4369)。那是另外三个,所以现在我们最多四个。
它创建的具有两个循环的循环(4366)创建了另外两个进程,一个进程具有一个循环要循环(4368),一个进程没有循环要循环(4370)。那是另外两个,所以现在我们最多六个。
我们还有两个进程需要一个循环,一个由第一个进程(4367)创建,另一个由第二个进程(4368)创建。每一个都创建一个新进程(4371和4372)。还有两个,所以现在我们到了8。