高级io:
五种io模型:阻塞io,非阻塞io,信号驱动io,异步io,同步io
多路转接io模型:select,poll,epoll
五种io模型:
eg:钓鱼
鱼竿–>过程–>鱼竿鱼饵抛出去–>等待鱼(看鱼漂动没有动)—>阻塞io
阻塞io:进行io读取数据,不一定能进行io等待–>找到读写位置才能io–>直到读取到数据
等待过程:做其他事然后看一下鱼漂
非阻塞io:完成某个功能立即报错返回完成其他功能循环检测–>时序性缺点,不用死等
鱼竿上面绑定铃铛–>响了就有鱼
信号驱动io:信号通知进行io
钓鱼->喜欢鱼不喜欢鱼的过程–>找了个人去钓鱼–>调到鱼–>事情别人做自己拿结果()
异步io:io操作让操作系统做等待数据拷贝过程,发起io调用数据存储由操作系统做,自己拿到数据就好
钓鱼:拿了很多鱼竿看不过来找一个人这个人看着有鱼自己过来拿出来哪个鱼竿中的鱼
多路转接:本身不进行io操作–>监控–>很多文件描述符进行io,知道哪个描述符就绪对哪个进行处理就会回阻塞,对大量描述符集中监控–>告诉哪个可以操作
io操作分了两个过程,分别是等待+数据拷贝
大多是在等待,拷贝时间比较少
阻塞io:发起io调用若不具备io条件则等待–>等待io条件具备–>具备后拷贝数据返回
流程控制简单(等待)实时性好,对资源要求高
非阻塞io:发起io调用若不具备io条件立即报错返回–>做其他事重新循环发起调用(非阻塞通常都是循环的)–>具备io条件则拷贝数据–>正确返回
任务的利用率高,不够实时(等待时间过短/过长)
信号驱动io:先定义io信号处理方式,定义好之后如果io条件具备直接信号通知进程–>条件具备发起调用(已经具有条件)–>条件调用拷贝数据
实时性强,流程控制难(已经是种异步,等待由操作系统,然后拷贝数据但是异步是(数据拷贝已经完成))
异步:定义信号处理等待由(操作系统,其他线程进程)等待–>等待io条件具备,数据拷贝也由别人完成,完成之后进行通知–>信号通知进程io完成 发起异步io调用通常直接返回
异步阻塞和异步非阻塞
阻塞:为了完成功能发起调用若当前不具备完成条件则一直等待直到完成后调用返回
非阻塞:为了完成功能发起调用若当前不具备完成条件直接报错返回,通常需要循环处理
阻塞和非阻塞区别:发起调用后是否会立即返回,立即返回非阻塞,等待则是阻塞
同步:为了完成功能发起调用若当前不具备完成条件则自己等待完成功能后返回(功能自己完成)
同步通常是阻塞的–>功能不完成要自己完成返回
异步:为了完成功能发起调用,但是功能由别人完成
同步与异步区别:功能是否由自己来完成
同步操作通常都是阻塞操作
异步包含两种:异步阻塞操作和异步非阻塞操作
异步阻塞操作:吃饭吃面做面由厨师做,做好了通知你吃面,面没有做好自己得等–>虽然不是功能不是自己完成但是等待别人完成操作
异步阻塞操作:等待别人完成操作
异步非阻塞操作:不等面做其他事,面好了通知,直接吃面
异步非阻塞操作:不等待被人完成操作
同步异步优缺点对比:同步流程控制简单但是效率相较低,异步流程控制较难,但是消耗资源少,效率相对较高
同时发送多个io调用
异步阻塞:别人监控,自己做可能看到后面的前面有鱼上钩但是没有注意到鱼丢了
阻塞–>异步(四个):性能好流程控制难了
多路转接io/多路复用io:
功能:io事件的监控;同时对大量的描述符进行事件监控;监控描述符是否具备io条件,如果具备返回
针对就绪的io进行操作–>处理高并发模型–>针对io事件具备的进行操作
多路转接模型–>都实现对大量描述符进行事件监控的
高级io--select epoll poll
最新推荐文章于 2022-08-22 12:06:55 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)