进程会在抢占式内核中失去唤醒机会吗? [英] Will process lost wake-up chance in a preemptive kernel?

查看:15
本文介绍了进程会在抢占式内核中失去唤醒机会吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

通常,当进程要等待一些不可用的事件时,我们可以让它们进入休眠状态,并在事件发生后唤醒它们。

下面熟悉的代码可完成此任务:

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)
由于进程B现在的状态为TASK_INTERRUPTIBLE,因此不会再次调度到CPU。因此,我认为进程B永远不会被唤醒...

推荐答案

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

参见,例如thisthat

这篇关于进程会在抢占式内核中失去唤醒机会吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆