12

我可以找到很多关于wait_queue_head. 它作为一个信号工作,创建一个wait_queue_head,有人可以使用它睡觉,直到有人启动它。

但是我找不到一个使用wait_queue它自己的好例子,据说与它非常相关。

有人可以举个例子,还是在他们的幕后?

4

2 回答 2

13

Linux 设备驱动程序

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 设备驱动程序的链接,图像是从中获取的

于 2013-11-19T07:44:32.067 回答
7

等待队列只是一个进程列表和一个锁。

wait_queue_head_t代表整个队列。它是等待队列的头部。

wait_queue_t表示列表的项目- 队列中等待的单个进程。

于 2013-11-23T18:33:07.410 回答