
136
|
第四章
如此可以儘量減少磁頭的移動。避免盲目地移動磁頭—從這裡到那裡並且反向移動,查
找整個磁碟—應該以平順、線性的方式移動磁頭。因為查找是磁碟 I/O 中代價最高的操
作,所以效能可以獲得改善。
對讀取操作的幫助
每個讀取要求必須傳回最新的資料。因此,如果所要求的資料並未出現在頁面快取區,
讀取行程必須遭到阻擋,直到可從磁碟讀取資料為止—這可能是一個冗長的操作。我們
將這種效能衝擊(performance impact)稱為
讀取延遲
(
read latency
)。
一個典型的應用程式可能會在短期間內發起數個讀取要求。因為每個要求是單獨同步化
的,所以後面的要求是否能完成,取決於前面的要求完成與否。現在假設要讀取一個目
錄中每個檔案。應用程式會開啟第一個檔案,對它讀取一個團塊,等待資料的到來,讀
取另一個團塊…等等,直到讀完整個檔案。然後應用程式會對下一個檔案重複以上操
作。這些要求會變成序列化(serialize):除非完成當前的要求,否則無法送出隨後的
要求。
這與寫入要求形成鮮明的對比,寫入要求(預定為非同步化的狀態)不需要發起任何
磁碟 I/O 直到未來的某個時間。因此,從用戶空間應用程式的觀點來看,寫入要求
串
流
(
stream
)不會妨礙磁碟的效能。此串流的行為只會讓讀取的問題加劇:因為寫入串
流會把持著核心和磁碟的關注不放。此現象稱為
寫入餓死讀取
(
writes-starving-reads
)
問題。
如果一個 I/O 排班器
總是
以插入的順序來儲存新的要求,結果可能會餓死「針對遙遠區
塊的」要求 ...