通常,当进程想要等待一些不可用的事件时,我们可以让它们进入休眠状态,等事件发生后再唤醒它们。
下面熟悉的代码完成了这个任务:
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 执行
DEFIN_WAIT(wait)
。 - 进程 A 在进程 B 完成执行
DEFIN_WAIT(wait)
之后和执行prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);
之前产生一些数据。 - 进程 B 执行
prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);
。 - 进程 B 在执行
if (!events)
之前被其他进程抢占。
因为进程 B 现在的状态是 TASK_INTERRUPTIBLE
,它不会再被调度到 CPU。所以,我认为,进程B永远不会被唤醒....
最佳答案
关于linux - 进程会在抢占式内核中失去唤醒机会吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31020161/