【问题标题】:How many total number of processes are there?总共有多少个进程?
【发布时间】:2016-09-19 09:45:32
【问题描述】:

昨天,我有一个面试,我被问到这个代码 sn-p using fork() 的问题。

void main()
{............
for (int k=1;k<=10;k++)
{
pid[k]=fork();
if(!pid[k])
execvp(.....);
}
}

根据我的理解,我告诉总共有 1024 个进程,包括父进程 2^n -1 = 1023 + 1 个父进程,其中 n = 总叉数

但是,面试官回答说我的回答是错误的。

我的理解有什么问题?

【问题讨论】:

  • execvp 执行的程序是同一个程序,还是不相关的程序?了解您为什么认为 1024 是正确答案也可能会有所帮助(即解释您的推理)
  • 我认为孩子被不同的程序取代了。?
  • 好吧,在这种情况下,子进程不会参与进一步的分叉,这将导致 10 个子进程和 1 个父进程,不是吗?另外,2^10-1 绝对不是 1024...
  • 请将其作为答案发布。

标签: operating-system fork


【解决方案1】:

鉴于此代码

pid[k]=fork();
if(!pid[k])
    execvp(.....);

并阅读the man page of fork 声明

成功时,在父进程中返回子进程的PID, 并且在孩子中返回 0。

我们知道子进程将执行 exec 调用(并继续执行不同的程序),而父进程将循环并创建另一个子进程。

这意味着将为循环的每次迭代创建一个子级,在本例中为 10 次。所以,答案是 10 个孩子 + 1 个父母 = 11。


现在,如果由 exec 启动的程序是同一个程序,那么只有在计算机内存耗尽时才会停止乐趣:每次迭代 10 个程序将创建 10 个子程序,每个程序将创建 10 个子程序,以此类推上。 fork() 的一个特点是父母和孩子获得相同变量的图像(这将导致可预测数量的孩子,即与 2 的幂相关的某个数字),显然当程序获得exec'd,这意味着可用内存将是唯一的限制。

【讨论】:

  • 如果 execvp() 加载的是同一个程序,那么 ?
猜你喜欢
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多