【发布时间】:2014-08-30 11:17:30
【问题描述】:
谁能解释一下这个 C 代码是如何工作的?完成后会产生多少个进程?
int main(void)
{
int i;
for(i=1; i<=42; i++)
{
fork();
}
return 0;
}
【问题讨论】:
-
你认为创造了多少?
谁能解释一下这个 C 代码是如何工作的?完成后会产生多少个进程?
int main(void)
{
int i;
for(i=1; i<=42; i++)
{
fork();
}
return 0;
}
【问题讨论】:
在for 循环的每次迭代中,fork 只被调用一次。每次调用fork 都会创建一个新进程;最后产生多少进程取决于循环的长度。
如果循环的长度为 1,则只会创建一个新进程,总共 2 个进程。
如果循环的长度为 2,则在第一次迭代时将创建一个新进程;然后每个进程将在下一次迭代中生成另一个进程,总共调用了 3 次 fork 和 4 个进程。
如您所想,每次迭代过程的数量都会翻倍;如果n 是循环的长度,我们说进程总数将是f(n) = 2^n(产生2^n - 1 进程)。让我们通过归纳来证明它是正确的。我们已经看到该公式适用于n=1 和n=2。假设它对n 有效,并为n+1 证明它。
如果长度为n+1,则在第一次迭代时生成一个新进程,总共有 2 个进程,每个进程仍有 n 迭代要做,这意味着(通过归纳假设)每个进程将生成 @ 987654334@ 个进程,这意味着在最后一次n 迭代中将产生总共2^(n+1) - 2 个进程;我们已经有 2 个进程,这意味着创建的进程总数(包括主进程)将是 2^(n+1) - 2 + 2 = 2^(n+1)。
总之,对于长度为n 的循环,我们有2^n - 1 对fork 的调用,这意味着在您的情况下,我们有2^42 - 1 由主进程及其后代产生的新进程。
【讨论】:
使用这个程序来获得答案:
#include<stdio.h>
#include<math.h>
int main()
{
float sum=0;
int i;
for(i=1;i<=42;i++)
{
sum = sum + pow(2,i);
printf("fork call:%d, processes:%1.f\n",i,sum);
}
return 0;
}
//When fork call is 42 the processes will be 8796093022208
【讨论】: