原创
最近操作系统实习,敲了实现最短寻道优先(SSTF)——磁盘调度管理的代码。
题目阐述如下:
设计五:磁盘调度管理
设计目的:
加深对请求磁盘调度管理实现原理的理解,掌握磁盘调度算法。
设计内容:
通过编程实现不同磁盘调度算法。
设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。
选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。
常用的磁盘调度算法简介如下,请在以下算法中任意选择两种实现,并对算法性能进行分析对比。
1. 最短寻道优先算法SSTF:该算法选择这样的进程:其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。
2. 扫描算法SCAN:该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。
例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。
3.循环扫描算法CSCAN:CSCAN算法规定磁头单向移动,例如,只是自里向外移动,当磁头移到最外的磁道并访问后,
磁头立即返回到最里的欲访问的磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。
首先用 rand 函数随机产生磁道号序列,随机选择一磁道号为起点开始寻道。
下一磁道满足在所有磁道中其离当前被访问磁道最近,可用一数组 num_track 存放其他磁道与当前被访问磁道的距离。
在数组 num_track 筛选出数值最小(即离当前被访问磁道最近)的磁道,再以当前磁道为起点,继续计算其他未被访
问磁道与其的距离,再从 num_track 中筛选出数值最小的的磁道来访问......
#include#include#include#include
#define MAX 50 //可访问的最大磁道号
#define N 20 //磁道号数目
int track[N]; //存放随机产生的要进行寻道访问的磁道号序列
int num_track[N]; //记录其他磁道与当前被访问磁道的距离
int total=0; //统计已被访问的磁道号数
int all_track=0; //移动的磁道总数
double aver_track; //平均寻道总数
void SSTF(int order){ //order为track中当前被访问的磁道下标
printf("%d",track[order]);
num_track[order]=-1;
total++; //已被访问磁道号+1
if(total==N){return;
}int i=0;for(i=0;i<=N-1;i++){ //计算其他磁道与当前被访问磁道的距离
if(num_track[i]!=-1){
num_track[i]=abs(track[order]-track[i]);
}
}int min=9999;intx;for(i=0;i<=N-1;i++){ //找出track中与当前被访问磁道距离最短的
if(num_track[i]!=-1){if(num_track[i]
min=num_track[i];
x=i;
}
}
}
all_track+=abs(track[order]-track[x]); //计算当前被访问磁道与下一被访问磁道的距离
SSTF(x);
}intmain(){int i=0;
srand(time(0));
printf("磁道号序列为:");for(i=0;i<=N-1;i++){ //随机产生要进行寻道访问的磁道号序列
track[i]=rand()%(MAX+1);
printf("%d",track[i]);
}
printf("n");
printf("寻道序列为:");
SSTF(rand()%N); //随机选择起点磁道
printf("n移动的磁道总数: %dn",all_track);
printf("平均寻道总数: %0.2lf",(double)all_track/N);return 0;
}
(运行结果截图)
17:54:20
2018-05-22
内容来源于网络如有侵权请私信删除