五种网络 I/O 模型

文章目录

    • 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 模型

五种网络 I/O 模型_第1张图片

2. 非阻塞式 I/O 模型

五种网络 I/O 模型_第2张图片

3. I/O 多路复用

五种网络 I/O 模型_第3张图片
 调用并阻塞在`select()`/`poll()`上,而非阻塞在真正的 I/O 调用上,以一个系统调用监听多个套接字。

4. 信号驱动式 I/O

五种网络 I/O 模型_第4张图片
 即让内核在描述符就绪时发送`SIGIO`信号给进程进行通知,我们可以在信号处理器函数中执行`read()`调用读取数据报,并通知主循环数据已准备好,或在信号处理器中通知主循环,令其读取数据。

5. 异步 I/O

五种网络 I/O 模型_第5张图片

 即调用异步函数完成 I/O,这些函数告知内核完成某个操作(如将数据从内核缓冲区拷贝到用户空间),并让内核在操作完成后通知我们。

 异步 I/O 与信号驱动式 I/O 的区别在于:信号驱动式 I/O 是由内核通知我们何时可以开始 I/O;而异步 I/O 是由内核完成 I/O 并通知我们。


6. I/O 模型的分类

 一个输入操作通常包含两个不同的阶段:

  1. 等待数据达到网卡并传递给内核;

  2. 将数据从内核拷贝到用户空间

 前四种模型的主要区别在于第一阶段,即当数据没有准备好时用户进程的处理方式,而它们的第二阶段是一样的:将数据从内核复制到调用者的缓冲区,该读取操作是阻塞的。

 而相反,异步 I/O 模型会自动处理这两个阶段。

 根据这两个阶段中,是否有任意阶段引起阻塞,可以将 I/O 分为两种类型:

  • 同步 I/O 操作:读请求将导致进程阻塞,直到 I/O 操作完成;

  • 异步 I/O 操作:不导致请求进程阻塞。

 其中前四种模型都属于同步 I/O,而异步 I/O 模型属于异步 I/O。

你可能感兴趣的:(开发语言)