掃描算法(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("\n");
    printf("尋道序列為:    ");
    SCAN(rand()%N);    //隨機選擇起點磁道
    printf("\n移動的磁道總數: %d\n",all_track);
    printf("平均尋道總數: %0.2lf",(double)all_track/N);
    return 0;
}

(運行結果部分截圖)

19:33:25

2018-05-22


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM