最短尋道優先算法(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


免責聲明!

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



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