Linux驱动:内核等待队列

时间:2021-09-28 09:30:39

在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驱动:内核等待队列的更多相关文章

  1. 【Linux驱动】内核等待队列

    在Linux中, 一个等待队列由一个"等待队列头"来管理,等待队列是双向链表结构. 应用场合:将等待同一资源的进程挂在同一个等待队列中. 数据结构 在include/linux/w ...

  2. Linux内核等待队列

    在Linux驱动程序设计中,可以使用等待队列来实现进程的阻塞,等待队列可看作保存进程的容器,在阻塞进程时,将进程放入等待队列,当唤醒进程时,从等待等列中取出进程. Linux 2.6内核提供了如下关于 ...

  3. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

  4. linux驱动---等待队列、工作队列、Tasklets【转】

    转自:https://blog.csdn.net/ezimu/article/details/54851148 概述: 等待队列.工作队列.Tasklet都是linux驱动很重要的API,下面主要从用 ...

  5. linux 驱动学习笔记01--Linux 内核的编译

    由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...

  6. Linux驱动之内核自带的S3C2440的LCD驱动分析

    先来看一下应用程序是怎么操作屏幕的:Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户 ...

  7. Linux内核&lpar;17&rpar; - 高效学习Linux驱动开发

    这本<Linux内核修炼之道>已经开卖(网上的链接为: 卓越.当当.china-pub ),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到 ...

  8. Linux驱动设计—— 中断与时钟

    中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只 ...

  9. 编写linux驱动所用到的头文件(转)

    转自:http://blog.csdn.net/lufeiop02/article/details/6448497 关于linux驱动(应用)程序头文件使用 收藏 驱动程序: #include &lt ...

随机推荐

  1. transformClassesWithDexForDebug

    转自:http://blog.sina.com.cn/s/blog_6f3828770102w30b.html

  2. Web负载均衡的几种实现方式

    Web负载均衡的几种实现方式摘要:负载均衡(Load Balance)是集群技术(Cluster)的一种应用.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用是 ...

  3. JQ源码学习-1-无new构建

    此文章仅为个人学习 Aaron的jQuery源码分析 笔记之用. 一:采用 构造函数 返回 原型初始化方法,原型初始化方法又返回构造函数 的方式代替new 但当 返回的却是‘web’而不是Object ...

  4. centos 修改网卡名为eth0

    centos7和centos6的命名规则不同,centos6网卡名由udev控制 网卡名以eth开头然后第一块网卡叫eth0第二块网卡叫eth1,然后centos7的网卡命名规则截然不同 centos ...

  5. Scrum会议4&lpar;Beta版本&rpar;

    组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...

  6. Oracle存储过程写法

    create or replace procedure QIANFEIGL_JIAOKUANDY( cebenh varchar2, kehuh varchar2, hetongh varchar2, ...

  7. CSS居中的实现用法实例

    转载的一篇文章,讲解css内容居中的. 网上有关css 居中的文章不胜枚举,不过大多没有做系统的总结.这里分享的这篇有关css居中的文章,个人感觉不错,值得收藏. 一.水平居中1,将元素水平居中(us ...

  8. 重写TextView,实现圆形背景,文本居中显示

    最近,在做考试试题排版,产品提出题号希望显示成圆形背景,序号文本居中显示. (有点问题:文本没有绝对居中,暂时没做处理.) 为此,我采取的方式是重写TextView的onDraw方法,绘制一个圆形背景 ...

  9. C语言开篇

    Linux下使用最广泛的C/C++编译器是GCC,大多数的Linux发行版本都默认安装,不管是开发人员还是初学者,一般都将GCC作为Linux下首选的编译工具. 1.小程序test_gets.c #i ...

  10. ASP&period;NET 下载文件方式

    protected void Button1_Click(object sender, EventArgs e) { /* 微软为Response对象提供了一个新的方法TransmitFile来解决使 ...