欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-09 14:47:07
原创 上一篇博客写了最短寻道优先算法(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;
}

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

(运行结果部分截图)

19:33:25

2018-05-22