进程会在抢占式内核中失去唤醒机会吗? [英] Will process lost wake-up chance in a preemptive kernel?
本文介绍了进程会在抢占式内核中失去唤醒机会吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
通常,当进程要等待一些不可用的事件时,我们可以让它们进入休眠状态,并在事件发生后唤醒它们。
下面熟悉的代码可完成此任务:
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)
。
TASK_INTERRUPTIBLE
,因此不会再次调度到CPU。因此,我认为进程B永远不会被唤醒...
推荐答案
您的最终结论是错误的:抢占不适用于任务状态。因此,即使处于TASK_INTERRUPTIBLE
状态,被抢占的任务也可以再次获得CPU。
这篇关于进程会在抢占式内核中失去唤醒机会吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文