zoukankan      html  css  js  c++  java
  • 扫描算法(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;
    }

    (运行结果部分截图)

    19:33:25

    2018-05-22

  • 相关阅读:
    hdu 5444 Elven Postman 二叉树
    tensorflow2.x模型保存问题
    【NVIDIA】Win10 + CUDA10 + cuDNN 安装教程(转载)和遇到的坑
    windows下 为不同虚拟环境配置不同的cuda
    多线程
    socket编程
    引用类型和值类型
    记录报错
    github下载慢问题
    LabelImg的安装出现No module named 'libs.resources'错误
  • 原文地址:https://www.cnblogs.com/chiweiming/p/9073679.html
Copyright © 2011-2022 走看看