磁盘调度在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设备建立一个等待队列,常用的磁盘调度算法有以下四种:
(https://baike.baidu.com/item/磁盘调度算法/3505728?fr=aladdin)
1. 先来先服务算法(FCFS)
根据进程请求访问磁盘的先后顺序进行调度,这是一种最简单的调度算法。
该算法的优点是具有公平性。
- 如果只有少量进程需要访问,且大部分请求都是访问簇聚的文件扇区,则有望达到较好的性能;
- 但如果有大量进程竞争使用磁盘,那么这种算法在性能上往往接近于随机调度。
所以,实际磁盘调度中考虑一些更为复杂的调度算法。
1.1举例
假设磁盘访问序列:98,183,37,122,14,124,65,67。
读写头起始位置:53。
求:磁头服务序列和磁头移动总距离(道数)。
服务序列:即为请求序列98,183,37,122,14,124,65,67
磁头移动总距离:45+85+146+85+108+110+59+2=640
2. 最短寻道时间优先算法(SSTF)
SSTF算法选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻找时间最短。
当然,总是选择最小寻找时间并不能保证平均寻找时间最小,但是能提供比FCFS算法更好的性能。这种算法会产生“饥饿”现象。
2.1 举例
假设磁盘访问序列:98,183,37,122,14,124,65,67。
读写头起始位置:53。
求:磁头服务序列和磁头移动总距离(道数)。
服务序列:65,67,37,14,98,122,124,183
磁头移动总距离:12+2+30+23+84+24+2+59=236
3. 扫描算法(SCAN)(电梯算法)
SCAN算法在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象。由于磁头移动规律与电梯运行相似,故又称为电梯调度算法。
SCAN算法对最近扫描过的区域不公平,因此,它在访问局部性方面不如FCFS算法和SSTF算法好。
假设磁头朝 0 移动并且磁头初始位置还是 53,磁头接下来处理 37,然后 14。在柱面 0 时,磁头会反转,移向磁盘的另一端,并处理柱面 65、67、98、122、124、183(图 3)上的请求。如果请求刚好在磁头前方加入队列,则它几乎马上就会得到服务;如果请求刚好在磁头后方加入队列,则它必须等待,直到磁头移到磁盘的另一端,反转方向,并返回。
服务顺序:37,14,65,67,98,122,124,183
磁头移动总距离:45+23+14+65+2+31+24+2+59=265
4. 循环扫描算法(CSCAN)
在扫描算法的基础上规定磁头单向移动来提供服务,回返时直接快速移动至起始端而不服务任何请求。
由于SCAN算法偏向于处理那些接近最里或最外的磁道的访问请求,所以使用改进型的C-SCAN算法来避免这个问题。
釆用SCAN算法和C-SCAN算法时磁头总是严格地遵循从盘面的一端到另一端,显然,在实际使用时还可以改进,即磁头移动只需要到达最远端的一个请求即可返回,不需要到达磁盘端点。这种形式的SCAN算法和C-SCAN算法称为LOOK和C-LOOK调度。这是因为它们在朝一个给定方向移动前会查看是否有请求。注意,若无特别说明,也可以默认SCAN算法和C-SCAN算法为LOOK和C-LOOK调度。
服务顺序:65,67,98,122,124,183,199,0,14,23
磁头移动总距离:12+2+31+24+2+59+16+199+14+23=382
5. 比较
优点 | 缺点 | 适用 | |
---|---|---|---|
先来先服务 | 公平、简单 | 平均寻道距离大,效率不高 | 仅应用在磁盘I/O较少的场合 |
最短寻道时间优先 | 性能比“先来先服务”好 | 能保证平均寻道时间最短,可能出现“饥饿”现象 | |
扫描算法 | 寻道性能较好,可避免“饥饿”现象;既考虑了距离,同时又考虑了方向。 | 不利于远离磁头一端的访问请求 | |
循环扫描算法 | 消除了对两端磁道请求的不公平, |