IO阻塞与非阻塞,同步与异步学习笔记

非阻塞IO
阻塞与非阻塞的区别
为什么有阻塞式
常见的阻塞式:wait,pause,sleep等函数,read,write某些文件
阻塞式的好处
1.有利于操作系统的性能发挥,你阻塞的时候不占CPU
为什么要实现非阻塞式
1.因为需要多路进行执行,比如处理键盘(阻塞)和鼠标监听(阻塞),就需要实现非阻塞
如何实现非阻塞IO访问:
1.在打开文件描述的符的时候添加上O_NONBLOCK和fcntl
O_NONBLOCK
打开之前就知道需要非阻塞式,就以非阻塞式形式打开
fcntl
打开之前并不知道是否需要非阻塞式,如果后面想用非阻塞式,也可以
然后使用while(1)死循环,read fd=1,fd=0来实现只要键盘鼠标有数据就输出的功能,但这性能并不好

IO多路复用(IO multiplexing)
为了解决while(1)循环的性能问题,可以使用IO多路复用(IO multiplexing)
使用select,poll,这两个函数几乎一模一样
实现的方式都是:
外部阻塞(select这个函数是阻塞的),内部非阻塞自动轮询多路阻塞式IO(select内部非阻塞自动轮询键盘和鼠标事件,而键盘和鼠标事件是使用阻塞的方式)
select内存非阻塞式轮询和while(1)不同,会让出CPU,
select 需要驱动程序的支持,驱动程序实现fops内的poll 函数。 select 通过每个设备文件对应的 poll 函数提供的信息判断当前是否有资源可用 ( 如可读或写 ) ,
如果有的话则返回可用资源的文件描述符个数,没有的话则睡眠,等待有资源变为可用时再被唤醒继续执行。
返回值就是注册到select的IO

然后实现多次select,可以使用while(1)死循环来包含select,这样就不会一直占用CPU
其实也可以使用多线程而不用select,但使用多线程会比较浪费

异步IO
异步IO就是操作系统用软件实现的一套中断响应系统
异步IO的工作方法,我们当前进程注册一个异步IO事件(使用signal注册一个信号SIGIO的处理函数),然后当前进程可以正常处理自己的事情,当
异步事件发生后当前进程会收到一个SIGIO信号,从而执行绑定的处理函数去处理这个异步事件,其实就是使用信号来触发。

异步的实现是应用和驱动之间的关系

涉及的函数
fcntl(F_GETFL,F_SETFL,O_ASYNC,F_SETOWN),使用F_GETFL获取当前IO信息,再属性信息中添加O_ASYNC,然后F_SETFL回去就可以实现异步了,异步事件通知发给谁(进程ID或者进程组ID),就使用F_SETOWN

存储映射IO mmap函数(内存映射,即两块内存其实是一块内存)
mmap函数,把一个文件和内存映射对应起来,比如LCD显示,把数据丢到显存(属于内核)就可以显示在屏幕上了。那现在的问题是我们的数据内容在文件中,这么如何放到显存

一般的思路:硬盘文件->读取数据到应用层内存->然后赋值到LCD内核显存->LCD显示,如果这样实现,假设硬盘文件很大,那么就会出现速度过慢的情况,比如电影
使用mmap提高效率
mmap函数,内存映射,即两块内存其实是一块内存,也就是说我只申请了一块物理内存,然后内核层和应用层的虚拟地址都映射到这这块物理内存。

存储映射IO的特点
1.内存共享而不是复制,减少内存操作
2.处理大文件效率高,小文件不划算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值