为什么处于 TASK_INTERRUPTIBLE 状态且被抢占的进程必须留在运行队列中?

为什么处于 TASK_INTERRUPTIBLE 状态且被抢占的进程必须留在运行队列中?

我对 Linux 内核完全陌生。

在“Understanding the Linux Kernel”,第279页中,作者说了以下内容,其中prev指的是调用的进程schedule()

schedule()检查之前的状态。如果它不可运行并且在内核模式下没有被抢占(参见第 4 章“从中断和异常返回”一节),那么它应该从运行队列中删除。但是,如果它具有非阻塞挂起信号并且其状态为 TASK_INTERRUPTIBLE,则该函数将进程状态设置为 TASK_RUNNING 并将其保留到运行队列中。

为什么必须prev留在运行队列而不是进入睡眠状态?

如果prev在内核模式下不可运行并被抢占怎么办?

答案1

从你上面说的来看:

...如果它有非阻塞的挂起信号并且其状态为 TASK_INTERRUPTIBLE ...

通过将其保留在运行队列中,进程将有机会处理其待处理信号。进程应该在休眠之前处理待处理的信号。

相关内容