10、驱动中的阻塞与非阻塞IO
阻塞,就是在获取资源的时候,不能获取到,那么就会将当前的进程挂起(睡眠,也就是将当前进程从调度器拿走了,不会调度当前进程),直到满足条件为止再进行操作。相反,非阻塞,就是即使不能获取到资源,非阻塞的进程是,要么是直接放弃,要么就不停地的进行查询,直到满足为止。
当上层 read 或者 write 的时候,希望是阻塞地去获取资源时候,那么底层的驱动,就应该去以阻塞的方式去实现;而当是希望以非阻塞的方式的时候,当不慢满足的时候,就立即返回,且应用层收到 –EAGAIN 的返回值。
1、驱动中的阻塞
底层驱动的阻塞操作,是借助了 等待队列的方式进行实现的,定义一个等待队列头,本质上是一个双向链表,队列的后续挂接了不同的节点,这些节点就是等待的任务,当在程序的某一个位置唤醒了等待队列头的时候,那么挂接在等待队列头的双向链表的任务节点,都会被唤醒。
1.1、API
(1)定义等待队列头
wait_queue_head_t myqueue;
(2)初始化队列头
init_waitqueue_head(&myqueue);
其实可以通过定义和初始化一体的宏代码: DECLARE-WAITQUEUQ(name) name. 就是定义以及被初始化的头部
(3)定义等待任务
DECLARE_WAITQUEUE(name, tsk)
定义了一个等待任务,name。而 tsk 是任务进程,一般是设置为 current,也就是设置为当前的进程。
(4)添加/删除队列
void add_wait_queue(wait_queue_head_t *myqueue, wait_queue_t * wait);
void remove_wait_queue(wait_queue_head_t *myqueue, wait_queue_t * wait)
将等待队列(wait),添加到 以myqueue 作为头部的,双向链表中,
(5)等待事件
wait_event(myqueue, condition)
将以 myqueue 的队列,全部进行阻塞,等待 condition 为真,不能被打断
wait_event_interruptible(wq, condition) ,是先等待的同时,可以被打断
(6)唤醒队列
wake_up(wait_queue_head_t *myqueue)
唤醒等待队列头,会将队列中的所有进程都进行唤醒。
2、驱动的非阻塞
驱动中的非阻塞实现,可以通过 struct file 中的 f_flags 标志进行判断,当 f_flags & O_NONBLOCK (因为上次应用的标志位的设置的时候,不仅仅是非阻塞,也有其他的,所以用 与,而不是等号)不等于零的,在资源不能获取的时候,立刻进行返回。还有一种是借助了 select 或者 poll 实习。
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
nfd : 是检测文件描述符中最大的 加一,
fd_set : 是检测文件的文件集,可见,可以按照读、写、异常,分开进行检测
timeout :阻塞时间,
select 会对指定的文件,进行实时检测,当检测到文件状态的变动,立马返回;没有检测到的时候,就直接进行阻塞,,但是阻塞不是一直进行下去的,阻塞的时间是通过 timeout 指定的时间。超过时间,即使没有检测到,也进行返回
2.1、文件集的设置
void FD_CLR(int fd, fd_set *set); // 清空文件集
int FD_ISSET(int fd, fd_set *set); // 检测文件,是否以及被置为到文件集
void FD_SET(int fd, fd_set *set); // 将文件描述符,置为到文件集
void FD_ZERO(fd_set *set); // 清空
2.2、底层poll
当上层调用了select 或者 poll 、epoll 的时候,底层的 poll 被调用,
unsigned int (*poll) (struct file *, struct poll_table_struct *);
第一个参数,是被打开文件,相关的参数;第二个参数,是被轮询设备的表格。poll 函数里面,当返回的时候,需要返回以下:
POLLIN : 表示设备可读,参考是应用层,
POLLOUT : 表示设备可写,
POLLERR : 错误
POLLRDNORM :必须被设置,
一般是:
unsigned int (*poll) (struct file *, struct poll_table_struct *)
{
if (XXXXX)
mask |= POLLIN | POLLRDNORM ;
else
mask |= POLLOUT | POLLRDNORM ;
}
10、驱动中的阻塞与非阻塞IO的更多相关文章
- 七、设备驱动中的阻塞与非阻塞 IO(一)
7.1 阻塞与非阻塞 IO 阻塞操作是指在执行设备操作的时候,若不能获取资源,则挂起进程直到满足可操作的条件后再进行操作.被挂起的进程进入睡眠状态,被从调度器的运行队列移走,直到等待的条件被满足. 非 ...
- Linux设备驱动中的阻塞和非阻塞I/O <转载>
Green 博客园 首页 新随笔 联系 订阅 管理 Linux设备驱动中的阻塞和非阻塞I/O [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件 ...
- Linux设备驱动中的阻塞和非阻塞I/O
[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...
- 蜕变成蝶~Linux设备驱动中的阻塞和非阻塞I/O
今天意外收到一个消息,真是惊呆我了,博客轩给我发了信息,说是俺的博客文章有特色可以出本书,,这简直让我受宠若惊,俺只是个大三的技术宅,写的博客也是自己所学的一些见解和在网上看到我一些博文以及帖子里综合 ...
- Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】
在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...
- linux驱动编写之阻塞与非阻塞
一.概念 应用程序使用API接口,如open.read等来最终操作驱动,有两种结果--成功和失败.成功,很好处理,直接返回想要的结果:但是,失败,是继续等待,还是返回失败类型呢? 如果继续等待,将进 ...
- IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO
最近看到OVS用户态的代码,在接收内核态信息的时候,使用了Epoll多路复用机制,对其十分不解,于是从网上找了一些资料,学习了一下<UNIX网络变成卷1:套接字联网API>这本书对应的章节 ...
- 《linux设备驱动开发详解》笔记——8阻塞与非阻塞IO
8.1 阻塞与非阻塞IO 8.1.0 概述 阻塞:访问设备时,若不能获取资源,则进程挂起,进入睡眠状态:也就是进入等待队列 非阻塞:不能获取资源时,不睡眠,要么退出.要么一直查询:直接退出且无资源时, ...
- Linux中同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- IO中同步、异步与阻塞、非阻塞的区别
一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...
随机推荐
- 利用ipv6技术,废旧笔记本变成互联网server
如果你家的路由器已经get到了ipv6地址,并且你家的电脑也获取了有效的ipv6地址,在广域网的设备可以访问到.那恭喜你,再配合我这个ddns,你可以完美地把你家的电脑当服务器使用. 1.确保你家的宽 ...
- MongoDB走过的坑(4.0.3版本)
数据存储一般使用本地或者存储在数据库,MongoDB是一个非关系型数据库,今天小结下走过的一些坑. 1.网上的很多教程对自己无效 解决方法:这种情况一般都是和版本有关系,数据库在不断的更新发展,很多东 ...
- 训练指南 UVALive - 4043(二分图匹配 + KM算法)
layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...
- [LA 3942] Remember the Word
Link: LA 3942 传送门 Solution: 感觉自己字符串不太行啊,要加练一些蓝书上的水题了…… $Trie$+$dp$ 转移方程:$dp[i]=sum\{ dp[i+len(x)+1]\ ...
- 【AC自动机】【矩阵乘法】【等比数列】hdu2243 考研路茫茫——单词情结
题解:http://blog.csdn.net/xingyeyongheng/article/details/10005923 这里采用了二分法求等比数列前n项和. 等比数列前n项和也可以用矩乘快速幂 ...
- 【数论】【组合数】【快速幂】【乘法逆元】洛谷 P2265 路边的水沟
从左上角到右下角,共经过n+m个节点,从其中选择n各节点向右(或者m各节点向下),所以答案就是C(n+m,n)或者C(n+m,m),组合数暴力算即可,但是要取模,所以用了乘法逆元. #include& ...
- php获取两个日期之间的所有日期
function getDates($start, $end) { $dt_start = strtotime($start); $dt_end = strtotime($end); do{ echo ...
- Xcode升级后导致插件不能用, 一句代码更新UUID OK~
find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | ...
- NDK之HelloWord!
使用工具:Android Studio 2.2.2 1. 配置local.properties添加NDK路径. 效果:当然,你也可以手输写进去. 2. 项目gradle.properties追加 ...
- ios如何实现被键盘遮挡时,带有textfield的tableview自动上移
最正规的办法,用通知step 1:在进入视图的时候添加监视:(viewDidLoad什么的) 复制代码 // Observe keyboard hide and show notification ...