我可以找到很多关于wait_queue_head
. 它作为一个信号工作,创建一个wait_queue_head
,有人可以使用它睡觉,直到有人启动它。
但是我找不到一个使用wait_queue
它自己的好例子,据说与它非常相关。
有人可以举个例子,还是在他们的幕后?
该
wait_queue_head_t
类型是一个相当简单的结构,定义在<linux/wait.h>
. 它只包含一个锁变量和一个休眠进程的链表。列表中的各个数据项都是 类型wait_queue_t
,并且列表是定义在 中的通用列表<linux/list.h>
。通常,这些
wait_queue_t
结构是通过函数在堆栈上分配的interruptible_sleep_on
;这些结构最终会进入堆栈,因为它们只是在相关函数中被声明为自动变量。一般来说,程序员不需要处理它们。
看看A Deeper Look at Wait Queues部分。
然而,一些高级应用程序可能需要直接处理 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 ,将处理器交给其他人。schedule 仅在其他人唤醒进程并将其状态设置为 TASK_RUNNING 时返回。此时,等待队列条目从队列中移除,并且睡眠完成
等待队列中涉及的数据结构的内部结构:
更新:对于那些认为图像是我自己的用户 - 这里又是一次链接到Linux 设备驱动程序的链接,图像是从中获取的
等待队列只是一个进程列表和一个锁。
wait_queue_head_t
代表整个队列。它是等待队列的头部。
wait_queue_t
表示列表的项目- 队列中等待的单个进程。