I/O 模型


目录
  • 参考资料
  • 1.阻塞式IO
  • 2.非阻塞IO
  • 3.IO 复用模型
  • 4.信号驱动式 IO 模型
  • 5.异步 IO
  • 6. IO 模型的比较

参考资料

  • UNIX网络编程卷1:套接字联网API(第3版)
  • 《linux 用户空间与内核空间——高端内存详解》—— Tommy_wxie

1.阻塞式IO

一个输入操作通常包括2个阶段:

  1. 等待数据准备好
  2. 从内核向进程拷贝数据

Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间。两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。用户空间的内存映射采用段页式,而内核空间有自己的规则;

2.非阻塞IO

当内核无数据准备好时,进程调用 receiveFrom 方法不是阻塞而是返回一个EWOULDBLOCK错误,进程轮询(polling)调用receiveFrom 方法直到返回成功。

3.IO 复用模型

有了IO复用,我们就可以阻塞在调用 select 或者 poll上,而不是阻塞在真正的 I/O 系统调用上。

4.信号驱动式 IO 模型

让内核在描述符就绪时用 SIGIO 信号通知我们,称为“信号驱动式 IO”。

首先开启套接字的信号驱动式IO功能,并通过 sigaction 安装一个信号处理函数。该系统调用立即返回,我们的进程继续工作。
当数据包准备好,内核为该进程产生一个 SIGIO 信号。随后可以在信号处理函数中调用 recvFrom 读取数据包,通知主循环数据已准备好待处理。
也可以立即通知主循环处理函数。

5.异步 IO

调用 aio_read 函数给内核传递描述符,缓冲区指针,缓冲区大小(与 read 相同的三个参数)和文件偏移,
并告诉内核当整个操作完成后通知我们。该系统调用立即返回,在等待 I/O 完成期间,进程不会被阻塞。

6. IO 模型的比较