1. 程式人生 > >掃描算法(SCAN)——磁盤調度管理

掃描算法(SCAN)——磁盤調度管理

調度 記錄 統計 AI clas 完全 style lan +=

原創


上一篇博客寫了最短尋道優先算法(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

掃描算法(SCAN)——磁盤調度管理