zoukankan      html  css  js  c++  java
  • 最短寻道优先算法(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("
    ");
        printf("寻道序列为:    ");
        SSTF(rand()%N);    //随机选择起点磁道
        printf("
    移动的磁道总数: %d
    ",all_track);
        printf("平均寻道总数: %0.2lf",(double)all_track/N);
        return 0;
    }

    (运行结果截图)

    17:54:20

    2018-05-22

  • 相关阅读:
    jenkins 参数化构建,获取git分支
    maven 历史版本下载
    spring mybatis 多个数据源配置
    springmvc 加载静态文件失败
    java服务覆盖率统计 jacoco ant
    testng监听ISuiteListener
    记录一下这几天遇到的坑(.netcore 代理问题)
    Js获取客户端用户Ip地址
    如何获取AWS的Access Key ID 和 Secret Access Key (Unable to find credentials)
    记录一个EF连接查询的异常:the entity or complex type 'x' cannot be constructed in a linq to entities query
  • 原文地址:https://www.cnblogs.com/chiweiming/p/9073312.html
Copyright © 2011-2022 走看看