我对 Linux 内核完全陌生。
在“Understanding the Linux Kernel”,第279页中,作者说了以下内容,其中prev
指的是调用的进程schedule()
:
schedule()
检查之前的状态。如果它不可运行并且在内核模式下没有被抢占(参见第 4 章“从中断和异常返回”一节),那么它应该从运行队列中删除。但是,如果它具有非阻塞挂起信号并且其状态为 TASK_INTERRUPTIBLE,则该函数将进程状态设置为 TASK_RUNNING 并将其保留到运行队列中。
为什么必须prev
留在运行队列而不是进入睡眠状态?
如果prev
在内核模式下不可运行并被抢占怎么办?
答案1
从你上面说的来看:
...如果它有非阻塞的挂起信号并且其状态为 TASK_INTERRUPTIBLE ...
通过将其保留在运行队列中,进程将有机会处理其待处理信号。进程应该在休眠之前处理待处理的信号。