磁碟排程 迴圈掃瞄(CSCAN)

2021-08-28 14:57:04 字數 1464 閱讀 7394

scan演算法既能獲得較好的尋道效能,又能防止飢餓現象。但是存在這樣的問題:當磁頭剛從裡向外移動而超越了某一磁軌時,恰好又有一程序請求訪問此磁軌,這時該程序必須等待。將磁頭繼續從裡向外,然後再從外向裡掃瞄完處於外面的所有要訪問的磁軌後,才處理該程序的請求,致使該請求的請求被大大的推遲。

為此,cscan演算法規定磁頭單向移動,如果只是從裡向外移動,當磁頭移到最外的磁軌並訪問時,磁頭立即返回到最裡的欲訪問磁軌,即將最小磁軌號緊接著最大磁軌號迴圈,進行迴圈掃瞄。

輸入:起始磁軌以及要訪問的磁軌數目,要訪問的磁軌號,isadd。

輸出:被訪問的下乙個磁軌號和移動距離, 最後是平均尋道長度。

執行結果:

資料結構:

//num為程序請求訪問的磁軌號

int num[maxn];

輔助函式:

//將當前磁頭所在的位置s移動到磁軌num[i]上

//更新sum,s的值。

void move(int *num, int i, int &s, double &sum)

源**:

#include #include #include using namespace std;

const int maxn = 100 + 5; //要求訪問的程序最大數目。

//磁碟排程演算法

//將當前磁頭所在的位置s移動到磁軌num[i]上

//更新sum,s的值。

void move(int *num, int i, int &s, double &sum)

/*迴圈掃瞄。

磁頭單向移動,例如從裡向外移動,當磁頭移到最外的磁軌並訪問時,磁頭立即返回

到最裡的欲訪問磁軌,將最小磁軌號緊接著最大磁軌號迴圈,進行迴圈掃瞄

*/void cscan(int *num, int n, int s, double &sum, int isadd)

else

}int main()

return 0;}/*

100 9

55 58 39 18 90 160 150 38 184

153 8

98 183 37 122 14 124 65 67

300 9

55 58 39 18 90 160 150 38 184

184 9

55 58 39 18 90 160 150 38 184

150 9

55 58 39 18 90 160 150 38 184

0 955 58 39 18 90 160 150 38 184

18 9

55 58 39 18 90 160 150 38 184

*/

基於掃瞄的磁碟排程演算法

當磁頭正在由里向外移動時,scan演算法所考慮的下乙個訪問物件應該是其欲訪問的磁軌既在當前磁軌之外,又是距離最近的。直到再無更外的磁軌需要訪問時,才將磁臂更換為自外向裡運動。掃瞄演算法存在這樣的問題 當磁頭剛從裡向外移動而越過了某條磁軌時,恰好又有一程序請求訪問此磁軌,這時,該程序必須等待,等待磁頭...

磁碟排程演算法

磁碟排程在多道程式設計的計算機系統中,各個程序可能會不斷提出不同的對磁碟進行讀 寫操作的請求。由於有時候這些程序的傳送請求的速度比磁碟響應的還要快,因此我們有必要為每個磁碟裝置建立乙個等待佇列,常用的磁碟排程演算法有以下四種 先來先服務演算法 fcfs 最短尋道時間優先演算法 sstf 掃瞄演算法 ...

磁碟排程演算法

一次磁碟讀寫操作的時間由尋找 尋道 時間 延遲時間和傳輸時間決定 1 尋找時間ts 活動頭磁碟在讀寫資訊前,將磁頭移動到指定磁軌所需要的時間。這個時間除跨越n條磁軌的時間外,還包括啟動磁臂的時間s,即 ts m n s。式中,m是與磁碟驅動器速度有關的常數,約為0.2ms,磁臂的啟動時間約為2ms。...