典型IO模型之四

任何的IO过程,都包含两个步骤,第一是等待,第二是拷贝。而且在实际的应用场景中,等待消耗的时间往往都远远高于拷贝的时间。为了让IO更加高效,最核心的绑法就是让等待的时间尽量少。

阻塞IO:

在内核将数据准备好之前,系统调用会一直等待。所有的套接字默认都是阻塞方式。
阻塞IO的流程非常简单,一次只能进行一个IO,多个IO的情况下,过程是串行的。
缺点:进程对CPU利用率不够高(因为可能有大量的时间在等待IO就绪)

非阻塞IO:

如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码。
非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符,这个过程称为轮询,这对CPU来说是一种较大的浪费,一般只有在特定的场景下才使用。
非阻塞IO 是对阻塞IO的一种改进,IO未就绪的不会一直等待,可以干些其它事情,干完之后再重新发起调用,不断轮询直到完成IO操作。
非阻塞IO的优点是,相对于阻塞IO操作,效率更高了,对CPU的利用率也更高了。
缺点:非阻塞IO通常是一个循环的过程,失败了就要循环,对CPU的资源造成一种浪费;且流程控制变得更加复杂了。

信号驱动IO:

内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作。
信号驱动IO即:程序员自定义一个IO信号的处理方式,在发起IO调用的时候,如果IO未就绪,则一直做别的事情,等到IO就绪的时候,内核会发送一个IO就绪信号(SIGIO),然后再发起IO调用,执行操作。
信号驱动IO的优点:相较于非阻塞IO,信号驱动IO更加灵活,更加的实时;
缺点:流程控制变得更加的复杂。

异步IO:

由内核在数据拷贝完成时,才通知应用程序。和信号驱动IO不同的是,信号驱动IO是告诉应用程序何时可以拷贝数据,而异步IO是操作系统将数据拷贝完成之后才通知应用程序。
异步IO的流程:定义IO信号处理,发起IO调用之后可以立即返回。IO的等待与数据拷贝过程都由操作系统内核完成;完成后通过信号通知进程。相较于信号驱动IO,异步IO直接让操作系统完成整个IO过程,自己只是发起一个调用,IO完成之后操作系统通过信号通知进程,进程直接对数据进行处理。
缺点:流程控制更加复杂

这四种IO,从阻塞到非阻塞再到信号驱动IO,最后到异步。这几个过程,对资源(CPU/内存)的利用率越来越高,同时能够发起更多的IO调用,让一个IO程序的效率越来越高,但是伴随着效率越来越高,对流程的控制也越来越复杂。

四种IO各自的操作流程以及各自的特性:
阻塞:为了完成一个功能发起调用,若当前不具备完成功能的条件,则调用一直等待。
非阻塞:为了完成一个功能发起调用,若当前不具备完成功能的条件,则立即报错返回。
阻塞和非阻塞的区别:发起一个调用之后,若不具备完成功能的条件,是否立即报错返回。

同步:为了完成一个功能发起调用,进程自己完成功能,功能没有完成之前流程无法继续向下。
(功能的完成时一个串行的过程)
异步:为了完成一个功能发起调用,但是这个功能并不由自己完成,由系统完成,完成之后通知进
程(功能的完成是一个并行的过程,完成到什么程度自己也不知道,只有完成之后才被通知)
同步和异步的区别:发起调用之后,功能是否由进程自身完成。
同步阻塞和同步非阻塞:条件不具备时,是否直接返回。
异步阻塞和异步非阻塞:区别于进程是否等待操作系统完成功能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值