Linux驱动:内核等待队列
在Linux中, 一个等待队列由一个"等待队列头"来管理,等待队列是双向链表结构。 应用场合:将等待同一资源的进程挂在同一个等待队列中。
数据结构
在include/linux/wait.h
struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;
};
typedef struct __wait_queue_head wait_queue_head_t;//定义wait_queue_head_t结构类型:一个等待队列的头结构表征一条等待队列
等待队列的操作函数:
1.声明和初始化
动态的方法:
wait_queue_head_t my_queue; //先声明
init_waitqueue_head(&my_queue);//接着初始化它
静态的方法:
DECLARE_WAIT_QUEUE_HEAD(name);//定义并初始化等待队列(头)
2.定义等待队列项
DECLARE_WAITQUEUE(name, tsk); //只是等待队列中的一项而已哦。
3.添加删除等待项
//添加到等待队列中去之后,不会进入睡眠等待
void fastcall add_wait_queue(wait_queue_head_t * q, wait_queue_t * wait);
//删除唤醒以后的等待项
void fastcall remove_wait_queue(wait_queue_head_t * q, wait_queue_t * wait);
4.等待时间操作(宏函数)
①只能被wake_up唤醒,不能被中断信号唤醒的:醒来的第一件事情就是检查condition条件,如果为真,立马起床,否则继续睡觉。
wait_event(queue, condition);
②最常用的可被中断信号唤醒的等待队列: 被中断信号唤醒之后,立马起床,但是: 如果condition=0 -> 返回-ERESTARTSYS错误码;如果condition=1 -> 返回0
wait_event_interruptible(queue, condition);
③如果睡眠期间被wake_up唤醒后,如果condition为真:立马“起床”,返回0;否则,继续睡觉,直到超时才“起床”并返回0;
wait_event_timeout(queue, condition, timeout);
④可想而知
wait_event_interruptible_timeout(queue, condition, timeout);
5.唤醒等待队列头牵引的所有项
①可唤醒处于TASK_INTERRUPTIBLE和TASK_UNINTERUPTIBLE状态的进程,和wait_event/wait_event_timeout成对使用
void wake_up(wait_queue_head_t * queue);
②只能唤醒TASK_INTERRUPTIBLE状态的进程.,与wait_event_interruptible/wait_event_interruptible_timeout成对使用
void wake_up_interruptible(wait_queue_head_t * queue);
6.在等待事件中睡眠
①把目前进程的状态置成TASK_UNINTERRUPTIBLE,并定义一个等待队列元素,之后把他附属到等待队列头q,直到资源可用,q引导的等待队列被唤醒
void sleep_on(wait_queue_head_t *q); // 只能被wake_up()宏唤醒
②将进程状态置为TASK_INTERRUPTIBLE.......
问题思考:
问1.“在等待队列中睡眠”与“等待事件”的区别是什么?
答1.区别是“在等待队列中睡眠”不需要condition参数,调用wake_up()或wake_up_interruptible()就唤醒队列上的所有等待......
问2.内核中中的“阻塞与非阻塞”和“并发控制”有什么区别?
答2.
Linux驱动:内核等待队列的更多相关文章
- 【Linux驱动】内核等待队列
在Linux中, 一个等待队列由一个"等待队列头"来管理,等待队列是双向链表结构. 应用场合:将等待同一资源的进程挂在同一个等待队列中. 数据结构 在include/linux/w ...
- Linux内核等待队列
在Linux驱动程序设计中,可以使用等待队列来实现进程的阻塞,等待队列可看作保存进程的容器,在阻塞进程时,将进程放入等待队列,当唤醒进程时,从等待等列中取出进程. Linux 2.6内核提供了如下关于 ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入L ...
- linux驱动---等待队列、工作队列、Tasklets【转】
转自:https://blog.csdn.net/ezimu/article/details/54851148 概述: 等待队列.工作队列.Tasklet都是linux驱动很重要的API,下面主要从用 ...
- linux 驱动学习笔记01--Linux 内核的编译
由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...
- Linux驱动之内核自带的S3C2440的LCD驱动分析
先来看一下应用程序是怎么操作屏幕的:Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户 ...
- Linux内核(17) - 高效学习Linux驱动开发
这本<Linux内核修炼之道>已经开卖(网上的链接为: 卓越.当当.china-pub ),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到 ...
- Linux驱动设计—— 中断与时钟
中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只 ...
- 编写linux驱动所用到的头文件(转)
转自:http://blog.csdn.net/lufeiop02/article/details/6448497 关于linux驱动(应用)程序头文件使用 收藏 驱动程序: #include < ...
随机推荐
- mybatis的基础Dao
话不多说,直接贴代码吧,因为很多博客都需要用到这个基础dao,怕大家不好查询. 这个基类主要是使用了泛型,这样我就不必为每一个实体都写一个dao,大大节省了时间.其中sqlSessionTemplat ...
- 491. Increasing Subsequences增长型序列
[抄题]: Given an integer array, your task is to find all the different possible increasing subsequence ...
- Linq的执行效率及优化
描述:项目中使用了linq,发现写的顺序不一样最后的结果也不一样,效率也不一样. Linq的执行效率对比 List<int> source = new List<int>(); ...
- Python下安装MySQLdb模块
----------------------[针对Windows下python 的MySQLdb模块安装]--------------------- 一.检查MySQLdb模块是否安装,可在DOS命令 ...
- CSU 1684-Disastrous Downtime
题目链接:https://nanti.jisuanke.com/t/28879 思路:贪心,从最早收到请求的时刻开始,统计每个相差1000毫秒的时间段内接收的请求数量再计算该时间段内所需机器数目,答案 ...
- Powerdesigner数据库建模的浅谈
1.建立新模型 2.创建物理数据模型(可以选择数据库类型及版本) 3.建立表 左键点击Table这个图标,鼠标移动到空白工作区,再左键,一个表的视图就出来了,(连续左键,会出现多个表的视图),右键退出 ...
- java多线程系列8 高级同步工具(2)CountDownLatch
CountDownLatch,计数器的初始值为线程的数量.每当一个线程完成了自己的任务后, 计数器的值就会减1.当计数器值到达0时,它表示所有的线程已经完成了任务, 然后在闭锁上等待的线程就可以恢复执 ...
- chrome升级后出现滚动条无法滚动
最近升级chrome最新版本后,导致项目中功能页面的局部滚动条无法滚动(心里暗骂了很久),无论怎么滚动都是最外层的滚动条响应... 1.猜想:尼玛google应该不会干事件流混乱这种事,pass: 2 ...
- Java 装箱和拆箱
1.装箱机制 基础类型引用到其包装类型,这样就可以调用其各种方法. 例如,我们声明: Integer a = 1; 其在编译过程中会自动解释成: Integer a = Integer.valueOf ...
- drf3 Serializers 序列化组件
为什么要用序列化组件 做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 给前端数据的时候都要转成json格式,那就需要对从数据库拿到的数据进行序列化. ...