Linux 进程是否会在抢占式内核中丢失唤醒机会?
通常,当进程想要等待一些不可用的事件时,我们可以让它们进入睡眠状态,然后在事件发生时唤醒它们 以下熟悉的代码可完成此任务:Linux 进程是否会在抢占式内核中丢失唤醒机会?,linux,linux-kernel,linux-device-driver,sleep,race-condition,Linux,Linux Kernel,Linux Device Driver,Sleep,Race Condition,通常,当进程想要等待一些不可用的事件时,我们可以让它们进入睡眠状态,然后在事件发生时唤醒它们 以下熟悉的代码可完成此任务: while (!events) { DEFINE_WAIT(wait); prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE); if (!events) schedule(); finish_wait(&q, &wait); } 想象一下,在一个抢占
while (!events) {
DEFINE_WAIT(wait);
prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);
if (!events)
schedule();
finish_wait(&q, &wait);
}
想象一下,在一个抢占式内核中,存在两个进程,其中进程a是生产者,进程B是消费者。进程B正在执行上述代码,等待进程A生成的某些数据生效
现在,我认为如果两个进程的执行路径如下所示,进程B将失去唤醒机会
while
语句中的事件,现在返回false李>
定义等待(WAIT)
DEFIN\u WAIT(WAIT)
之后和执行prepare\u to\u WAIT(&q,&WAIT,任务可中断)之前生成一些数据代码>
prepare\u to\u wait(&q,&wait,任务可中断)代码>
if(!events)
之前被其他进程抢占由于进程B的状态现在是“任务可中断”,因此它不会再次被调度到CPU。因此,我认为进程B永远不会被唤醒……您的最终结论是错误的:抢占不适用于任务状态。因此,即使在任务可中断状态下,抢占任务也可以再次获得CPU 请参见,例如或。对我也有帮助。谢谢你,齐瓦雷夫。