1. 程式人生 > >磁碟排程-迴圈掃描(CSCAN)

磁碟排程-迴圈掃描(CSCAN)

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);
    }
}