我可以找到很多关于wait_queue_head
的例子。
它作为一个信号,创建一个wait_queue_head
,一个人
可以用它来睡觉,直到其他人踢它。
但我无法找到一个使用wait_queue
本身的好例子,据说这与它非常相关。
有人能举例说明,还是在他们的引导下?
答案 0 :(得分:12)
wait_queue_head_t
类型是一个相当简单的结构,定义于<linux/wait.h>
。它只包含一个锁变量和一个链表 睡眠过程列表中的各个数据项是 键入wait_queue_t
,列表是在中定义的通用列表<linux/list.h>
。通常,
wait_queue_t
结构在堆栈上分配 像interruptible_sleep_on
这样的函数;结构最终在 堆栈,因为它们被简单地声明为自动变量 相关职能。一般来说,程序员不需要处理 它们。
看看深入了解等待队列部分。
但是,某些高级应用程序可能需要处理 wait_queue_t变量直接。对于这些,值得快速浏览一下 实际上在像interruptible_sleep_on这样的函数中发生了什么。 以下是执行的简化版本 interruptible_sleep_on将进程置于休眠状态:void simplified_sleep_on(wait_queue_head_t *queue) { wait_queue_t wait; init_waitqueue_entry(&wait, current); current->state = TASK_INTERRUPTIBLE; add_wait_queue(queue, &wait); schedule(); remove_wait_queue (queue, &wait); }
这里的代码创建了一个新的wait_queue_t变量(等待,获取 在堆栈上分配)并初始化它。任务的状态是 设置为TASK_INTERRUPTIBLE,意味着它处于可中断状态 睡觉。然后将等待队列条目添加到队列中( wait_queue_head_t *参数)。然后调用schedule,其中 放弃处理器给别人。计划只返回 当其他人唤醒了这个过程并将其状态设置为 TASK_RUNNING。此时,等待队列条目将从中删除 队列,睡眠已经完成
等待队列中涉及的数据结构的内部结构:
更新: 对于认为图像是我自己的用户而言 - 这是另一次链接到Linux Device Drivers的图像来自
答案 1 :(得分:5)
等待队列只是一个进程列表和一个锁。
wait_queue_head_t
表示整个队列。它是等待队列的负责人。
wait_queue_t
表示列表的项 - 队列中等待的单个进程。