IO分为两步:
- 等待数据准备好
- 数据搬迁
五种IO模型包括: 阻塞IO, 非阻塞IO, 信号驱动IO, IO多路转接, 异步IO
阻塞式IO
blocking I/O
在内核将数据准备好之前一直阻塞
非阻塞IO
noblocking I/O
调用程序发起系统调用之后不断轮询询问内核数据有没有准备好.
没有准备好时不会阻塞程序
信号驱动IO
signal blocking I/O
当数据报准备好时,内核会给调用程序发送一个信号
在等待信号期间调用程序不会阻塞
IO多路转接
I/O multiplexing
类似于非阻塞型I/O,只不过轮询不是用户线程去执行,而是内核去轮询.内核监听程序监听到数据准备好后,调用内核函数复制数据到用户态.
异步IO
asynchronous I/O
异步IO依赖信号处理程序来进行通知.
不过前面都是数据准备阶段的阻塞和非阻塞,异步IO模型通知的是IO操作已完成,而不是数据准备完成.
异步IO才是真正的非阻塞,主进程只负责做自己的事情,等IO操作完成.