在 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 之外的语句,两次
这个问题是我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 之外的语句,两次