linux - 进程会在抢占式内核中失去唤醒机会吗?

标签 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) 之前被其他进程抢占。

因为进程 B 现在的状态是 TASK_INTERRUPTIBLE,它不会再被调度到 CPU。所以,我认为,进程B永远不会被唤醒....

最佳答案

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

参见,例如 thisthat .

关于linux - 进程会在抢占式内核中失去唤醒机会吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31020161/

相关文章:

python - 我的 python 程序在 Windows 7 中运行良好并打印到控制台,但在 Linux Mint 中出现错误?

linux - 如何删除 crontab 中的特定行?

linux - 如何通过 yum 安装特定的 kernel-ml-devel

linux - nopage()方法实现

java - 将 java linux 进程留给用户或操作系统控制

java - 在 Linux 上使用 Java 的技巧

c - spinlock_irqsave 与死锁

linux - "Kernel header files not in any of expected locations"编译ixgbe驱动时

linux - 为什么我不能在 Linux 2.6.26 中注册边沿触发中断?

c++ - 使用设备 VID/PID 打开 USB 串口