磁碟排程-迴圈掃描(CSCAN)
阿新 • • 發佈:2018-12-12
SCAN演算法既能獲得較好的尋道效能,又能防止飢餓現象。但是存在這樣的問題:當磁頭剛從裡向外移動而超越了某一磁軌時,恰好又有一程序請求訪問此磁軌,這時該程序必須等待。將磁頭繼續從裡向外,然後再從外向裡掃描完處於外面的所有要訪問的磁軌後,才處理該程序的請求,致使該請求的請求被大大的推遲。
為此,CSCAN演算法規定磁頭單向移動,如果只是從裡向外移動,當磁頭移到最外的磁軌並訪問時,磁頭立即返回到最裡的欲訪問磁軌,即將最小磁軌號緊接著最大磁軌號迴圈,進行迴圈掃描。
輸入:起始磁軌以及要訪問的磁軌數目,要訪問的磁軌號,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 CSCAN(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 = 0; i < j; 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 = n-1; i >= j; i--) Move(num, i, s, sum); } }