发现在自从二月就没写过博客,然后二面中问道了我IO调度,当时也就在边上闲扯淡,之后百度了一下,感觉是跪了,面试官问的是IO调度的算法,而我说的是磁盘调度算法,虽然有点相似还是不一样好吗?博客里面一部分是百度,仅仅为了整理面试的问题。IO调度算法链接
IO调度算法IO调度算法存在的意义有两个:一是提高IO吞吐量,二是降低IO响应时间。然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平衡这两者,IO调度器提供了多种调度算法来适应不同的IO请求场景。
1、NOOP
该算法实现了最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作。之所以说"大致",原因是NOOP在FIFO的基础上还做了相邻IO请求的合并,并不是完完全全按照先进先出的规则满足IO请求。
假设有如下的io请求序列:
100,500,101,10,56,1000
NOOP将会按照如下顺序满足:
100(101),500,10,56,1000
2、CFQ
CFQ算法的全写为Completely Fair Queuing。该算法的特点是按照IO请求的地址进行排序,而不是按照先来后到的顺序来进行响应。
假设有如下的io请求序列:
100,500,101,10,56,1000
CFQ将会按照如下顺序满足:
100,101,500,1000,10,56
在传统的SAS盘上,磁盘寻道花去了绝大多数的IO响应时间。CFQ的出发点是对IO地址进行排序,以尽量少的磁盘旋转次数来满足尽可能多的IO请求。在CFQ算法下,SAS盘的吞吐量大大提高了。但是相比于NOOP的缺点是,先来的IO请求并不一定能被满足,可能会出现饿死的情况。
3、DEADLINE
DEADLINE在CFQ的基础上,解决了IO请求饿死的极端情况。除了CFQ本身具有的IO排序队列之外,DEADLINE额外分别为读IO和写IO提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5s。FIFO队列内的IO请求优先级要比CFQ队列中的高,而读FIFO队列的优先级又比写FIFO队列的优先级高。优先级可以表示如下:
FIFO(Read) > FIFO(Write) > CFQ
这个算法特别适合数据库这种随机读写的场景。
4、ANTICIPATORY
CFQ和DEADLINE考虑的焦点在于满足离散IO请求上。对于连续的IO请求,比如顺序读,并没有做优化。为了满足随机IO和顺序IO混合的场景,Linux还支持ANTICIPATORY调度算法。ANTICIPATORY的在DEADLINE的基础上,为每个读IO都设置了6ms的等待时间窗口。如果在这6ms内OS收到了相邻位置的读IO请求,就可以立即满足。
1.先来先服务直接从字面的意思 可以理解不用多解释
2.最短寻道时间优先,当前磁头我距离哪一个近我就读取哪一个,但是这个会出现问题,磁头频繁移动上下肯定会降低效率的,不能保证平均的寻道时间最短,而且还可能 出现饥饿现象,我一直朝这个方向读下去。
3.扫描算法,在2的算法基础上考虑的磁头的方向问题。这个又称为电梯调度算法。
SPOOLing:为了缓冲CPU的高速性与IO设备低俗性间的矛盾而引入的脱机输入输出技术。提高IO的速度,将独占设备改造为共享设备,实现了虚拟设备