如果一个进程将自己设置为 的状态TASK_INTERRUPTIBLE
,它是否可以被其他内核组件抢占?如果确实如此,我认为该进程可能由于未能检查唤醒条件而失去了唤醒机会。
答案1
状态TASK_INTERRUPTIBLE
与任务调用调度程序时进入睡眠状态的方式有关:它的名称是“可中断睡眠”的缩写。它不控制抢占(事实上 LinuxTASK_INTERRUPTIBLE
早在它被(可选地)抢占之前就已经控制了)。
抢占不是睡眠;从其 CPU 启动的执行任务是可运行的,而不是休眠的。
如果任务在其睡眠状态设置为TASK_INTERRUPTIBLE
或其他睡眠类型时被抢占,则可能会陷入完全混乱。
早在 2003 年,就有人怀疑过与我认为您所怀疑的相同的事情,并将其发布在 LKML 邮件列表上:
http://lkml.org/lkml/2003/4/14/262
请参阅内核开发人员 Rob Love 的后续内容和剩余讨论。
任务TASK_INTERRUPTIBLE
必须保留在抢占的运行队列中。实现这一目标的黑客行为(2003 年就已存在)已在上述主题中进行了讨论。