1.简介

  等待队列实现在事件上的条件等待:希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制权。可用于:

  - 中断处理

  - 进程同步

  - 定时

2.等待队列头数据结构

1 typedef struct _wait_queue_head{
2 spinlock_t lock;
3 struct list_head task_list;
4 } wait_queue_head_t;

3.进程状态

  - TASK_TUNNING:可运行状态

  - TASK_INTERRUPTIBLE:可中断睡眠状态

  - TASK_UNINTERRUPTIBLE:不可中断睡眠

  - TASK_ZOMBLE:僵尸状态:表示进程结束且已释放资源,但task_struct仍未释放

  - TASK_STOPPED:暂停状态。处于该状态的进程通过其他进程的信号才能被唤醒

4.独占等待

  当wake_up被在一个等待队列上调用时,它在唤醒一个有WQ_FLAG_EXCLUSIVE标志的进程后停止唤醒,但内核仍然每次唤醒所有的非独占等待

  使一个进程进入独占等待,调用如下函数

  void prepare_to_wait_exclusive(wait_queue_head_t *queue, wait_queue_t *wait, int state)

5.等待队列相关API

  - DECLARE_WIT_QUEUE_HEAD(name):定义一个等待队列头,名字为name,类型wait_queue_head_t

  - init_waitqueue_head(q):动态初始化一个等待队列头

  - wait_event(wq, condition):在等待队列中睡眠,直到condition为真,等待期间,进程状态被设置为TASK_UNINTERRUPTIBLE

  - wait_event_interruptible(wq, condition):同上,等待期间,进程状态被设置为TASK_INSTERRUPTIBLE,若被信号唤醒,则返回-ERESTARTSYS错误码,否则返回0

  - wait_event_timeout(wq, condition, timeout):类似wait_event,当超过timeout时间后,返回0

  - wait_event_interruptible(wq, condition, timeout):同上,若在睡眠期间被信号打断,则返回-ERESTARTSYS错误码

  - wake_up(x):唤醒等待队列,x为要唤醒的队列头指针

  - wake_up_interruptible(x):唯一区别是只能唤醒TASK_INTERRUPTIBLE状态的进程

  - wake_up_interruptible_all(x):

  - wake_up_all(x):唤醒所有进程,不管是否进行独占等待

  - wake_up_nr(x, nr):唤醒等待队列上的nr个独占进程,和wake_up_all的区别在于这个宏可能唤醒nr个独占等待进程,而wake_up_all只能唤醒一个独占等待进程

6.阻塞概念:

  - 阻塞:指在执行设备操作时若不能获得资源则挂起操作,知道满足可操作的条件后再进行

  - 非阻塞:进程在不能进行设备操作时并不挂起,它或者放弃,或者不停的查询,直到可以进行操作

7.在设备驱动中实现阻塞功能:

  - wait_queue_head_t myqueue:定义等待队列头

  - init_waitqueue_head(&my_queue):初始化队列头

  - add_wait_queue:添加等待队列

  - remove_wait_queue:删除等待队列

  - 等待事件:

    * wait_event

    * wait_event_interruptible

    * wait_event_timeout

    * wait_event_interrruptible_timeout

  - 唤醒事件

    * wake_up

    * wake_up_interruptible

  - 把进程在队列上休眠

    * sleep_on

    * interruptible_sleep_on

8.使用非阻塞I/O的应用程序通常会使用select()和poll()系统调用查询是否可对设备进行无阻塞访问。select和poll系统调用最终会引发设备驱动中的poll函数被执行

  

非阻塞I/O和阻塞I/O的更多相关文章

  1. TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍

    首先我简单介绍一下同步TCP编程 与异步TCP编程. 在服务端我们通常用一个TcpListener来监听一个IP和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...

  2. 并发编程学习笔记(13)----ConcurrentLinkedQueue(非阻塞队列)和BlockingQueue(阻塞队列)原理

    · 在并发编程中,我们有时候会需要使用到线程安全的队列,而在Java中如果我们需要实现队列可以有两种方式,一种是阻塞式队列.另一种是非阻塞式的队列,阻塞式队列采用锁来实现,而非阻塞式队列则是采用cas ...

  3. Delphi Thread.Queue与Synchronize的区别(差别: Synchronize是阻塞,Queue是非阻塞)

    前话:  其实大家要学会看源码, 我接下来要说的这些东东,与其等别人讲,还不如自己搞几个代码试一下,印象还深刻点 TThread.Queue和TThread.Synchronize的区别, 效果上:二 ...

  4. 自己总结 :并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别 和 使用场景总结

    并发队列ConcurrentLinkedQueue.阻塞队列AraayBlockingQueue.阻塞队列LinkedBlockingQueue 区别 和  使用场景总结 分类: Java2013-0 ...

  5. 非阻塞tcp服务器与阻塞的tcp服务器对比

    一般的tcp服务器(阻塞)是使用的如下 [erlang] gen_tcp传输文件原型 http://www.cnblogs.com/bluefrog/archive/2012/09/10/267904 ...

  6. 慢查询阻塞了xtrabackup进而阻塞以后的sql导致的系统瘫痪问题

    收到开发反应一库的sql频繁超时,系统几乎瘫痪,无法执行任何操作,我登上库先查看到当前的线程,发现有大量的线程状态是 Waiting for table flush 查看当前的事务 从昨天开始执行,到 ...

  7. 并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别和使用场景总结

      三者区别与联系: 联系,三者 都是线程安全的.区别,就是 并发  和 阻塞,前者为并发队列,因为采用cas算法,所以能够高并发的处理:后2者采用锁机制,所以是阻塞的.注意点就是前者由于采用cas算 ...

  8. PHP - 请求阻塞,Session写阻塞

    之前写某些代码的时候,发现用户莫名奇妙地阻塞了,而且这种阻塞的情况还比较难以形容: 使用session过程中,在开启session后,同一浏览器,执行同一程序,不同页面会被锁.不同浏览器不会出现这种情 ...

  9. 并发编程-concurrent指南-阻塞队列-优先级的阻塞队列PriorityBlockingQueue

    PriorityBlockingQueue是一个支持优先级的无界阻塞队列. 它使用了和类 java.util.PriorityQueue 一样的排序规则.你无法向这个队列中插入 null 值. 所有插 ...

随机推荐

  1. 跟我一起学.NetCore之中间件(Middleware)应用和自定义

    前言 Asp.NetCore中的请求管道是通过一系列的中间件组成的,使得请求会根据需求进行对应的过滤和加工处理.在平时开发中会时常引用别人定义好的中间件,只需简单进行app.Usexxx就能完成中间件 ...

  2. Mysql业务设计(物理设计)

    物理设计 根据所选择的关系型数据库的特点对逻辑模型进行存储结构的设计 物理设计: 定义数据库.表及字段的命名规范 选择合适的存储引擎 为表中的字段选择合适的数据类型 建立数据库结构 定义数据库.表及字 ...

  3. Openresty使用

    OpenResty是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,常用的第三方模块以及大多数依赖项. 可以把它看成是Nginx附加众多的第三方插件的合集.其主体是嵌入lua脚本的 ...

  4. 深入理解xLua热更新原理

    热更新简介 热更新是指在不需要重新编译打包游戏的情况下,在线更新游戏中的一些非核心代码和资源,比如活动运营和打补丁.热更新分为资源热更新和代码热更新两种,代码热更新实际上也是把代码当成资源的一种热更新 ...

  5. liunx之firewalld&SELinux

    1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...

  6. Centos7源码编译安装LAMP环境

    参考地址:https://www.linuxidc.com/Linux/2018-03/151133.htm

  7. 认识一下python

    python 目录 python 1.python创始人 2.python的设计目标 3.为什么使用python 4.python的特点 5.python的优缺点 1.python创始人 1.1989 ...

  8. 设计模式之Command

    由于学习hystrix的使用和原理   所以就学习了command模式https://www.jdon.com/designpatterns/command.htm Command模式是最让我疑惑的一 ...

  9. v-if和v-show的区别与使用

    1.共同点: v-if 和 v-show 都能实现元素的显示隐藏. 2.不同点: v-if显示隐藏是将dom元素整个添加或删除,v-show元素隐藏时,会在dom节点中把该元素设置css属性为disp ...

  10. 原子类的 ABA 问题

    原子引用 public class AtomicReferenceDemo { public static void main(String[] args) { User cuzz = new Use ...