0

这个问题是我期中考试的一部分,教授给出的答案非常荒谬。

我只想知道什么是正确答案。

代码:

#include<unistd.h>

  // Other Libraries  


void ChildProc()  
{  
  sleep(10);
  printf("Child Process\n");
}

void ParentProc()
{  
  printf("Parent Process");
}  

int main()  
{  
  pid_t pid;  
  pid = fork();  

  if(pid==0)  
    ChildProc();  
  else  
    ParentProc();  

  return 0;  
}

问题: 以下代码的所有可能输出是什么?

我的回答是,

1)
输出: None
原因:当fork失败时。(系统不允许创建子进程)

2)
输出: Parent Process
原因:因为父母和孩子现在都处于竞争状态。谁可能先执行,父进程会提前完成并因此退出函数,然后程序本身将退出。现在,当父母结束时,孩子无法活着。就这样也结束了。

但是教授考虑了另一种状态,当孩子首先开始执行并开始睡眠循环时。现在轮到父母了,处理器太忙了,因此让进程处于挂起状态约 10 秒。现在到这个时候孩子完成睡眠并恢复执行,逐渐父执行,因此输出是,

输出:
Child Process
Parent Process

虽然这种情况发生的可能性非常非常非常少,并且只有当进程上下文切换器非常繁忙但他仍然说有可能?现在我不相信他的推理,要知道这真的有可能吗,至少在现在的 linux OS 中是这样吗?

4

4 回答 4

2

从理论上讲,父进程被阻塞 10 秒是可能的[不是由 CPU 本身,而是由操作系统调度机制]。但是由于在这种情况下分叉的进程与父进程具有相同的优先级,因此子进程不太可能在父进程完成之前运行,但就像任何两个未同步的进程一样,不可能完全保证它们执行的顺序。

当然,在我的机器上,子进程要等到父进程完成后才会运行。所以输出是:

Parent process 
[my prompt $] Child Process

每次。但这并不是绝对 100% 保证会以这种方式发生。

于 2015-09-10T21:57:08.790 回答
0

我认为你没有准确地表达你教授的话。这可能发生在旧机器上,但不会发生在现代机器上。由于系统的多任务多线程特性,您无法预测子进程是否会在父进程之前执行,反之亦然。一般来说,如果孩子进入睡眠状态,则父母不必因孩子睡眠而等待,但在您的情况下,父母可能不得不在打印其语句后等待从孩子那里收集退出状态(以防孩子先运行)。

笔记:

当我运行您的代码时,它首先运行父进程(打印父进程),返回我的控制台然后运行子进程(打印“子进程”),然后继续等待:)

当我在返回 0 之前将 printf("main process") 放在 main() 的末尾时;它按以下顺序打印父进程,主进程,返回控制台,(睡眠),子进程,主进程。有一点很清楚,父母不会等待孩子,孩子也没有必要总是在父母之前获得 cpu。

问题:为什么程序会持续等待以及为什么要执行两次父子之外的语句

于 2015-09-11T10:52:54.747 回答
0

我们无法预测哪个进程将首先运行,但是如果一个进程处于睡眠状态,则另一个进程会获得 CPU 时间量。

O/P : 父进程子进程

于 2015-09-10T18:49:30.530 回答
0

参考'11的另一个问题:

理解 fork()、sleep() 和进程通量

父进程应该使用 wait() 否则我相信它只会显示:

父进程

子进程

(或无法分叉)

于 2015-09-10T18:16:08.170 回答