I/O 模型
目录
- 参考资料
- 1.阻塞式IO
- 2.非阻塞IO
- 3.IO 复用模型
- 4.信号驱动式 IO 模型
- 5.异步 IO
- 6. IO 模型的比较
参考资料
- UNIX网络编程卷1:套接字联网API(第3版)
- 《linux 用户空间与内核空间——高端内存详解》—— Tommy_wxie
1.阻塞式IO
一个输入操作通常包括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 完成期间,进程不会被阻塞。