磁碟排程-掃描(SCAN)
阿新 • • 發佈:2018-12-12
SSTF演算法的實質是基於優先順序的排程演算法,因此就可能導致優先順序低的程序發生繼而現象。因為只要不斷有新程序的請求到達,且要訪問的磁軌與磁頭當前磁軌的距離較近,這種新程序的IO請求必然優先滿足。
掃描演算法不僅考慮到欲訪問的磁軌與當前磁軌間的距離,更優先考慮磁頭當前的移動方向。例如向外移動時,所考慮的下一個訪問物件是其欲訪問的磁軌既在當前磁軌之外,又是距離最近的。從裡向外訪問,直至再無更外的磁軌需要訪問時,才將磁臂為從外向裡移動。
設定一個值isadd, isadd為1,首先向磁軌號增加的方向訪問。否則向減小方向訪問。
輸入:起始磁軌以及要訪問的磁軌數目,要訪問的磁軌號,isadd。
輸出:被訪問的下一個磁軌號和移動距離, 最後是平均尋道長度。
執行結果:
資料結構:
//num為程序請求訪問的磁軌號
int num[maxn];
輔助函式:
//將當前磁頭所在的位置s移動到磁軌num[i]上
//更新sum,s的值。
void Move(int *num, int i, int &s, double &sum)
{
printf("%d %d\n", num[i], abs(s-num[i]));
sum += abs(s-num[i]);
s = num[i];
}
實現過程:
void SCAN(int *num, int n, int s, double &sum, int isadd) { int i, j; sort(num, num+n); j = lower_bound(num, num+n, s) - num; if(isadd) { for(i = j; i < n; i++) Move(num, i, s, sum); for(i = j-1; i >= 0; i--) Move(num, i, s, sum); } else { if(num[j] == s) //如果恰好為要求訪問的磁軌號,則先訪問它。 j++; for(i = j-1; i >= 0; i--) Move(num, i, s, sum); for(i = j; i < n; i++) Move(num, i, s, sum); } }