copy form https://blog.csdn.net/lisonglisonglisong/article/details/51944671
两个阶段:
- 等待数据
- 数据从内核态复制到用户态
1. 阻塞式IO
阶段1与阶段2都阻塞
2. 非阻塞式IO
依然会在阶段2阻塞
3. IO多路复用(事件驱动IO)
依然会在阶段2阻塞
4. 信号驱动式IO
5. 异步IO
五种IO模型比较
1-4 都是阶段2阻塞
阻塞/非阻塞
阻塞I/O会一直阻塞用户进程直到操作完成
非阻塞I/O在内核的数据还没准备好的情况下会立即返回
同步/异步
POSIX是这样定义的:
A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes. —— 同步IO操作导致进程阻塞,直到IO操作完成。
An asynchronous I/O operation does not cause the requesting process to be blocked. —— 异步IO操作不导致进程阻塞。
上面定义中的I/O operation是指真正的I/O系统调用,比如recvfrom,所以阻塞式I/O模型、非阻塞式I/O模型、I/O复用模型、信号驱动式I/O模型都属于同步I/O。
只有异步I/O模型属于POSIX定义的异步I/O,因为在异步I/O模型中,用户进程是将整个I/O操作都交给内核来完成,内核完成后发信号通知,在此期间用户进程完全不用去理会。