同步IO:导致请求进程阻塞,直到IO操作完成;
是内核通知我们何时进行启动IO操作,而实际的IO操作需要当前进程本身阻塞完成;
包括:阻塞式IO模型,非阻塞式IO模型,IO复用模型,信号驱动式IO模型;
异步IO:不导致请求进程阻塞;
是告知内核,内核将IO操作完成之后,通知当前进程,整个过程不需要阻塞;
POSIX的aio_系列函数,目前支持POSIX异步IO的系统比较少见;
如下图(UNP),我们从纵向看,分为两个过程:(1) 等待数据 (2) 将数据从内核复制到用户空间
可以看到前面4种同步IO虽然第一个步骤方式不尽相同,但是在第(2)步的时候均是阻塞的完成数据从内核到用户空间的复制;
而异步IO是内核来完成这两个步骤,并通知当前进程,整个过程不需要阻塞,如图最后一种方式;
下面在结合上图说明下同步IO中的这4种有什么区别,主要是体现在上述过程的第(1)阶段,即等待数据的过程;
阻塞IO:发起操作,如果数据尚未准备就绪,则一直处于阻塞状态,直到数据准备好,完成数据的复制;如上图,阻塞IO的第(1)阶段也是一个阻塞过程;
非阻塞IO:发起操作,检查数据是否准备就绪,未准备就绪立即返回,然后不断检查,直到数据准备继续,阻塞完成数据复制;如上图,非阻塞IO的第(1)阶段是一个反复检查的过程;
IO复用:自己等不如大家一起等,多个描述符添加到epoll/select中一起阻塞等待数据准备就绪,当有数据准备就绪之后,触发事件,对应阻塞完成数据复制;如上图,IO复用的第(1)阶段是阻塞在IO复用的系统调用上的过程;
信号驱动IO:注册一个SIGIO的信号处理函数,当有数据准备好的时候,产生SIGIO信号,触发信号处理函数,阻塞完成数据复制;如上图,信号驱动IO第(1)阶段不需要任何操作,只需要等待信号触发;