浅析五种IO模型

1 理解IO
IO是数据的输入输出,在网络中其实就是对于socket的读取和发送。在一次IO过程中,数据首先是发送到对端的接受缓冲区里,然后操作系统在从缓冲区中拿走数据。但是并不是我们调用recv接口,操作系统就可以直接从缓冲区里面拿数据的,而是需要缓冲区里面有数据才可以,所以这就需要我们等待数据就绪。
IO整个的过程归纳起来,分为两步:1 等待数据就绪, 2 数据搬迁。
等待数据就绪中其实有很多种等待的方式,这些等待方式就是IO模型。

2 同步IO和异步IO
同步IO和异步IO
简单来说,同步IO就是自己等(自己发起,自己进行数据搬迁),异步IO就是别人帮你来等(自己发起,别人帮忙进行数据搬迁)。
【注】这里的同步和异步和线程中的同步、异步不是一个概念(线程中的同步和互斥是为了防止数据的二义性而做的保护措施)!!!

3 五种IO模型
(1)阻塞IO
阻塞IO:在数据准备就绪之前什么都不做(相当于被挂起),直至等待数据就绪。
图示:
阻塞IO
对于程序调用recv接口这个过程是:
a. 应用程序调用recv接口;
b. 操作系统没有准备好数据,应用程序进行等待;
c. 数据准备就绪,应用程序进行数据拷贝,返回。

阻塞IO的优点:简单,一般默认情况下套接字都是阻塞式的
数据能够及时返回,不延迟
缺点:性能较差

(2)非阻塞IO
非阻塞IO:若数据没有就绪,直接返回。需要以轮询的方式来检测数据有没有就绪。
图示:
非阻塞IO
对于应用程序调用recv接口,这个过程是:
a. 应用程序调用recv接口;
b. 操作系统没有准备好数据,应用程序直接返回;
c. 过一段时间再去检测数据是否准备就绪,若还没有再返回;
d. 直至检测时数据已经准备就绪,应用程序进行数据拷贝,返回。

非阻塞IO的优点:可以在等待期间做别的事情
缺点:需要以轮训的方式进行等待,很麻烦
由于是一段时间检测一次,所以在数据就绪时不能立刻进行数据拷贝

(3)信号驱动
信号驱动:在数据就绪的时候,操作系统发送SIGIO的信号告诉应用程序数据准备就绪。
图示:
信号驱动
对于应用程序调用recv接口,这个过程是:
a. 应用程序建立SIGIO信号处理程序;
b. 操作系统等待数据就绪时,递交SIGIO信号;
c. 应用程序调用recv接口;
d. 完成数据拷贝,返回。

信号驱动优点:在等待数据就绪期间可以做别的事情
缺点:需要建立维护信号处理程序

(4)多路转接
多路转接:在等待数据就绪的过程中,不再一次等待一个文件描述符,而是一次等待多个文件描述符,其中任何一个就绪都可以进行数据搬迁了。
图示:
多路转接
对于应用程序调用recv接口,这个过程是:
a. 应用程序调用select/poll/epoll接口;
b. 操作系统等待数据就绪,返回;
c. 应用程序调用recv接口;
d. 完成数据拷贝,返回。

多路转接的优点:一次可以等待多个文件描述符,缩短了等待时间,使IO更加高效
缺点:为了实现多路转接,需要消耗部分资源

(5)异步IO
异步IO:在操作系统完成数据搬迁之后通知应用程序,应用程序本身不参加IO的相关细节。
图示:
异步IO
在网络中整个过程是:
a. 应用程序调用接口;
b. 操作系统等待数据,数据准备就绪;
c. 操作系统完成数据拷贝;
d. 操作系统向应用程序递交相关信号,告知已完成数据拷贝。

异步IO优点:应用程序不需要参与IO的整个过程,都由内核完成
缺点:异步IO的简单只是对于API的使用者而言,但是还有很多系统不支持异步IO
(最初,异步IO是为了数据库而设计的,因此异步IO的读写不会被缓存,无法利用操作系统的缓存机制)(参考这里:https://www.jianshu.com/p/486b0965c296

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值