按照《Unix 网络编程》的划分,I /O 模型可以分为: 阻塞 I /O、非阻塞 I /O、I /O 复用、信号驱动 I /O 和异步 I /O,按照 POSIX标准来划分只分为两类: 同步 I /O 和异步 I /O。一个 I /O 操作实际上分成了两个步骤: 发起 I /O 请求和实际的 I /O 操作,同步I /O 和异步 I /O 的区别就在于第二个步骤是否阻塞,如果实际的 I /O 读写阻塞请求进程,那么就是同步 I /O,因此阻塞 I /O、非阻塞 I /O、I /O 复用、信号驱动 I /O 都是同步 I /O,如果实际的 I /O 读写操作不阻塞请求进程,而是操作系统帮你完成 I /O 读写,将数据从内核内存区读取到用户空间再将结果返回给你,那么就是异步 I /O。阻塞 I /O 和非阻塞 I /O 的区别在于第一步,发起 I /O 请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞 I /O,如果不阻塞,那么就是非阻塞 I /O。
例如,基于Reactor模型的 NIO 框架做到的仅仅是发起 I /O 请求时不阻塞,具体的 I /O 读写是有相应的时间派发处理器交给用户线程来处理的.
参考文献:
[1]叶柏龙,刘蓬.Proactor模式的NIO框架的设计与实现[J].计算机应用与软件,2014,31(09):110-113.