当前位置: 代码迷 >> 综合 >> linux高级IO
  详细解决方案

linux高级IO

热度:20   发布时间:2024-03-07 09:45:04.0

高级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流程简单,同一时间资源占用少。但是异步IO效率高,同一时间占用的资源多,处理效率高!

多路转接IO:主要用于进行大量的IO就绪事件监控,能够让我们的进程只针对就绪的IO进行IO操作

就绪事件:IO事件的就绪

  可读事件:一个描述符当前是否有可读数据

  可写时间:一个描述符当前是否可以写入数据

  异常时间:一个描述符是否发生了某些异常

只针对就绪的描述符进行IO操作有什么好处?---------避免阻塞,并且提高了效率。

答:在默认的socket中,例如一个tcp的一个服务端只能与一个客户端的socket通信一次,因为们不知道哪个为客户端新建的socket有数据到来或者监听socket有新连接,有可能就会对没有新连接到来的监听socket进行accept操作而阻塞或者对没有数据到来的普通socket进行recv阻塞。

  在tcp服务器中,将所有的socket设置为非阻塞,若没有数据到来,则立即报错返回,进行下一个描述符的操作,这种操作中,有一个不好的地方就是对没有就绪事件的描述符,降低了处理效率!

如何实现多路转接IO:select模型,poll模型,epoll模型!

 

 

待续。。。。介绍多路转接IO的具体实现!