1. 程式人生 > >磁碟排程-掃描(SCAN)

磁碟排程-掃描(SCAN)

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