同步IO、异步IO、阻塞与非阻塞
同步、异步、阻塞与非阻塞
POSIX(可移植操作系统接口)把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO
实际上同步中才存在阻塞与非阻塞,而异步则是非阻塞
同步IO模型
阻塞式IO模型

在用户线程建立socket连接和等待内核把准备好的数据报复制到用户空间的过程都是在挂起的状态,直到将内核数据复制完成。
非阻塞IO模型

在用户线程向内核请求数据报时,如果内核中无准备好的数据报则立刻返回,如果有用户线程挂起,等待将内核数据报复制到用户空间。
IO多路复用模型

与非阻塞IO模型很类似,不过它将轮询内核是否有准备好的数据报的过程交由内核来完成,内核中维护了多个socket,这是与非阻塞IO比较较大的优势。(select和poll系统调用函数是这样,轮询使它们的时间复杂度为o(n),而强大的epoll则与它们不同,它会注册事件回调,使得有数据报准备好后就会触发,时间复杂度为o(1))
信号驱动IO模型

用户线程设置一个回调函数,当内核中有数据报准备好时通知用户线程接收数据报,用户线程挂起等待将内核数据报复制到用户空间。虽然和异步很像,但是接收任需要等待。
异步IO模型

在用户线程进行系统调用后都会立即返回,当内核中有数据报准备好时,会将数据报复制到用户空间,再触发用户线程回调,整个过程的IO操作都是由内核完成。
总结
将IO操作是否由内核完成分为同步IO和异步IO
同步IO中将是否有准备好的数据报看做第一步,接收数据报看做第二步。若第一步无需等待则是非阻塞式IO,反之为阻塞式IO

浙公网安备 33010602011771号