文章目录
- 1. 阻塞式 I/O 模型
- 2. 非阻塞式 I/O 模型
- 3. I/O 多路复用
- 4. 信号驱动式 I/O
- 5. 异步 I/O
- 6. I/O 模型的分类
Unix 下有五种可用的 I/O 模型:
-
阻塞式 I/O
-
非阻塞式 I/O
-
I/O 多路复用(
select
/poll
/epoll
) -
信号驱动式 I/O(
SIGIO
) -
异步 I/O(POSIX的
aio_
系列函数)
1. 阻塞式 I/O 模型
2. 非阻塞式 I/O 模型
3. I/O 多路复用
4. 信号驱动式 I/O
5. 异步 I/O
即调用异步函数完成 I/O,这些函数告知内核完成某个操作(如将数据从内核缓冲区拷贝到用户空间),并让内核在操作完成后通知我们。
异步 I/O 与信号驱动式 I/O 的区别在于:信号驱动式 I/O 是由内核通知我们何时可以开始 I/O;而异步 I/O 是由内核完成 I/O 并通知我们。
6. I/O 模型的分类
一个输入操作通常包含两个不同的阶段:
-
等待数据达到网卡并传递给内核;
-
将数据从内核拷贝到用户空间
前四种模型的主要区别在于第一阶段,即当数据没有准备好时用户进程的处理方式,而它们的第二阶段是一样的:将数据从内核复制到调用者的缓冲区,该读取操作是阻塞的。
而相反,异步 I/O 模型会自动处理这两个阶段。
根据这两个阶段中,是否有任意阶段引起阻塞,可以将 I/O 分为两种类型:
-
同步 I/O 操作:读请求将导致进程阻塞,直到 I/O 操作完成;
-
异步 I/O 操作:不导致请求进程阻塞。
其中前四种模型都属于同步 I/O,而异步 I/O 模型属于异步 I/O。