如果簡單地以核心產生請求的次序直接將請求發向塊裝置的話,效能肯定讓人難以接受。磁碟定址是整個計算機中最慢的操作之一,每一次定址---定位硬碟磁頭到特定塊上的某個位置---需要花費不少時間。所以盡量縮短定址時間無疑是提高系統效能的關鍵。
為了優化定址操作,核心既不會簡單的按請求接收次序,也不會立即將其提交給磁碟。相反,它會在提交前,先執行名為合併和排序的預操作,這中預操作可以極大地提高系統的整體效能。在核心中負責提交i/o請求的子系統被稱為i/o排程程式。
i/o排程程式將磁碟i/o資源分配給系統中所有掛起的塊i/o請求。具體的說,這種資源分配是通過將請求佇列中掛起的請求合併和排序來完成的。注意不要 將i/o排程程式和程序排程程式混淆。程序排程程式的作用是將處理器資源分配給系統中的執行程序。這兩種系統有相似性,但並不相同。程序排程程式和i/o 排程程式都是將乙個資源虛擬給多個物件,對程序排程程式來說,處理器被虛擬並被系統中的執行程序共享。這種虛擬提供給使用者的就是多工和分時作業系統,像 unix系統。相反,i/o排程程式虛擬塊裝置給多個磁碟請求,以便降低磁碟定址時間,確保磁碟效能的最優化。
i/o排程程式的工作是管理塊裝置的請求佇列。它決定佇列中的請求排序順序以及在什麼時刻派發請求到塊裝置。這樣做有利於減少磁碟定址時間,從而提高全域性吞吐量。注意全域性這個定語很重要,坦率的將,乙個i/o排程器可能為了提高系統整體效能,而對某些請求不公。
合併:考慮一下這種情況,檔案系統提交請求到請求佇列---從檔案中讀取乙個資料區,如果這時佇列中已經存在乙個請求,它訪問的磁碟扇區和當前請求訪問的 磁碟扇區相鄰,那麼這兩個請求就可以合併為乙個對單個和多個相鄰磁碟扇區操作的新請求。通過合併請求,i/o排程程式將多次請求的開銷壓縮成一次請求的開 銷。更重要的是,請求合併後只需要傳遞給磁碟一條定址命令,就可以訪問到請求合併前必須多次定址才能訪問完的磁碟區域了,因此合併請求顯然能減少系統開銷 和磁碟定址次數。
現在,假設在讀請求被提交給請求佇列的時候,佇列中並沒有其他請求需要操作相鄰的扇區,此時就無法將當前請求與其他請求合併,當然,可以將其插入請求佇列 的尾部。但是如果有其他請求需要操作磁碟上類似的位置呢?如果存在乙個請求,它要操作的磁碟扇區位置與當前請求的比較接近,那麼是不是該讓這兩個請求在請 求佇列上也相鄰呢?事實上,i/o排程程式的確是這樣處理上述情況的,整個請求佇列將按扇區增長方向有序排列。使所有請求按硬碟上扇區的排序有序排列的目 的不僅是為了縮短單獨一次請求的定址時間,更重要的優化在於,通過保持磁碟頭以直線方向移動,縮短了所有請求的磁碟定址時間。該排序演算法類似於電梯排程 ---電梯不能隨意的從一層跳到另一層,它應該向乙個方向移動,當抵達了同一方向的最後一層後,再掉頭向另乙個方向移動。出於這種相似性,所以i/o排程 程式被稱作電梯排程。
I O排程程式
如果簡單地以核心產生請求的次序直接將請求發向塊裝置的話,效能肯定讓人難以接受。磁碟定址是整個計算機中最慢的操作之一,每一次定址 定位硬碟磁頭到特定塊上的某個位置 需要花費不少時間。所以盡量縮短定址時間無疑是提高系統效能的關鍵。為了優化定址操作,核心既不會簡單的按請求接收次序,也不會立即將其提交給磁碟...
塊I O排程程式
最近在看 linux核心設計與實現 這本書,寫些東西記錄一下學習過程。塊裝置最突出的特點是可以隨機訪問固定大小的資料片,這些固定大小的資料片稱為塊,塊裝置通過安裝檔案系統來訪問。注意塊裝置都有自己的物理最小定址單元 如扇區 但是在檔案系統下,其有著最小邏輯可定址單元 塊,不要搞混淆了。與塊裝置相對的...
磁碟I O排程
io排程器的總體目標是希望讓磁頭能夠總是往乙個方向移動 移動到底了再往反方向走 這恰恰就是現實生活中的電梯模型,所以 io排程器也被叫做電梯 elevator 而相應的演算法也就被叫做電梯演算法.而 linux中io 排程的電梯演算法有好幾種 乙個叫做 as anticipatory 乙個叫做 cf...