《Linux内核设计与实现》学习笔记——I/O调度算法
2016-07-05 08:28
375 查看
I/O调度子系统用于调度来自多个进程对块设备的I/O请求。
2.如果队列中存在一个驻留时间过长的请求,那么新请求将被插入到队列尾部,以防止其他旧的请求发生饥饿。
3.如果队列中以扇区方向为序存在合适的插入位置,那么新的请求将被插入到该位置,保证队列中的请求是以被访问磁盘物理位置为序进行排序的。
4.如果队列中不存在合适的请求插入位置,请求将被插入到队列尾部。
最后期限IO调度请求类似与linux电梯,也以磁盘物理位置为次序维护请求队列,这个队列被称为排序队列。当一个新请求递交给排序队列时,最后期限IO调度程序类似于linux电梯,合并和插入请求,
最后期限I/O调度程序同时也会以请求类型为依据将它们插入到额外队列中。读请求按次序被插入到特定的读FIFO队列中,写请求被插入到特定的写FIFO队列中。
它的不同之处在于读操作提交后并不直接返回处理其他请求,而是会有意空闲片刻。这空闲的几秒钟,对应用程序来说是个提交其他读请求的好机会—–任何对相邻磁盘位置操作的请求都会立刻得到处理。(基于实际发生情况统计效果好)
CFQI/O调度程序以时间片轮转调度队列,从每个队列中选取请求数(默认是4),然后进行下一轮调度。
I/O调度程序实现在drivers/block/cfq-iosched.c中。
电梯调度
首先,如果队列中已存在一个对相邻磁盘扇区操作的请求,那么新请求将和这个已经存在的请求合并为一个请求。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 Kernel 4.0 RC5 发布!
- Mysql IO 内存方面的优化
- Node.js 的异步 IO 性能探讨
- SQL Server误区30日谈 第22天 资源调控器可以调控IO
- mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结
- java中的Io(input与output)操作总结(一)
- GO语言的IO方法实例小结
- java中的Io(input与output)操作总结(四)
- C#路径,文件,目录及IO常见操作汇总
- SQL语句实现查询当前数据库IO等待状况
- Java进阶教程之IO基础
- java中的Io(input与output)操作总结(三)
- Java 1.0和Java 1.1 的IO类的比较
- Java中的BufferedInputStream与BufferedOutputStream使用示例
- JAVA IO API使用详解
- Java NIO和IO的区别
- Java编程中最基础的文件和目录操作方法详解
- Python中使用select模块实现非阻塞的IO
- Python通过poll实现异步IO的方法
- Python通过select实现异步IO的方法