五种IO通信模型

相关概念:

在说五种IO通信模型之前,先说下几个容易混淆的概念,同步和异步,阻塞和非阻塞。

同步和异步:

主要是看调用方获取结果是主动发起的,还是被动通知的。主动发起的就是同步,被动通知的就是异步。

阻塞和非阻塞:

调用方调用某个方法后,在获取到返回结果之前。如果当前的线程处于挂起状态,什么都不能干,则是阻塞。如果当前线程是运行状态,可以处理其他任务,则是非阻塞。
举个例子,线程A调用了接口B后,一直等待接口的返回结果,则属于同步阻塞,如果线程A可以处理其它任务,但是需要不断轮询查看接口的返回结果,则属于同步非阻塞。如果线程A一直等着接口B的回调来获取结果,则属于异步阻塞,如果线程A可以处理其它任务,服务方会主动通知线程A的执行结果,则属于异步非阻塞。

五种IO通信模型

网络IO一般分为两步,第一步是等待数据,第二步是拷贝数据。由于等待数据一般会占用比较长的时间,为了提高IO效率,会考虑将步骤采用非阻塞的方式,或者异步的方式,或者采用多线程等。常见的IO模型有阻塞I/O、非阻塞I/O、多路复用I/O、信号驱动I/O、异步I/O。

1.阻塞I/O模型

五种IO通信模型_第1张图片
阻塞IO交互上可以分为两个阶段:
第一阶段:用户进程调用recvfrom方法,内核收到请求后,就会准备数据。但是准备数据的过程是比较慢的,此时用户进程处于阻塞状态。
第二阶段:等到数据准备好之后,内核就开始拷贝数据,并且会把数据从内核拷贝到用户内存,然后返回结果。等到用户进程收到数据包后,才解除阻塞状态。

阻塞IO的特点是用户进程在两个阶段都被阻塞,进程阻塞状态不消耗CPU资源,开发难度低,只适合并发量小的场景。
但是每个请求都会分配一个线程(进程)来相应请求,系统开销比较大。
常见的listen(),send(),recv()都是阻塞型的。

2.非阻塞I/O模型

五种IO通信模型_第2张图片
非阻塞IO交互上也可以分为两个阶段:
第一阶段:用户进程调用recvfrom方法,内核收到请求后就开始准备数据,如果当前数据未准备好,系统也不会阻塞用户进程,而是立刻返回一个EWOULDBLOCK错误,用户进程收到EWOULDBLOCK之后,就知道数据还没有准备好,可以等一段时间之后轮询调用recvfrom方法,直到数据准备好。
第二阶段:等到数据准备好后,如果再次收到了用户进程调用的recvfrom方法,就会把数据拷贝到用户内存,并且返回成功。

非阻塞IO的特点是第一阶段属于非阻塞的,但是需要用户进程不断地轮询调用recvfrom方法,消耗CPU资源,适合并发量小并且不需要及时响应的场景。

3.多路复用I/O模型

五种IO通信模型_第3张图片
多路复用IO,多个进程的IO可以注册到一个Selector上,用户进程调用select方法后,Selector会监听注册进来的所有IO,如果所有的IO在内核都没有可读的数据,那么select调用进程会被阻塞,当任意一个IO有可读数据,select调用就会返回。之后select调用进程可以发送recvfrom调用来读取数据,也可以通知另外的进程来读取数据。多路复用也分为2个阶段:
第一阶段:用户进程调用select方法,如果数据未准备好,也是会阻塞。但是这里有多个IO进程注册在上面,任何一个IO的数据准备好,就会返回。
第二阶段:任何一个IO的数据准备好后,再次发起recvfrom调用来获取数据。

多路复用IO的特点是会发起两次系统调用,第一次select,第二次recvfrom。比阻塞IO还多发起一次调用。但是Selector的优势是可以同时监听多个IO,能够处理更多连接,而不是单个连接更快。多路复用IO适合高并发的场景。

4.信号驱动I/O模型

五种IO通信模型_第4张图片
信号驱动IO模型也可以分为两步:
第一阶段:用户进程调用sigaction方法,向内核注册一个信号处理函数,然后就可以返回了,接下来进程不会阻塞,可以继续执行其他任务。
第二阶段:等到数据准备好后,内核会给用户进程发送一个SIGIO信号,用户进程便可以在信号处理函数中调用recvfrom方法来读取数据,读取数据的过程还是阻塞的。

信号驱动IO模型在数据拷贝阶段还是阻塞的,没有实现真正的异步,应用场景比较少。

5.异步I/O模型

五种IO通信模型_第5张图片
异步IO也分为两个阶段:
第一阶段:用户进程发起aio_read调用,内核收到调用后,会立刻返回,之后用户进程就可以执行其他操作了。内核会完成数据的准备工作。
第二阶段:数据准备好后,内核会把数据拷贝到用户内存,等到所有操作完成后,内核会给用户进程发送信号,告诉它aio_read操作已经完成。

异步IO是五种通信模型中,真正实现异步的模型,适合高性能,高并发的场景,但是需要操作系统底层支持,开发和实现难度比较大。

你可能感兴趣的:(计算机网络,IO,通信模型)