概述
對磁盤發起I/O操作的時間主要由尋道時間和旋轉時間決定,磁盤在不同時刻訪問不同扇區的時間成本是不同的。當有多個I/O請求發出時,磁盤先服務哪個請求會極大地影響I/O性能。比如,當前磁頭在內側磁道上,有三個I/O請求分別訪問內、中、外側磁道上的扇區。顯然,這種情況下自內向外處理請求比從外向內處理請求更加高效。
為了獲得更高的I/O性能,磁盤必須對I/O請求進行調度。這些調度的主要依據是當前磁頭的位置和要訪問的扇區的位置信息。在早期的計算機系統中,磁盤調度由操作系統實現;在現代計算機系統中,磁盤調度算法被內置到磁盤中,磁盤利用內部的各種信息來完成磁盤調度。
磁盤的調度與進程的調度有相似之處,比如都追求高性能,都要考慮公平性,避免餓死的發生。但是磁盤調度與進程調度也有着明顯的不同:進程的生命期是不確定的,而I/O操作的時間卻可以被估算出來。所以我們自然地想到了SJF(shortest job first)的原則。
SSTF: Shortest Seek Time First
SSTF的思路非常簡單,每次都先服務訪問扇區所在磁道離磁頭當前位置最近的請求。
SSTF易於實現,但是卻存在明顯的缺陷:
- 公平性
SSTF總是先服務那些訪問扇區所在磁道離當前磁頭所在磁道最近的請求,很可能會出現某個I/O請求運氣特別差,總是有別的請求比它更先被服務,最終導致餓死。想象一下,某個人在隊伍最前面,但是接受服務的次序卻不是按先來后到,每次它要接受服務時,都有別人合法地插隊,明明他在最前面卻無法接受服務。
- 性能
SSTF只考慮到了尋道時間,卻忽略了旋轉時間,這種粗粒度的策略並不能實現接近最優的性能。
SPTF: Shortest Positioning Time First
SPTF從性能的角度改良了SSTF策略。每次確定要服務的I/O請求時,都計算訪問各個請求扇區的時間,並服務其中耗時最短的請求。
SPTF策略同時考慮到了尋道時間和旋轉時間,因此每次判斷服務哪個請求都是綜合判斷的結果。
對於以下磁盤,分別有兩個訪問扇區8和扇區16的I/O請求。
在SSTF策略下,扇區16所在磁道距離磁頭所在磁道最近,因此磁盤先服務訪問扇區16的請求。但是這種決策既有可能不是最佳的。假如在這個磁盤中,旋轉時間大於尋道實踐,訪問扇區8反而會是最好的選擇。SPTF策略選擇總體定位時間(尋道時間加旋轉時間)最短的
I/O請求進行服務,在這里選扇區8。
Elevator(SCAN)
電梯算法(也叫SCAN)從處理I/O請求的公平性着手進行調度。在電梯算法中,磁頭從最外側磁道到最內側磁道(反之)叫做一邊掃描。
電梯算法的原理就蘊含在它的名字中:
電梯上上下下(磁頭不斷掃描),每次是否開門(服務I/O請求),取決於是否在該層是否有人要下電梯(該磁道是否有請求訪問的扇區)。
每次掃描中,如果磁盤發現有請求訪問的扇區在磁頭所在磁道中,就訪問該扇區,否則繼續掃描。
電梯算法的基本原理相同,但卻有許多變種,比如F-SCAN,C-SCAN。
F-SCAN
在磁頭掃描的過程中,系統可能會像磁盤發起I/O請求,F-SCAN變種不處理這些新發起的請求,而將它們加入到等待隊列中,在下一次掃描時再處理這些請求。
C-SCAN
在電梯算法中,一次掃描結束就進行下一次掃描。當一次掃描結束后,最簡單的想法是從上一次掃描結束位置反方向掃描。比如,上一次從外到內,下一次就從結束位置(最內側)向外掃描。
這種策略符合直覺,但是會導致一些“不夠公平”,在中間的磁道被掃描的時間會比在兩側的磁道更長(這么說可能不太准確,總之中間的磁道會比兩側的更占優勢)。
為了解決這個問題,C-SCAN策略確定了統一的掃描方向:從一端開始掃描,並在掃描結束后回到起始位置開始新一輪的掃描。
C-SCAN策略統一掃描方向帶來了一些好處:
- 統一的等待時間
- 較小的響應時間
同時也導致了一些問題:
- 更多的尋道動作
- 即使沒有I/O請求,磁頭可能要進行尋道,除非已經待在特定的磁道。