Linux 工作队列和等待队列的区别

转载 2013年12月05日 15:04:22
work queue是一种bottom half,中断处理的后半程,强调的是动态的概念,即work是重点,而queue是其次。

wait queue是一种「任务队列」,可以把一些进程放在上面睡眠等待某个事件,强调静态多一些,重点在queue上,即它就是一个queue,这个queue如何调度,什么时候调度并不重要。

对这2个容易混淆的队列做简单概念上的区别,怎么用?

 

等待队列在内核中有很多用途,尤其适合用于中断处理,进程同步及定时。我们在这里只说,

进程经常必须等待某些事件的发生。例如,等待一个磁盘操作的终止,等待释放系统资源,或者

等待时间经过固定的间隔。

 

等待队列实现了在事件上的条件等待,希望等待特定事件的进程把自己放进合适的等待队列,并

放弃控制权。因此。等待队列表示一组睡眠的进程,当某一条件为真时,由内核唤醒它们。

 

等待队列由循环链表实现,其元素包括指向进程描述符的指针。每个等待队列都有一个等待队列头,

等待队列头是一个类型为wait_queue_head_t的数据结构。

 

等待队列链表的每个元素代表一个睡眠进程,该进程等待某一事件的发生,它的描述符地址存放在

task字段中

 

然而,要唤醒等待队列中所有的进程有时并不方便。例如,如果两个或多个进程在等待互斥访问某

一个要释放的资源,仅唤醒等待队列中一个才有意义。这个进程占有资源,而其他进程继续睡眠

 

可以用DECLARE_WAIT_QUEUE_HEAD(name)宏定义一个新的等待队列,该宏静态地声明和初始化名为

name的等待队列头变量。 init_waitqueue_head()函数用于初始化已动态分配的wait queue head变量

 

等待队列可以通过DECLARE_WAITQUEUE()静态创建,也可以用init_waitqueue_head()动态创建。进程把

自己放入等待队列并设置成不可执行状态。

 

 

工作队列,workqueue,它允许内核代码来请求在将来某个时间调用一个函数。用来处理不是很紧急事件

的回调方式处理方法.

工作队列的作用就是把工作推后,交由一个内核线程去执行,更直接的说就是如果您写了一个函数,而您

现在不想马上执行它,您想在将来某个时刻去执行它,那您用工作队列准没错

 

如果需要用一个可以重新调度的实体来执行你的下半部处理,也应该使用工作队列。它是唯一能在进程上

下文运行的下半部实现的机制,也只有它才可以睡眠。这意味着在需要获得大量的内存时、在需要获取信

号量时,在需要执行阻塞式的I/O操作时,它都会非常有用


等待队列与工作队列实例

demo.c: #include #include #include #include #include #include #include #include #in...

Linux 驱动之中断下半部之工作队列

1、工作队列的使用 按惯例,在介绍工作队列如何实现之前,先说说如何使用工作队列实现下半部。 步骤一、定义并初始化工作队列: 创建工作队列函数: struct workqueue_struct *...

Linux内核:工作队列

在我的上一篇文章Linux内核:中断、软中断、tasklet中,我们已经了解了中断底半部的两种实现方式,即软中断和tasklet微线程。但是这两种方式归根结底都是采用软中断机制的,其根本上还是在中断的...

linux工作队列 - workqueue总览

workqueue归入中断子系统是由于和中断处理有密切关系,写博客重要在于整理自己的思绪,写的时候会把一些不懂的细节问题暴露出来,这样会把问题看的更透彻,workqueue的代码在文件kernel/w...

linux设备驱动下的工作队列(workqueue)

从表面和使用来看,工作队列类似与tasklet,它们都允许内核代码请求某个函数在将来的时间被调用。 但实际上它们有一些非常重要的区别: 1、  tasklet在软件中断上下文中运行,因此所有的...
  • dndxhej
  • dndxhej
  • 2012年03月29日 18:50
  • 2511

linux驱动学习之工作队列使用

工作队列是一种将工作推后执行的形式,交由一个内核线程去执行在进程上下文执行,其不能访问用户空间。最重要特点的就是工作队列允许重新调度甚至是睡眠。工作队列子系统提供了一个默认的工作者线程来处理这些工作。...

Linux工作队列实现机制

面试题之小任务与工作队列的区别

一、中断处理的tasklet(小任务)机制 中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CP...
  • sum_TW
  • sum_TW
  • 2016年12月09日 16:41
  • 1199

Linux 进程控制——等待队列详解

一、什么是睡眠     对于一个进程"睡眠"意味着什么? 当一个进程被置为睡眠, 它被标识为处于一个特殊的状态并且从调度器的运行队列中去除. 直到发生某些事情改变了那个状态, 这个进程将不被在任何 ...

linux驱动---等待队列、工作队列、Tasklets

概述: 等待队列、工作队列、Tasklet都是linux驱动很重要的API,下面主要从用法上来讲述如何使用API. 应用场景: 等待队列(waitqueue) linux驱动中,阻...
  • eZiMu
  • eZiMu
  • 2017年02月03日 23:30
  • 227
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux 工作队列和等待队列的区别
举报原因:
原因补充:

(最多只允许输入30个字)