高级Io操作
高级IO操作
4.1 IOC ioctl函数接口
IOC命令码 ioctl接口主要是负责read及write不能完成的操作
4.2 Proc文件目录在驱动中的作用
proc中间层的作用
驱动是服务与设备的,在linux中设备又是以一个设备文件体现在系统中,所以我们proc就是一个中间层
可以在用户界面反映内核驱动功能的临时状态。
4.3非阻塞io
什么叫做资源可用与不可用,明确了我们采用非阻塞io的时候遇到资源不可用会返回一个错误信息EAGAIN
非阻塞的优点:发生错误信息的时候,用户可以第一时间感知
非阻塞的缺点:会占用部分cpu资源,导致拉低系统的效率
4.4阻塞io
当发生资源不可用,我们会将对应进程加入到等待队列。
阻塞的优点:将进程加入休眠后不会占用cpu,linux中默认的io模式
阻塞的缺点:发生错误信息的时候,用户无感知
等待队列:实现是wait函数来实现,当有对应唤醒的操作会执行wake up 函数将休眠的进程唤醒执行
注意:信号量,排他性,超时时间,等待队列头的初始化
4.5 io的多路复用
poll监听函数的应用
典型的例子就是老式的插线键盘,在使用键盘的时候我们涉及到两个驱动来支持一个功能。
我们就必须考虑两个驱动进程可能发生的阻塞情况,所以我们的解决方案是使用poll监听我们关心的事件
只要我们的键盘发生阻塞后,串口传输与键值转换中发生了任意一个我们关心的事件,我们的poll函数就会
强制将进程执行。
int poll (struct pollfd*fds,nfds_t nfds , int timeout)函数原型
struct pollfd*fds 类型指向struct pollfd 的fds指针
pollfd类型的三个成员
1、int fd poll要监听的文件描述符
2、short events 监听的事件 事件:POLLIN,POLLOUT 无阻塞的读,无阻塞的写
3、short revents 返回的事件
nfds 我们监听的文件描述符个数
time out 超时值 以ms为单位
timeout为一个负数,一直监听我们的fd,直到我们的fd发生了事件,返回
Ret=Poll (fds,2,-1); 表示 我们监听fds成员 ,监听两个成员 ,一直监听直到返回事件产生
{
if(ret=POLLIN)
}
4.6异步io
aiow或者aior读写控制块
异步io:阻塞发生在我们驱动层面,可以用这点区分之前的三种io模型,异步io同时具备了非阻塞io的特点以及阻塞的特点。
异步会继承非阻塞的优点,会反馈给用户一些可视化信息,阻塞的特点异步也有,就是不占用cpu,将进程加入等待队列,
其独特的特点是阻塞发生在驱动层面。之前的三种io阻塞发生的地点都是在应用程序中
异步可以在发生资源不可用的情形下,报错或者报其他参数显示给我们用户,让用户感知。
以及在阻塞的时候不占用cpu资源。
之前给大家举例,大家读小说100w字,以一个大的read进程去读,但是我们一次只能读10w字
以这样的方式使用aior控制块实现了我们在一个大进程下面多个子进程运行,直到在进程执行到中段的时候发生了资源不可用
比如说我们100w字的小说读到40w的时候,我们人困了睡着了,读的进程无法继续了。
我们的aior控制块会把我们已经读的40w字(也就是我们走完了的子进程)反馈给我们用户感知
同理,我们的aiow控制块也是一样的道理。
通过控制块我们才能实现异步io,也就是可以在发生资源不可用的情形下,报错或者报其他参数显示给我们用户,让用户感知。
4.7几种io模型的总结
io模型的话总的大类来说就是分为两种,阻塞与非阻塞
无等待队列:非阻塞与io的多路复用
有等待队列:阻塞与异步io
同步:一个进程一次执行完
异步:控制多个进程
4.8异步通知
通过信号的方式让我们应用程序直接能够在底层的驱动程序上读或者写数据,并通信关键信息给用户
4.9mmap 设备文件操作
映射,将内存映射到物理空间,再由物理空间映射给应用程序使用。
- 点赞
- 收藏
- 关注作者
评论(0)