我们可以暂停系统调用中的进程吗?

时间:2016-10-13 09:43:03

标签: kernel system-calls

假设我创建了一个系统调用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。然后会发生什么? 由于禁用了中断,因此没有其他进程可以进行上下文切换,并且当前进程处于挂起状态。在单核处理器中,它是悬挂状态吗?因为没有进程可以恢复当前进程。 如果我错了,请纠正我。

我们可以使用睡眠而不是暂停。在做出改变时是否有任何区别。

1 个答案:

答案 0 :(得分:0)

暂停当前进程将导致立即进行上下文切换。 中断屏蔽是上下文的一部分, 因此上下文切换将导致正常的中断处理恢复。

当然,睡眠不同于暂停 在用户级别中,暂停更加明显。 一个正在睡觉的过程 几乎与正在运行的进程无法区分 (除非您查看ps/proctop或其他监控工具。 暂停的流程 看起来它已经半死(父级返回wait())。 任何信号(未被阻止或忽略) 可以叫醒睡眠过程, 但只有SIGCONT可以恢复暂停的进程。 (即使SIGTERM也会暂停暂停流程, 但是SIGKILL会杀了它。)