我爱编程

Linux的五种I/O模型

2018-04-12  本文已影响0人  viean

一.引子

linux进行磁盘、网络等I/O操作时,进程是无法直接操作I/O设备,所有操作都经由系统调用请求Linux Kernel来协助完成I/O动作,且内核会为每一个I/O设备维护一个Buffer。如下图展示了进程进行I/O操作时的流程: 用户进程进行I/O操作的流程

流程介绍:process发起请求,Kernel接收请求,从I/O设备中获取数据至Kernel的Buffer,再将Buffer中的数据拷贝到用户进程的地址空间,进程获取到数据后,再响应客户端;(上图中红色线条的两阶段)

二.I/O模型的划分

在整个交互过程中数据输出至Kernel的buffer及将数据copy到用户进程的地址空间都需要时间。因此根据这两段时间内等待方式的不同,I/O模型分为五种模式:

1.阻塞I/O (Blocking I/O)
2.非阻塞I/O (Non-Blocking I/O)
3.I/O复用 (I/O Multiplexing)
4.信号驱动的I/O (Signal Driven I/O)
5.异步I/O (Asynchrnous I/O)

阻塞:调用进程一直处于等待状态,直到操作完成;
非阻塞:在内核的数据还未准备好时,会先返回,进行进行其他操作;
从同步异步,以及阻塞、非阻塞两个维度来划分来看:


I/O模型同步及阻塞维度划分

三.I/O模型分别介绍

1.阻塞I/O

特点:I/O执行的两阶段进行都被block.

2.非阻塞I/O

特点:用户只有在第二阶段被阻塞,第一阶段没有阻塞。第一阶段中,用户进程轮询内核,看数据是否准备好。与轮询方式对应的为信号驱动 的I/O,如下一个所示。

3.信号驱动的I/O 或 基于事件驱动的I/O模型


特点:第一阶段未阻塞,第二阶段阻塞;用户进程不需要轮询系统内核,等数据准备好时,内核主动通知用户进程。

4.I/O复用


特点:I/O执行的两个阶段都是阻塞的;两个阶段是独立的,一次完整I/O操作中,用户进程发起两个系统调用。

注:I/O多路复用模型应用非常广泛,其核心思想可以用下图介绍;


select, poll, epoll 都是I/O多路复用的具体的实现,之所以有三者的存在,其实是他们出现是有先后顺序的。具体介绍参考如下链接:
https://www.cnblogs.com/creazylinux/p/7364685.html

5.异步I/O


特点:用户进程发起系统调用后,立即可做其他事情(不阻塞),直到I/O执行的两个阶段都完成后,内核会给用户进程发送通知,告诉用户进程已经完成。

四.五种模型总结

备注:参考 cnblog @子夜文章,在此感谢

上一篇下一篇

猜你喜欢

热点阅读