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

Kernel 我们可以在系统调用中挂起进程吗?,kernel,system-calls,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系统调用必须调

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


我们可以用睡眠代替暂停。进行更改时是否有任何差异。

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

当然,睡眠和暂停是不同的 在这种情况下,挂起在用户级别更为明显 睡眠的过程 与正在运行的进程几乎无法区分 (除非您查看
ps
/proc
top
或其他监控工具) 暂停的进程 看起来它是半死不活的(
wait()
在父返回中) 任何信号(未被阻止或忽略) 可以唤醒睡眠过程, 但只有
SIGCONT
可以恢复挂起的进程 (即使是
SIGTERM
也会使挂起的进程挂起,
但是
SIGKILL
将终止它。)

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

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

为了挂起进程,你打算使用什么API?实际上,我没有提到操作系统。它是“Xinu”,与Linux非常相似,但不具有可扩展性(主要用于学术目的)。我在Xinu系统(内核)中工作,所以有一个suspend.c文件(API),它包含suspend函数(即直接访问进程表并访问其条目)。为了挂起进程,您打算使用什么API?实际上,我没有提到操作系统。它是“Xinu”,与Linux非常相似,但不具有可扩展性(主要用于学术目的)。我在Xinu系统(内核)中工作,所以有一个suspend.c文件(API),它包含suspend函数(即直接访问进程表并访问其条目)。