我们可以在系统调用中挂起进程吗?



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

我们可以用sleep代替suspend。

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

当然睡眠和暂停是不同的在这种情况下,挂起在用户级别上更加明显。一个处于睡眠状态的进程与正在运行的进程几乎无法区分(除非您查看ps/proctop或其他监控工具)。一个暂停的进程看起来半死不活(母体中的wait()返回)。任何信号(没有被阻塞或忽略)可以唤醒一个睡眠过程,但是只有SIGCONT可以恢复挂起的进程。(即使SIGTERM也会使挂起的进程处于挂起状态,但是SIGKILL会杀了它的

最新更新