《Linux内核设计与实现》学习笔记——I/O调度算法
Posted xcy6666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Linux内核设计与实现》学习笔记——I/O调度算法相关的知识,希望对你有一定的参考价值。
I/O调度子系统用于调度来自多个进程对块设备的I/O请求。
电梯调度
- 首先,如果队列中已存在一个对相邻磁盘扇区操作的请求,那么新请求将和这个已经存在的请求合并为一个请求。
2.如果队列中存在一个驻留时间过长的请求,那么新请求将被插入到队列尾部,以防止其他旧的请求发生饥饿。
3.如果队列中以扇区方向为序存在合适的插入位置,那么新的请求将被插入到该位置,保证队列中的请求是以被访问磁盘物理位置为序进行排序的。
4.如果队列中不存在合适的请求插入位置,请求将被插入到队列尾部。
最后期限IO调度
在最后期限I/O调度程序中,每个请求都有一个超时时间。默认情况下,读请求的超时时间是500ms,写请求的超时时间是5s。
最后期限IO调度请求类似与linux电梯,也以磁盘物理位置为次序维护请求队列,这个队列被称为排序队列。当一个新请求递交给排序队列时,最后期限IO调度程序类似于linux电梯,合并和插入请求,
最后期限I/O调度程序同时也会以请求类型为依据将它们插入到额外队列中。读请求按次序被插入到特定的读FIFO队列中,写请求被插入到特定的写FIFO队列中。
预测IO调度程序
基础就是最后期限IO调度程序。最主要的改进是它增加了预测启发能力。
它的不同之处在于读操作提交后并不直接返回处理其他请求,而是会有意空闲片刻。这空闲的几秒钟,对应用程序来说是个提交其他读请求的好机会—–任何对相邻磁盘位置操作的请求都会立刻得到处理。(基于实际发生情况统计效果好)
完全公正的排队I/O调度程序
完全公正的排队I/O调度程序(Complete Fair Queuing,简称CFQ)是为了专有工作负荷设计的。CFQI/O调度程序把进入的I/O请求放入特定的队列中,这种队列是根据引起I/O请求的进程组织的。在每个队列中,刚进入的请求与相邻的请求合并在一起,并进行插入分类,队列由此按扇区方式能分类。CFQI/O调度程序的差异在于每一个提交I /O请求的进程都有自己的队列。
CFQI/O调度程序以时间片轮转调度队列,从每个队列中选取请求数(默认是4),然后进行下一轮调度。
I/O调度程序实现在drivers/block/cfq-iosched.c中。
以上是关于《Linux内核设计与实现》学习笔记——I/O调度算法的主要内容,如果未能解决你的问题,请参考以下文章