扫描算法(SCAN)——磁盘调度管理

原创


上一篇博客写了最短寻道优先算法(SSTF)——磁盘调度管理:http://www.cnblogs.com/chiweiming/p/9073312.html

此篇介绍扫描算法(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("
");
    printf("寻道序列为:    ");
    SCAN(rand()%N);    //随机选择起点磁道
    printf("
移动的磁道总数: %d
",all_track);
    printf("平均寻道总数: %0.2lf",(double)all_track/N);
    return 0;
}

扫描算法(SCAN)——磁盘调度管理

(运行结果部分截图)

19:33:25

2018-05-22