主要对于I/O中同步、异步、阻塞与非阻塞之间关系的梳理。因为他们之间的关系自我感觉太过于模糊,所以需要梳理一下,一下仅为个人见解。

同步与异步

同步指:一个任务B依赖于任务A,只有等待任务A执行完成通知任务B之后,任务B才能继续进行进行;是可靠的。

异步指:一个任务B依赖于任务A,但是任务B不需要等待任务A执行完成就可以继续执行,置于任务A是否执行完成它(B)并不关心。

同步/异步体现的是一种消息通知机制,一个任务依赖另一个任务,同步需要等待被依赖任务完成并返回通知;而异步情况下则不要等待,依赖任务在收到通知后再使用回调方法处理即可。(又体现了一个实时性)。

阻塞与非阻塞

阻塞与非阻塞体现在等待消息返回时的状态

阻塞:在等待被依赖A任务完成消息的时候,任务B一直在等待,而不能进行其他操作。

非阻塞:任务B在等待依赖任务A的时候不需要一直等待,可以做其他的事情。通过轮询判断判断任务A是否完成。

实例

通过上面的组合,就有四种情况:(以应用商店下载app为例)

  1. 同步阻塞:实时性高;效率低,cpu资源浪费;

    实例:

    • 同步:下载app的时候等待下载完成(进度条100%)通知并且需要立即安装使用。
    • 阻塞:在下载的时候什么都不做,只是等待。
  2. 同步非阻塞:效率较高,cpu利用率提高;但是开销增大,因为需要有线程不断轮询被依赖任务是否完成以继续操作该任务,同时上下文切换有大量额外开销;

    实例:

    • 同步:下载app的时候等待下载完成(进度条100%)通知并且需要立即安装使用。
    • 非阻塞:把下载放在后台,可以看看微信消息,同时不时的打开后台看看下载多少了。
  3. 异步阻塞:自相矛盾,很小用。

    实例:

    • 异步:下载app就行,不急着用,什么时候下载完通知我就就行。
    • 阻塞:一直等待通知,其他什么也不做。
  4. 异步非阻塞:效率高,cpu利用率高;实时性较低。

    实例:

    • 异步:下载app就行,不急着用,什么时候下载完通知我就就行。
    • 非阻塞:就放在后台下载不管,这是可以区打一盘游戏等等;下载完会跳出通知消息,等我打完游戏再去安装使用(回调)。

通过上面的实例也可以看到,同步情况下是一种人(用户程序)主动去检查下载是否完成(io是否完成);而异步情况下时在下载完成后由系统通知人(用户程序)下载(io)完成,用户程序再调用回调函数进行操作。