1.Linux IO体系
IO调度器系统(I/O Scheduler)是Linux I/O体系中的一个组件,其所处的体系位置如下图所示:
Linux整体I/O体系可以分为七层,它们分别是
- VFS虚拟文件系统:抽象出文件系统接口,其下可以对接ext4,xfs等多种具体的文件系统而上层使用者只需要使用VFS提供的统一接口即可。
- 文件系统缓存Page Cache/磁盘缓冲Buffer Cache:通过空闲内存将对文件读写的数据放入内存,以获取更快的IO响应。
- 映射层:内核通过映射层来确定数据在物理块设备上的位置。
- 通用块层:由于绝大多数情况的I/O操作是跟块设备打交道,所以Linux在此提供了一个类似vfs层的块设备操作抽象层。下层对接各种不同属性的块设备,对上提供统一的Block IO请求标准。
- I/O调度层:大多数的块设备都是磁盘设备,所以有必要根据这类设备的特点以及应用特点来设置一些不同的调度器。
- 块设备驱动:块设备驱动对外提供高级的设备操作接口。
- 物理硬盘:这层就是具体的物理设备。
以一次读操作为例:
- 系统调用read()触发VFS函数,参数为文件描述符与偏移量
- VFS确定请求的数据是否已经在内存缓冲区中;若数据不在内存中,确定如何执行读 操作。
- 假设内核必须从块设备上读取数据,这样内核就必须确定数据在物理设备上的位置。 这由映射层(Mapping Layer)来完成。
- 内核通过通用块设备层(Generic Block Layer)在块设备上执行读操作,启动I/O操作, 传输请求的数据。
- 在通用块设备层之下是I/O调度层(I/O Scheduler Layer),根据内核的调度策略, 对等待的I/O等待队列排序。
- 最后,块设备驱动(Block Device Driver)通过向磁盘控制器发送相应的命令,执行 真正的数据传输。
本文介绍图中蓝色部分Linux I/O调度层支持的策略以及比较。