扫描算法(SCAN)——磁盘调度管理
程序员文章站
2022-07-04 23:21:08
原创 上一篇博客写了最短寻道优先算法(SSTF)——磁盘调度管理:http://www.cnblogs.com/chiweiming/p/9073312.html 此篇介绍扫描算法(SCAN)——磁盘调度管理,与上一篇的代码有类似的片段,但较最短寻道优先算法难。 (题目阐述看上一篇博客) 随机选择一 ......
原创
上一篇博客写了最短寻道优先算法(SSTF)——磁盘调度管理:
此篇介绍扫描算法(SCAN)——磁盘调度管理,与上一篇的代码有类似的片段,但较最短寻道优先算法难。
(题目阐述看上一篇博客)
随机选择一磁道号为起点开始寻道后,先从磁道序列中筛选出比起点磁道号大的磁道号,再在这批磁道号中筛选出
最小的磁道号,访问它,再以它为起点继续上述操作(自里向外的访问磁道),直到访问完最大的磁道号。
再在未访问过的磁道号中筛选出最大的磁道号访问,再以它为起点,从剩下未被访问过的磁道号中筛选出最大的磁
道号访问,再以它为起点继续上述操作(自外向里的访问磁道),直到访问完全部磁道。
#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; //平均寻道总数 int ff=0; //ff==0代表自里向外扫描,==1代表自外向里扫描 void SCAN(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]); } } if(ff==0){ //自里向外移动 int min=999; int x=-1; for(i=0;i<=N-1;i++){ if(num_track[i]!=-1){ if(track[i]>=track[order]){ if(num_track[i]<min){ //从比track[order]大的磁道号中选出最小的 min=num_track[i]; x=i; } } } } if(x==-1){ //x==-1代表找不出大于等于track[order]的数,下次应该自外向里扫描 ff=1; int max=-999; int x; for(i=0;i<=N-1;i++){ //自外向里移动,找到第一个未被访问过的磁盘后以它为起点自外向里扫描 if(num_track[i]!=-1){ if(track[i]>max){ max=track[i]; x=i; } } } all_track+=abs(track[order]-track[x]); SCAN(x); } else{ all_track+=abs(track[order]-track[x]); SCAN(x); } } else{ //自外向里移动 int min=999; int x; for(i=0;i<=N-1;i++){ if(num_track[i]!=-1){ if(track[i]<=track[order]){ if(num_track[i]<min){ min=num_track[i]; x=i; } } } } all_track+=abs(track[order]-track[x]); SCAN(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("\n"); printf("寻道序列为: "); SCAN(rand()%N); //随机选择起点磁道 printf("\n移动的磁道总数: %d\n",all_track); printf("平均寻道总数: %0.2lf",(double)all_track/N); return 0; }
(运行结果部分截图)
19:33:25
2018-05-22