在 child 进程正在执行时,CPU 能否使进程保持挂起状态 10 秒?

Can a CPU keep a process in pending state for 10 seconds, while a child process is executing?

这个问题是我Mid-Sememter考试的一部分,教授给出的答案很荒谬。

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

代码:

#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 失败时。(系统不允许创建 child 进程)

2)
输出: Parent Process
原因: 因为 parent 和 child 现在都处于竞争状态。谁先执行, parent 提前完成并因此退出函数,然后程序本身将退出。现在 child 在 parent 结束时无法存活。因此它也结束了。

但是教授考虑了另一种状态,当child首先开始执行并开始睡眠循环。现在轮到 parent,处理器太忙,因此使进程保持挂起状态约 10 秒。现在 child 完成睡眠并恢复执行,逐渐 parent 执行,因此输出为

输出:
Child Process
Parent Process

虽然这种情况发生的概率非常非常非常少,而且只有在进程上下文切换器很忙的时候才发生,但他还是说有可能? 现在我不相信他的推理,要知道这是否真的可能,至少在 now-a-days linux OS ??

参考 11 年的另一个问题:

understanding fork(), sleep() and processes flux

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

父进程

子进程

(或分叉失败)

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

O/P : 父进程 子进程

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

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

Parent process 
[my prompt $] Child Process

每一次。但这并不是绝对 100% 保证会发生这种情况。

我认为你没有准确地表述你教授的话。这可能发生在旧机器上,但不会发生在现代机器上。由于系统的多任务处理 multi-thread 性质,您无法预测 child 是否会在 parent 之前执行,反之亦然。一般而言,如果 child 进入睡眠状态,则 parent 不必等待 child 睡眠,但在您的情况下,parent 可能必须等待以从 child 打印其语句后(如果 child 运行 首先)。

注:

当我 运行 你的代码首先 运行 parent(打印 parent 过程),然后返回我的控制台 运行 child( print "childprocess") 然后进入连续等待:)

当我将 printf("main process") 放在 return 0 之前的 main() 末尾时; 它按以下顺序打印 parent 进程、主进程、返回控制台、(睡眠)、child 进程、主进程。 一件事很清楚 parent 不会等待 child 并且 child 不一定总是在 parent.

之前得到 cpu

问题:为什么程序会持续等待,为什么要执行 parent 和 child 之外的语句,两次