磁盘调度算法
本文内容
用c++写了一个简单的控制台程序用来演示几种调度算法的磁头移动过程, 包括:
- 先来先服务法(First-Come, First-Served,FCFS)。
- 最短寻道时间优先法(Shortest Seek Time First, SSTF)。
- 电梯法。
知识点
先来先服务算法(FCFS )First Come First Service
特点:一种简单的磁盘调度算法。根据进程请求访问磁盘的先后次序进行调度。
优点:公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
缺点:由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,将降低设备服务的吞吐量,致使平均寻道时间可能较长。
最短寻道时间优先算法(SSTF ) Shortest Seek Time First
特点: 先访问当前磁头所在的磁道距离最近的盘块,以使每次的寻道时间最短。
**优点:**可以得到比较好的吞吐量。
**缺点:**不能保证平均寻道时间最短,且对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。
电梯调度
特点:优先考虑磁头的当前移动方向。
有点:可避免了饥饿现象的出现,基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点。
缺点:由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。
程序运行效果
FCFS:
SSTF:
电梯算法:
代码
#pragma once
#include<string.h>
#include<iostream>
#include<string>
#include<vector>
#include<set>
using namespace std;
#define LAB(a,b) (a>b?a-b:b-a)
#define MIN(a, b) (a<b?b:a)
typedef int uint;
typedef vector<uint> intVec;
void printChar(uint n, char c = ' '){
for (uint i = 0; i < n; i++) printf("%c", c);
return;
}
//printf the movement of the disk and return distant need to move
uint printTrack(uint nowAt, uint target){
uint distant = 0;
if (nowAt == target) {
//dont't need to move
printChar(nowAt);
printf("\n");
printChar(target);
printf("| %d", target);
printf("\n");
}
if (nowAt > target){
//move to left
distant = LAB(nowAt, target);
printChar(nowAt > distant ? nowAt - distant : 0);
printChar(distant, '-')<