一、典型IO模型
IO,输入输出,过程分为两步:
一步是等待IO就绪,一步是拷贝数据,
对数据进行对应的处理。
(一)阻塞IO
为了完成IO操作,发起IO调用,
若是当前不具备IO完成的条件,则调用不返回,一直等待。
1.人去钓鱼,把鱼饵抛入水中,接下来一直等浮漂抖动,抖动就表示有鱼,加粗样式浮漂不动,人就一直等着。
优点:
- 操作简单,清晰明了。
缺点:
- 效率较低,资源没有充分利用。
(二)非阻塞IO
为了完成IO操作,发起IO调用,若是当前不具备IO完成的条件,则调用立即报错返回。
- 人去钓鱼,觉得一直盯着浮漂不划算,所以掏出手机打一把游戏,打完了再看浮漂。
优点:
- 效率相较于阻塞操作有所提高,提升了资源利用率。
缺点:
- 流程复杂了一点,需要循环进行操作才能成功;
- 操作不够实时,必须等到当前其他操作完成才能重新调用。
(三)信号驱动IO
为了提高资源利用率,先自定义IO就绪信号,
当收到就绪信号,则表示IO就绪,这时候发起调用直接拷贝数据。
3.人去钓鱼,为了更加实时,人就给鱼竿上绑了一个铃铛,在抛下鱼饵后,人就开始打游戏,等到铃铛响了再钓鱼。
优点:
- 资源利用率高,实时性高。
缺点:
- 流程相对复杂。
(四)异步IO
别人把事情做好了再叫自己;
发起一个异步IO调用,IO操作由系统完成,完成后通知进程。
4.人去钓鱼,钓鱼的目的是为了做鱼吃,去钓鱼的时候带上另一个人,让另一个人钓鱼,掉到后顺便做好,然后再叫自己。
优点:
- 资源利用率最高,效率是最高的。
缺点:
- 流程是最复杂的。
有兴趣的可以了解Linux下的AIO—Linux下的异步IO, 常用于高性能IO要求场景。
(五)总结
1.阻塞
为了完成一个操作发起调用,若当前不具备完成条件,则调用不返回。
2.非阻塞
为了完成一个操作发起调用,若当前不具备完成条件,则报错返回。
3.阻塞与非阻塞
通常用于讨论一个接口的特性, 发起一个接口调用之后,接口是否能够立即返回。
4.同步
这个同步不是同步互斥的同步,而是同步异步的同步,
描述的是一种操作流程,操作自己完成,一个完成后才能进行下一个。
5.异步
操作由系统完成,不用等待一个完成才能进行下一个,
而是可以直接发起下一个操作,操作完成后系统会通知进程。
6.异步阻塞
发起异步操作后,等待系统完成。
7.异步非阻塞
发起异步操作后,不等待系统完成,操作接口直接返回。
8.同步与异步
通常用于讨论操作流程思想。
(操作是由自己一个一个按流程完成,还是发起操作由系统完成后通知自己)