当我们使用 read() 和 write() 系统调用向内核提交读写文件操作时,内核并不会立刻向硬盘发送 I/O 请求,而是先将 I/O 请求交给 I/O 调度层进行排序和合并处理。经过 I/O 调度层加工处理后,才会将 I/O 请求发送给块设备驱动进行最终的 I/O 操作。
下图是块设备 I/O 栈的架构图:
在上图中,红色那一层便是 I/O 调度层。
I/O 调度层主要完成的工作如下:
- 对新提交的 I/O 请求进行排序。
- 如果新的 I/O 请求能与旧的 I/O 请求进行合并,那么将会把两个 I/O 请求合并成一个 I/O 请求。
- 向块设备驱动层发送 I/O 请求。
什么是 I/O 调度层
现实中块设备的种类非常多,如磁盘、SSD(固态硬盘) 和 CD-ROM 等。由于不同种类的块设备其物理结构不同,所以优化 I/O 效率的算法也不一样。如:SSD 读写任意地址中的数据速度都一样,所以就没必要进行额外的优化,只需要将用户提交 I/O 操作直接发送给块设备驱动即可。
但有些块设备的物理结构比较特殊,如磁盘,其读写速度与磁头移动的距离(寻道)有关,所以磁头移动的距离越远,读写速度就越慢。
磁盘的物理结构如下图所示: