linux-kernel - 为什么等待队列实现在循环中等待直到条件满足?

标签 linux-kernel linux-device-driver

让我们考虑一个单处理器场景。
wait_event_interruptible() (或其他等待 API)在循环中等待,直到满足某个条件。

现在,由于 linux 将线程实现为单独的进程,我相信错误唤醒(在不满足条件的情况下唤醒 wait_event*)表明程序/驱动程序中存在错误。

我错了吗? - 是否有任何有效的场景可以发生并使用这种虚假唤醒?换句话说,为什么要等待 中的条件循环 wait_event*执行?

最佳答案

等待队列的一个常见用例是中断。也许您的内核驱动程序当前正在等待三种不同的条件,每一种都会被中断唤醒。

这允许您的内核中断处理程序唤醒所有监听器,然后他们可以确定他们的特定条件是否已经发生,或者他们是否应该唤醒。

此外,您可能会收到虚假中断,因为可以共享中断以及延迟和合并中断。

添加一些代码以及不尝试更明确的内容。

我在下面编写了一些代码,它们可能是内核驱动程序的一部分。中断处理程序只是将唤醒所有监听器。然而,并不是所有的监听器都可以真正做到。两者都会被同一个中断唤醒,但在继续之前,它们都会查看它们的特定条件是否已完成。

// Registered interrupt handler
static irqreturn_t interrupt_handler(void *private) {
    struct device_handle *handle = private;
    wake_up_all(&handle->wait);
}

// Some Kernel Thread
void program_a(struct device_handle * handle) {
    wait_event_interruptible(&handle->wait, hardware_register & 0x1);
    printk("program_a finished\n");
}

// Some other kernel thread
void program_b(struct device_handle * handle) {
    wait_event_interruptible(&handle->wait, hardware_register & 0x2);
    printk("program_b finished\n");
}

关于linux-kernel - 为什么等待队列实现在循环中等待直到条件满足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11184581/

相关文章:

c - linux IO端口是软件抽象还是真正的硬件端口

linux - 根据 Linux 内核中的 CONFIG 条目更改代码块

linux-kernel - linux 的 arm 中断处理程序在哪里?

Linux内核模块没有init和exit函数

c - TFT 液晶显示屏速度问题

linux - 如何在FC18中安装CUDA 5.5驱动?

c - 如何在c中读取内核日志消息?

python - 当我分配一个巨大的 ndarray 时,numpy 空在做什么?

linux - MACHINE_EXTRA_RDEPENDS 对比 MACHINE_ESSENTIAL_EXTRA_RDEPENDS

linux - 在源代码级别是否有任何 linux 内核模块的模块依赖定义?