原創
最近操作系統實習,敲了實現最短尋道優先(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