实验七 磁盘调度算法的模拟与实现
1
、实验目的
(1)
了解磁盘结构以及磁盘上数据的组织方式。
(2)
掌握磁盘访问时间的计算方式。
(3)
掌握常用磁盘调度算法及其相关特性。
2
、实验基本知识及原理
(
1
)磁盘数据的组织
磁盘上每一条物理记录都有唯一的地址,该地址包括三个部分:磁头号(盘面号)、柱面号(磁
道号)和扇区号。给定这三个量就可以唯一地确定一个地址。
(
2
)磁盘访问时间的计算方式
磁盘在工作时以恒定的速率旋转。为保证读或写,磁头必须移动到所要求的磁道上,当所要求
的扇区的开始位置旋转到磁头下时,开始读或写数据。对磁盘的访问时间包括:寻道时间、旋转延
迟时间和传输时间。
(
3
)磁盘调度算法
磁盘调度的目的是要尽可能降低磁盘的寻道时间,以提高磁盘
I/O
系统的性能。
先进先出算法
FIFO
:按访问请求到达的先后次序进行调度。
最短服务时间优先算法
SSTF
:优先选择使磁头臂从当前位置开始移动最少的磁盘
I/O
请求进
行调度。
SCAN
(电梯算法):
要求磁头臂先沿一个方向移动,并在途中满足所有未完成的请求,直到它
到达这个方向上的最后一个磁道,或者在这个方向上没有别的请求为止,后一种改进有时候称作
LOOK
策略。然后倒转服务方向,沿相反方向扫描,同样按顺序完成所有请求。
C-SCAN
(循环扫描)算法:
在磁盘调度时,把扫描限定在一个方向,当沿某个方向访问到最
后一个磁道时,磁头臂返回到磁盘的另一端,并再次开始扫描。
3
、实验内容
本实验通过编程模拟实现几种常见的磁盘调度算法。
(
1
)测试数据:参见教材
P305
,测试结果参见表
11.2
。
(
2
)使用
C
语言编程实现
FIFO
、
SSTF
、
SCAN
、
C-SCAN
算法。
4
、 实验结果与分析
5
、 实验总结
流程图:
代码:
#include
#include
#include
#include
#define max 200
int num; //磁盘数
//55 58 39 18 90 160 150 38 184
int request[100]; //请求磁盘序列
int begin; //开始磁盘位置
int kua; //横跨的总数
int k; //每次横跨的磁盘数
int re[100]; //复制初始序列
int r[100]; //记录每个算法执行后序列
void FIFO(){ //先进先出
kua=abs(begin-request[0]);
printf("n先进先出算法:n FIFO调度: %3d",begin);
for(int i=0;ire[j+1]){
re[j]=re[j]+re[j+1];
re[j+1]=re[j]-re[j+1];
re[j]=re[j]-re[j+1];
}
}
}
for(int i=0;ib){
printf(" %3d",re[i]);
r[c++]=re[i];
}
for(int i=num-1;i>=0;i--)
if(re[i]b){
printf(" %3d",re[i]);
r[c++]=re[i];
}
for(int i=0;i
实验结果: