最短寻道优先算法(SSTF)——磁盘调度管理

原创


最近操作系统实习,敲了实现最短寻道优先(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("\n");
    printf("寻道序列为:    ");
    SSTF(rand()%N);    //随机选择起点磁道
    printf("\n移动的磁道总数: %d\n",all_track);
    printf("平均寻道总数: %0.2lf",(double)all_track/N);
    return 0;
}

(运行结果截图)

17:54:20

2018-05-22

posted @ 2018-05-22 17:55  一转身已万水千山  阅读(17957)  评论(0编辑  收藏  举报