work queue and wait queue 傻傻分得清楚!
来源:互联网 发布:中国站长站 源码 编辑:程序博客网 时间:2024/05/22 10:23
work queue and wait queue 傻傻分得清楚!
work queue是一种bottom half,中断处理的后半程,强调的是动态的概念,即work是重点,而queue是其次。
wait queue是一种【任务队列】,可以把一些进程放上面睡眠等待某个事件,强调静态多一些,重点在queue上,即它就是一个queue,这个queue如何调度,什么时候调度并不重要。
一、等待队列
等待队列在内核中有很多用途,尤其适合用于中断处理,进程同步及定时。我们在这里只说,进程经常必须等待某些事件的发生。例如,等待一个磁盘操作的终止,等待释放系统资源,或者等待时间经过固定的间隔。
等待队列实现了在事件上的条件等待,希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制权。因此。等待队列表示一组睡眠的进程,当某一条件为真时,由内核唤醒它们。
等待队列由循环链表实现,其元素包括指向进程描述符的指针。每个等待队列都有一个等待队列头,等待队列头是一个类型为wait_queue_head_t的数据结构。
等待队列实现了在事件上的条件等待,希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制权。因此。等待队列表示一组睡眠的进程,当某一条件为真时,由内核唤醒它们。
等待队列由循环链表实现,其元素包括指向进程描述符的指针。每个等待队列都有一个等待队列头,等待队列头是一个类型为wait_queue_head_t的数据结构。
等待队列头定义如下:
struct __wait_queue_head { wq_lock_t lock; struct list_head task_list; // 指向进程描述符的指针 }; typedef struct __wait_queue_head 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操作时,它都会非常有用。
如果需要用一个可以重新调度的实体来执行你的下半部处理,也应该使用工作队列。它是唯一能在中断上下文运行的下半部实现的机制,也只有它才可以睡眠。这意味着在需要获得大量的内存时、在需要获取信号量时,在需要执行阻塞式的I/O操作时,它都会非常有用。
0 0
- work queue and wait queue 傻傻分得清楚!
- var, object, dynamic 傻傻分得清楚
- link list and wait queue
- wait queue
- Linux Wait Queue and Completion Summary
- laravel queue:work & queue:listen
- Work queue 详解 (ZZ)
- Linux中的work queue
- Linux中的work queue
- Linux中的work queue
- Work queue 详解 (ZZ)
- work queue原理
- work queue(1)
- 工作队列work queue
- Linux中的work queue
- linux work queue
- linux work queue
- linux wait queue
- 短信和会话界面的数据库实现(sms and threads)
- Ruby社区应该去Rails化了
- Matlab的unique函数的C++实现
- unity3d如何快速接入渠道SDK之Unity篇
- UVA 11346 - Probability(概率)
- work queue and wait queue 傻傻分得清楚!
- QEMU Emulator User Documentation
- 【Cocos2d-x v3.x官方文档】Cocos2d-x 多分辨率适配完全解析
- CSS Study Notes— Selectors for Class/Div/Attribute
- IPhone MFI蓝牙认证分析
- UVA110
- hdu 1045 Fire Net
- hd 2734 Quicksum
- gnome-disks安装错误