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

时间:2013-11-13 00:14:36

标签: linux queue wait

我可以找到很多关于wait_queue_head的例子。 它作为一个信号,创建一个wait_queue_head,一个人 可以用它来睡觉,直到其他人踢它。

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

有人能举例说明,还是在他们的引导下?

2 个答案:

答案 0 :(得分:12)

来自Linux Device Drivers

  

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。此时,等待队列条目将从中删除   队列,睡眠已经完成

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

enter image description here

更新: 对于认为图像是我自己的用户而言 - 这是另一次链接到Linux Device Drivers的图像来自

答案 1 :(得分:5)

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

wait_queue_head_t表示整个队列。它是等待队列的负责人。

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

相关问题