1. 程式人生 > >磁碟排程演算法剖析(FIFO、SSTF、SCAN、CSCAN、FSCAN)

磁碟排程演算法剖析(FIFO、SSTF、SCAN、CSCAN、FSCAN)

常見的磁碟排程演算法有以下幾種:

1.FIFO:先來先服務演算法;

2.SSTF: 最短尋道時間演算法;

3.SCAN:電梯排程演算法;(這樣命名很形象)

4.CSCAN: 迴圈掃描演算法

5.FSCAN:分步電梯排程演算法(分兩個佇列)

下面詳細說一下各個演算法的主要思想:

首先是FIFO演算法,也就是先來先服務演算法。這種演算法的思想比較容易理解。假設當前磁軌在某一位置,依次處理服務佇列裡的每一個磁軌,這樣做的優點是處理起來比較簡單,但缺點是磁頭移動的距離和平均移動距離會很大。

其次,是SSTF,最短尋道時間演算法。這種演算法的本質是利用貪心演算法來實現,假設當前磁軌在某一位置,接下來處理的是距離當前磁軌最近的磁軌號,處理完成之後再處理離這個磁軌號最近的磁軌號,直到所有的磁軌號都服務完了程式結束。這樣做的優點是效能會優於FIFO演算法,但是會產生距離當前磁軌較遠的磁軌號長期得不到服務,也就是“飢餓”現象,因為要求訪問的服務的序列號是動態產生的,即各個應用程式可能不斷地提出訪問不同的磁軌號的請求。

接下來,是SCAN演算法,也就是很形象的電梯排程演算法。先按照一個方向(比如從外向內掃描),掃描的過程中依次訪問要求服務的序列。當掃描到最裡層的一個服務序列時反向掃描,這裡要注意,假設最裡層為0號磁軌,最裡面的一個要求服務的序列是5號,訪問完5號之後,就反向了,不需要再往裡掃。結合電梯過程更好理解,在電梯往下接人的時候,明知道最下面一層是沒有人的,它是不會再往下走的。

然後是,CSCAN演算法,迴圈掃描演算法,來看一下上一種演算法,有什麼問題。仔細一看,我們會發現,在掃描到最裡面的要求服務的序列時,接著會反向,在接下來的很大一部分時間裡,應該是沒有要求服務的磁軌號的,因為之前已經訪問過了。什麼意思,就是說從初始磁軌號到最裡層的一個磁軌號之間的所有序列都已經訪問過了,所以SCAN會增加等待的時間。為了解決這樣的情況,CSCAN演算法的思想是,訪問完最裡面一個要求服務的序列之後,立即回到最外層欲訪問磁軌。也就是始終保持一個方向。故也稱之為單向掃描排程演算法。從最裡面的一個磁軌立即回到最外層欲訪問的磁軌,這步的距離是兩者磁軌號差的絕對值。

最後,是FSCAN演算法,也就是分步電梯排程演算法。演算法思想是,在掃描的過程中所有新產生的序列放在另外的一個佇列中,當訪問完當前佇列之後,再訪問新產生的一個佇列。這種演算法可以有效防止磁壁粘著現象。

下面結合一個例子來看一下,服務的順序和計算磁頭移動的總距離。

假設當前磁頭在67號,要求訪問的磁軌號順序為98,25,63,97,56,51,55,55,6  (電腦隨機產生的,設定最外層磁軌號為100號)

FIFO演算法的服務序列是:98,25,63,97,56,51,55,55,6

磁頭移動的總距離distance = (98-67)+(98-25)+(63-25)+(97-63)+(97-56)+(56-51)+(55-51)+(55-55)+(55-6)

SSTF演算法的服務序列是: 63,56,55,55,51,25,6,97,98

磁頭移動的總距離distance = (67-63)+(63-56)+(56-55)+(55-55)+(55-51)+(51-25)+(25-6)+(97-6)+(98-97)

SCAN演算法的服務序列是:63,56,55,55,51,25,6,97,98

磁頭移動的總距離distance = (67-63)+(63-56)+(56-55)+(55-55)+(55-51)+(51-25)+(25-6)+(97-6)+(98-97)

我發現這裡例子舉的不好,SSTF和SCAN演算法的服務序列竟是一樣的,尷尬!

CSCAN演算法的服務序列是:63,56,55,55,51,25,6,98,97

磁頭移動的總距離distance = (67-63)+(63-56)+(56-55)+(55-55)+(55-51)+(51-25)+(25-6)+(100-98)+(98-97)

上式中,當掃描到磁軌6時,直接從6號磁軌移動到98號磁軌,所以需要計算從6號移動到98號的距離,所以作更正:

distance = (67-63)+(63-56)+(56-55)+(55-55)+(55-51)+(51-25)+(25-6)+|6-98|+(98-97),感謝woshiqinyikun,qq_35819971提出意見