IO复用\阻塞IO\非阻塞IO\同步IO\异步IO
以下是对 《UNIX网络编程卷1》第6章的总结。
首先,介绍几种常见的I/O模型及其区别,如下:
blocking I/O
nonblocking I/O
I/O multiplexing (select and poll)
signal driven I/O (SIGIO)
asynchronous I/O (the POSIX aio_functions)
不管Linux的IO模型的阻塞同步分类是如何分类,几种IO模型的具体实现是确定的。这里借用《Unix 网络编程:卷一》的图片说明。
IO操作分为两个阶段:
(1) 准备阶段,例如输入操作时要等待数据已经就绪,输出操作时缓冲区中有空间可供使用;
(2) 数据拷贝阶段,例如输入操作时将数据从内核复制到用户缓存,输出操作时将用户缓存复制到内核。
以读取系统调用recvfromfrom为例,每当用户进程发起一个recvfrom操作,站在用户进程的角度,其实它包含上述两个请求:第一个请求就是看看数据是不是准备好了,如果没有准备好就把我阻塞那里(对应阻塞IO)或者给我返回个没有准备好的标志(对应非阻塞IO);第二个请求就是在数据就绪的时候将数据拷贝给用户进程。
阻塞IO模型
阻塞IO模型中,以数据接收为例,进程调用recvfrom系统调用向内核请求读取数据,其内部过程将如下图1所示:
(2) 非阻塞IO模型
3) IO复用模型
(4) 信号驱动IO模型
(5) 异步IO模型
同步IO:导致请求进程阻塞,直到IO操作完成;
异步IO:不导致请求阻塞;
因此,前面介绍的5中模型中,前4中IO模型都属于同步IO,因为他们第二阶段的复制数据过程将阻塞用户进程,只有第5种才是真正的异步IO模型
,因为前4中模型在第一阶段的准备阶段有区别,在第二阶段的数据拷贝过程中都会阻塞用户进程,而(5)在第一阶段的准备阶段和第二阶段的数据拷贝过程都不会阻塞用户进程。