非阻塞I/O和阻塞I/O
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的更多相关文章
- TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍
首先我简单介绍一下同步TCP编程 与异步TCP编程. 在服务端我们通常用一个TcpListener来监听一个IP和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...
- 并发编程学习笔记(13)----ConcurrentLinkedQueue(非阻塞队列)和BlockingQueue(阻塞队列)原理
· 在并发编程中,我们有时候会需要使用到线程安全的队列,而在Java中如果我们需要实现队列可以有两种方式,一种是阻塞式队列.另一种是非阻塞式的队列,阻塞式队列采用锁来实现,而非阻塞式队列则是采用cas ...
- Delphi Thread.Queue与Synchronize的区别(差别: Synchronize是阻塞,Queue是非阻塞)
前话: 其实大家要学会看源码, 我接下来要说的这些东东,与其等别人讲,还不如自己搞几个代码试一下,印象还深刻点 TThread.Queue和TThread.Synchronize的区别, 效果上:二 ...
- 自己总结 :并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别 和 使用场景总结
并发队列ConcurrentLinkedQueue.阻塞队列AraayBlockingQueue.阻塞队列LinkedBlockingQueue 区别 和 使用场景总结 分类: Java2013-0 ...
- 非阻塞tcp服务器与阻塞的tcp服务器对比
一般的tcp服务器(阻塞)是使用的如下 [erlang] gen_tcp传输文件原型 http://www.cnblogs.com/bluefrog/archive/2012/09/10/267904 ...
- 慢查询阻塞了xtrabackup进而阻塞以后的sql导致的系统瘫痪问题
收到开发反应一库的sql频繁超时,系统几乎瘫痪,无法执行任何操作,我登上库先查看到当前的线程,发现有大量的线程状态是 Waiting for table flush 查看当前的事务 从昨天开始执行,到 ...
- 并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别和使用场景总结
三者区别与联系: 联系,三者 都是线程安全的.区别,就是 并发 和 阻塞,前者为并发队列,因为采用cas算法,所以能够高并发的处理:后2者采用锁机制,所以是阻塞的.注意点就是前者由于采用cas算 ...
- PHP - 请求阻塞,Session写阻塞
之前写某些代码的时候,发现用户莫名奇妙地阻塞了,而且这种阻塞的情况还比较难以形容: 使用session过程中,在开启session后,同一浏览器,执行同一程序,不同页面会被锁.不同浏览器不会出现这种情 ...
- 并发编程-concurrent指南-阻塞队列-优先级的阻塞队列PriorityBlockingQueue
PriorityBlockingQueue是一个支持优先级的无界阻塞队列. 它使用了和类 java.util.PriorityQueue 一样的排序规则.你无法向这个队列中插入 null 值. 所有插 ...
随机推荐
- 16_Python设计模式
1.设计模式概述 1.设计模式代表了一种最佳的实践,是被开发人员长期总结,用来解决某一类问题的思路方法,这些方法保证了代码的效率也易于理解 2.设计模式类型:根据23种设计模式可以分为三大类 ...
- 18_Python常用的模块中的某个方法
1.imp模块==========>重新加载已加载过的模块方法 import imp imp.reload(mymod) # 重新加载已经加载过的mymod模块 2.ctypes模块====== ...
- docker打包项目
nginx镜像制作实战 docker容器的主业 docker理念里,容器启动时,应当为它指定主业是什么,如nginx容器主业就是nginx代理服务,tomcat容器就是web服务等等 1.容器创建时, ...
- vue 实现原理及简单示例实现
目录 相关html代码,用于被解析绑定数据 observer代码 Dep代码 Watcher 代码 Compile 代码 vue 简要构造函数 创建vue实例 结语 主要理解.实现如下方法: Obse ...
- jenkins打包java maven项目
一.maven本地配置 1.修改apache-maven-3.6.1\conf\settings.xml文件,把仓库配置成本地仓库 <localRepository>D:\apache-m ...
- CSS 简介,学习 CSS 必看
CSS 表示的是层叠样式表,学习 CSS 之前我们必须要掌握 HTML 和 XHTML 概述 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 ...
- oracle之二实例与数据库
实例与数据库 1.Oracle 网络架构及应用环境 看PPT,Oracle结构的基本单元.术语 2.Oracle 体系结构 1)oracle server :database + instanc ...
- 【小白学PyTorch】10 pytorch常见运算详解
参考目录: 目录 1 矩阵与标量 2 哈达玛积 3 矩阵乘法 4 幂与开方 5 对数运算 6 近似值运算 7 剪裁运算 这一课主要是讲解PyTorch中的一些运算,加减乘除这些,当然还有矩阵的乘法这些 ...
- [程序员代码面试指南]数组和矩阵-求最短通路值(BFS)
题意 给二维矩阵 1.0组成,问从左上角到右下角的最短通路值. 题解 BFS基础.头节点入队:对队内每个节点判断.处理,符合条件的入队:到了终点节点返回. 相关知识 Queue为接口,LinkedLi ...
- shell变量操作${}详细用法
${}基本功能 一般情况下$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围 [root@localhost ~]# A=Linux [root@localhost ~] ...