实验要求
- 选择1~3种磁盘调度算法(先来先服务法、最短寻道时间优先、电梯算法)模拟实现磁盘调度;
- 能够输入当前磁头的位置、磁头移动方向、磁道访问请求序列等;
- 计算磁头移动的总磁道数;
- 能够显示磁盘调度结果(磁头依次访问的磁道号顺序等)
我选择了先来先服务法FCFS、最短寻道时间优先SSTF、电梯算法SCAN三种调度算法,代码用Java实现。
源码已上传到本人github上,建议先看源码。
实验原理
代码结构
HardDrive类表示磁盘,其私有成员有tracks表示访问序列数组,trackSet表示磁道访问集合,用HashSet实现Set接口,headAt表示磁头处于磁道位置,direction表示在SCAN调度算法里磁头移动的方向,distance表示磁头移动的总距离,method表示调度方法
代码思路
整体思路
用tracks数组表示访问序列,用于FCFS调度。trackSet用于遍历访问序列,获得每次离磁头最近的磁道。headAt在每次移动磁头后记录位置,distance用来保存每次headAt移动前后距离的绝对值的累加和。
构造一个HardDrive对象,并将参数tracks、headAt、direction、method参数带入,根据调度方法不同输出不同的结果。
FCFS
先来先服务调度比较简单,用数组表示顺序访问序列,遍历数组,输出下一个数组元素i,计算数组该元素i和当前headAt距离并保存到distance中,修改磁头headAt位置。遍历结束后输出distance。
private void FCFS() {
System.out.print("寻道顺序为:" + headAt + " ");
for (int i : tracks) {
System.out.print(i + " ");
this.distance += Math.abs(headAt - i);
headAt = i;
}
System.out.println();
System.out.println("总路程=" +