【Linux】图解五种IO模型(阻塞,非阻塞,信号驱动,异步,多路转接)

五种IO模型

在讲五种IO模型之前,我们先来看一下阻塞,非阻塞,同步和异步的区别:

阻塞:发起调用之后,若条件不满足,则一直等待直到条件满足
非阻塞:发起调用之后,若条件不满足,则报错返回。
区别:发起调用的时候不具备完成条件的情况下是否会立即返回

同步:处理流程中,顺序处理,一个完成之后再完成下一个,因为并且所有的功能都由进程自身完成
异步:处理流程中个,顺序不定,因为功能都由操作系统完成,完成的顺序不一定。
区别:功能是否由进程自己完成,完成的顺序是否是确定的。

异步阻塞:功能由别人完成,等着别人完成(老板做面的时候,我一直等,做完饭通知我,我再去吃饭)
异步非阻塞:功能是别人完成的,调用时立即返回的。(老板做面的时候,我玩手机,做完饭通知我,我再去吃饭)
同步: 一个一个做,都是由自己处理,大多数是阻塞的。

五种IO调用就是操作系统提供给我们的,当发起IO调用的时候,操作系统让我们以后进行IO的的时候选择合适的场景来选择合适的IO模型

IO的过程:IO等待+IO调用。
发起IO调用,等待IO就绪条件(比如Recv的时候,得有数据的时候才可以接受数据),然后将数据拷贝到缓冲区进行处理。

阻塞IO :为了完成IO,而发起的调用,若当前不具备IO条件,则一直等待

在这里插入图片描述
优点: 流程非常简单,清晰明了,一个IO完毕之后才能进行下一个
缺点: 对于CPU没有充分利用,大部分时间都在IO等待。

非阻塞IO : 为了完成IO,发起调用,若当前不具备IO条件,则立即返回(干点其它的事情,干完了之后需要重新发起IO)

在这里插入图片描述
优点:流程相对阻塞操作来说,相对复杂,但是对资源的利用更加充分。
缺点:IO操作不够实时

信号驱动IO: 定义一个IO信息的处理方式,在处理中进行IO操作。IO就绪之后信号通知进程,进程在IO就绪的时候取进行IO.(操作顺序是不定的,不用特意的等待IO就绪)

在这里插入图片描述
优点:IO更加实时,最资源的利用也更加充分
缺点:流程更加复杂。

异步IO: 通过异步IO告诉操作系统,IO有哪些数据拷贝到那里,IO的等待与拷贝的过程都由操作系统来完成(操作顺序是不定的,功能由操作系统完成)

在这里插入图片描述

优点: 对资源的利用更加充分。
缺点: 流程更加复杂。

这四种IO的操作流程是越来越复杂的,但是对CPU资源的利用是越来越充分的。
举个例子:
CPU只有一个核心,完成三个调用,完成一个之后再去完成下一个,对资源的利用率会越来越高,到后面就更加实时,信号通知了再去调用,对资源的利用也更加充分。异步IO,只需要将三个调用中的数据 拷贝到 固定的位置,只用根据信号通知进行数据处理,等待与拷贝的过程,不管。最资源的利用率更加的充分。

多路转接IO:

多路转接IO:对大量的IO事件进行集中监控,可以告诉进程现在有哪些描述符就绪了哪些事件,然后进程就可以直接只针对就绪了对应事件的描述符进行相应操作即可,避免了对没有就绪的描述符进行IO操作所导致的效率降低/程序流程阻塞。
IO事件: 哪一个描述符是 可读事件/可写事件/异常事件

例如: 基本的tcp服务器,一个执行流中,既有accept,也有recv/secd, 然而每种操作都有可能在不满足条件的时候阻塞。若大量的描述符中对一个没有就绪的描述符进行操作(对没有新连接的监听套接字调用accept/对没有数据到来的新的通信套接字recv),都会导致流程阻塞,其它的描述符就算就绪了,也无法操作。

多路转接对大量的描述符进行集中进行IO事件监控,没有新的监听套接字就不调用accept,没有新的通信套接字到来就不会调用recv, 避免对未就绪的事件到来而导致效率降低。

多路转接模型大多用与TCP的服务端,但是udp的服务端也会用到,因为只要有事件监听的请求,都可以采用多路转接模型(select,epoll),只是因为udp服务端只用了一个soctet套接字就可以获取所有客户端的信息,所以它的事件监听其实主要是看有没有信息到来了,这样子,就是它本身可以去阻塞操作,其使用多路转接模型(select,poll)意义不大。

猜你喜欢

转载自blog.csdn.net/weixin_43939593/article/details/106653399
今日推荐