是否会在抢占式内核中处理丢失的唤醒机会?

时间:2015-06-24 07:18:20

标签: 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);
}

想象一下,在抢占式内核中,存在两个进程,其中进程A是生产者,进程B是消费者。进程B正在执行上面的代码,等待进程A生成的某些数据变为有效。

现在,如果两个进程的执行路径如下,我认为进程B将失去唤醒机会。

  1. 进程B检查while语句中的事件,现在返回false。
  2. 流程B执行DEFIN_WAIT(wait)
  3. 进程A在进程B完成执行DEFIN_WAIT(wait)之后和执行prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);之前生成一些数据。
  4. 流程B执行prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);
  5. 进程B在执行if (!events)之前被其他进程抢占。
  6. 由于进程B的状态现在是TASK_INTERRUPTIBLE,因此它不会再次安排到CPU。所以,我认为,过程B永远不会被唤醒......

1 个答案:

答案 0 :(得分:2)

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

请参阅,例如thisthat