假设我创建了一个系统调用ABC。
syscall ABC()
{
int mask = disable(); // to disable interupt
....
pid // pid of calling process
if(some condition){
suspend(pid);
}
....
restore(mask); // restore interupts
}
如果从我们的程序调用ABC并且由于某些条件,ABC系统调用必须调用suspend。然后会发生什么? 由于禁用了中断,因此没有其他进程可以进行上下文切换,并且当前进程处于挂起状态。在单核处理器中,它是悬挂状态吗?因为没有进程可以恢复当前进程。 如果我错了,请纠正我。
我们可以使用睡眠而不是暂停。在做出改变时是否有任何区别。
答案 0 :(得分:0)
暂停当前进程将导致立即进行上下文切换。 中断屏蔽是上下文的一部分, 因此上下文切换将导致正常的中断处理恢复。
当然,睡眠不同于暂停
在用户级别中,暂停更加明显。
一个正在睡觉的过程
几乎与正在运行的进程无法区分
(除非您查看ps
,/proc
,top
或其他监控工具。
暂停的流程
看起来它已经半死(父级返回wait()
)。
任何信号(未被阻止或忽略)
可以叫醒睡眠过程,
但只有SIGCONT
可以恢复暂停的进程。
(即使SIGTERM
也会暂停暂停流程,
但是SIGKILL
会杀了它。)