一.引子
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执行的两个阶段都完成后,内核会给用户进程发送通知,告诉用户进程已经完成。
网友评论