通常,当进程想要等待一些不可用的事件时,我们可以将它们置于休眠状态,并在事件发生后稍后将其唤醒。
以下熟悉的代码可以完成此任务:
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。 DEFIN_WAIT(wait)
。DEFIN_WAIT(wait)
之后和执行prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);
之前生成一些数据。prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);
。if (!events)
之前被其他进程抢占。由于进程B的状态现在是TASK_INTERRUPTIBLE
,因此它不会再次安排到CPU。所以,我认为,过程B永远不会被唤醒......