理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO

Posted darrenqiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO相关的知识,希望对你有一定的参考价值。

以下是IO的一个基本过程

 技术分享图片

先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间。当用户程序读取数据的时候,会经历两个过程:磁盘到内核空间(这块消耗性能,下面简称内核数据准备),内核空间拷贝到用户空间(下面简称用户空间拷贝)。

 

基于这个前提,同步异步IO,阻塞非阻塞IO

这几个概念其实非常类似的,区分的关键点在于被调用者的返回方式。

当我们进行IO操作的时候,如果被调用者将任务全部执行完返回,称为同步/阻塞 IO

 技术分享图片

如果被调用者,不管没有操作成功,直接返回一个结果码,但是不再主动通知后续结果,称为非阻塞IO;这种情况下需要重复调用查询状态。

 技术分享图片

如果被调用者,不管有没有操作成功,直接返回个结果码,等到全部操作完成之后再发一个信号通知调用者,称为异步IO

技术分享图片

 

举个例子:

家里有个专门帮忙做饭的阿姨,有一天我想喝水了,我让阿姨帮忙烧一壶水。

我看着她去烧水,灌水,给我倒水,期间没有做其他任何事情,这就是同步。

我想着也不用一直等,可以先看会儿电视,我就隔一会儿来看一次,隔一会儿来看一次,这叫非阻塞。

再想想,这也烦,我索性跟阿姨说,好了叫我一声,然后就去看电视去了,这叫异步。

 

而IO多路复用,信号驱动IO则是基于前面四个模型的衍生。

IO多路复用是基于阻塞IO的衍生,主要是为了提高内核空间数据准备这一块的功能复用,即阻塞的同时监听多个端口,有一个端口有数据就进行处理,提高性能。

技术分享图片

 

信号驱动IO则是在内核空间数据准备这一块采用异步,在用户空间拷贝这一块采用同步。

 技术分享图片

 

以上是关于理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO的主要内容,如果未能解决你的问题,请参考以下文章

理论铺垫:阻塞IO非阻塞IOIO多路复用/事件驱动IO(单线程高并发原理)异步IO

关于同步异步阻塞和非阻塞多路复用(IO系列一)

python IO模式(多路复用和异步IO深入理解)

python同步和异步IO

IO模型--阻塞IO,非阻塞IO,IO多路复用,异步IO

网络编程之IO多路复用