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