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将失去唤醒机会

  • 进程B检查
    while
    语句中的事件,现在返回false
  • 进程B执行
    定义等待(WAIT)
  • 进程A在进程B执行完
    DEFIN\u WAIT(WAIT)
    之后和执行
    prepare\u to\u WAIT(&q,&WAIT,任务可中断)之前生成一些数据
  • 进程B执行
    prepare\u to\u wait(&q,&wait,任务可中断)
  • 进程B在执行
    if(!events)
    之前被其他进程抢占

  • 由于进程B的状态现在是“任务可中断”
    ,因此它不会再次被调度到CPU。因此,我认为进程B永远不会被唤醒……

    您的最终结论是错误的:抢占不适用于任务状态。因此,即使在任务可中断状态下,抢占任务也可以再次获得CPU

    请参见,例如或。

    对我也有帮助。谢谢你,齐瓦雷夫。