linux - CPU 能否在子进程执行时将进程保持在挂起状态 10 秒?

标签 linux operating-system kernel fork unistd.h

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

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

代码:

#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)
输出:
原因:当fork失败时。(系统不允许创建子进程)

2)
输出: 父进程
原因: 因为 parent 和 child 现在都处于比赛状态。谁先执行,父进程提前完成并退出该函数,然后程序本身将退出。现在,当 parent 结束时, child 无法继续活着。因此它也结束了。

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

输出:
子进程
父进程

虽然这种情况发生的概率非常非常非常少,而且只有在进程上下文切换器非常忙的时候才发生,但他仍然说有可能吗? 现在我不相信他的推理,我知道这是否真的有可能,至少在现在的 linux 操作系统中是这样??

最佳答案

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

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

Parent process 
[my prompt $] Child Process

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

关于linux - CPU 能否在子进程执行时将进程保持在挂起状态 10 秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32508657/

相关文章:

operating-system - 是否可以在 vala 中编写系统级代码

linux - dladdr 不返回 dli_fname 中的完整路径

linux - 将剪贴板中的文本复制到 vim 编辑器

linux - 虚拟地址空间与虚拟内存

linux-kernel - Linux 内核模块 - 创建 proc 文件 - proc_root 未声明的错误

linux - 是否有使用 --enable-kernel=VERSION 对非常旧的内核(早于 3.2.0)进行 glibc (2.28) 编译的解决方法?

linux - ls 在目录中获取文件列表

php - 调用未定义的函数 pcntl_fork() ubuntu 服务器 apache

c - X86 PC 上的 RTLinux

c++ - while 循环是否总是占用全部 CPU 资源?