linux内核中wait_queue_head和wait_queue之间的区别

jae*_*ong 11 linux queue wait

我可以找到很多关于的例子wait_queue_head.它可以作为一个信号,创建一个wait_queue_head,有人可以使用它睡觉,直到其他人开始它.

但我无法找到一个使用wait_queue自身的好例子,据说与它非常相关.

有人可以举例,还是在他们的引擎盖下?

Mik*_*Del 12

Linux设备驱动程序:

wait_queue_head_t类型是一个相当简单的结构,在限定 <linux/wait.h>.它只包含一个锁变量和一个睡眠进程的链表.列表中的各个数据项是类型wait_queue_t,列表是在其中定义的通用列表 <linux/list.h>.

通常,wait_queue_t结构通过类似的功能分配在堆栈上interruptible_sleep_on; 结构最终在堆栈中,因为它们在相关函数中被简单地声明为自动变量.一般来说,程序员不需要处理它们.

看看更深入的等待队列部分.

但是,某些高级应用程序可能需要直接处理wait_queue_t变量.对于这些,值得快速查看一下像intermediatetible_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);
  }
Run Code Online (Sandbox Code Playgroud)

这里的代码创建了一个新的wait_queue_t变量(等待,在堆栈上分配)并初始化它.任务的状态设置为TASK_INTERRUPTIBLE,这意味着它处于可中断的睡眠状态.然后将等待队列条目添加到队列(wait_queue_head_t*参数).然后调用schedule,将处理器放弃给其他人.schedule仅在其他人唤醒进程并将其状态设置为TASK_RUNNING时返回.此时,等待队列条目将从队列中删除,并完成睡眠

等待队列中涉及的数据结构的内部:

在此输入图像描述

更新:对于认为图像是我自己的用户 - 这是再一次链接到Linux设备驱动程序的图像来自


TMS*_*TMS 5

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

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

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