字符設備:按照字符流的方式被有序訪問的設備。如串口、鍵盤等。數據結構
塊設備:系統中不能隨機(不須要按順序)訪問固定大小的數據片(chunk 塊)的設備。異步
如:硬盤、軟盤、CD-ROM驅動器、閃存等。都是經過以安裝文件系統的方式使用。性能
塊設備的組成:spa
扇區:是塊設備中最小的可尋址單元(常見大小512字節);是塊設備的基本尋址和操做單元。3d
塊:是文件系統最小邏輯可尋址單元,文件系統的抽象,只能經過塊訪問文件系統。一般包含多個扇區。blog
當一個塊被調入內存時(讀入後或等待寫出時),它要存儲在一個緩衝區中;每一個緩衝區與一個塊對應,排序
緩衝區至關因而磁盤塊在內存中的表示;塊大小不超過一個頁面,一個頁能夠容納一個或多個內存中的塊。隊列
緩衝區:是內核操做塊設備的邏輯單元,每一個緩衝區須要一個描述符來表示塊的控相關制信息。進程
數據結構:緩衝區頭 buffer_head,內核操做I/O塊基本容器是:bio。操做內核中全部的緩衝區對應的I/O塊。內存
請求隊列:塊設備將他們掛起的塊I/O請求保存在請求隊列中。
簡單的之內核產生I/O請求的次序直接將請求發向塊設備,形成性能將難以接受。由於磁盤尋址是整個計算機中
最慢的操做之一,每一次尋址定位硬盤磁頭到特定塊上某個位置須要花費很多時間;要提升I/O操做性能,儘可能縮短磁盤尋址時間。
在提交請求到塊設備前,內核須要對請求進行處理:先執行合併與排序的預操做——I/O調度機制子系統,負責I/O請求的提交。
I/O調度程序管理塊設備的請求隊列,決定隊列中的請求排列順序,什麼時候派發請求到設備。以減小磁盤尋址時間,提升全局吞吐量。
其實現的方法是合併與排序:
合併:將兩個或多個請求結合成一個新的請求,好比訪問磁盤扇區相鄰時,合併爲一個對單個和多個相鄰磁盤扇區操做的新請求。
合併後僅須要一次請求一條尋址命令。
排序:沒有相鄰操做扇區請求時,但多是比較接近的;將整個請求隊列按扇區增加方向有序排列,操做時保持磁頭以直線一個
方向移動,縮短請求磁盤尋址時間。
1 Linus Elevator
當一個請求加入到隊列時:
若是隊列已存在一個對相鄰磁盤扇區操做的請求,將新請求和這個已存在的請求合併成一個請求。
若是隊列中存在一個駐留時間過長的請求,將新請求插入到隊列尾部,防止請求發生飢餓。
若是隊列中以扇區方向爲序存在合適插入位置,將新請求插入到該位置,與被訪問磁盤物理位置爲序排列。
若是隊列不存在合適位置插入,將請求插入到隊列尾部。
2 最終期限I/O調度程序
Linus Elevator調度程序存在使請求發生飢餓的狀況:
l 對某個磁盤區域繁重操做,使得磁盤其餘位置上的操做請求得不到運行;
l 同一位置順序上的請求流能夠形成較遠位置請求得不到運行;
l 寫操做和提交應用程序是異步執行,讀操做和提交應用程序是同步執行會阻塞,讀操做響應時間影響性能。
要在提升全局吞吐量和使請求獲得公平處理之間進行平衡。
最終期限I/O調度程序中:每一個請求都有一個超時時間,讀請求默認500毫秒,寫請求5秒。
提交請求時:
一個請求遞交給排序隊列,按照合併和排序插入隊列;
將讀請求按次序插入到讀FIFO隊列中;
將寫請求按次序插入到寫FIFO隊列中;
派發請求時:
一般從排序隊列中取隊首請求加入到派發隊列中;
若是寫FIFO隊列首或讀FIFO隊列首請求超時,調度程序從FIFO隊列中提取隊首請求加入到派發隊列中。
以下圖所示:
此方式能儘可能保證:
請求超時前獲得執行,防止請求發生飢餓;
讀請求超時時間比寫請求短不少,保證寫請求不會由於堵塞讀請求而使讀請求發生飢餓。
3 預測I/O調度程序
最終期限調度程序下降請求發生飢餓的機率,同時下降了系統吞吐量。預測I/O調度程序的目標就是在保持
良好讀響應同時提供良好的全局吞吐量。
預測I/O調度程序與最終期限調度程序不一樣之處:請求提交後並不直接放回處理其餘請求,而是會空閒片刻(6毫秒),
使應用程序有提交其餘請求的機會——任何對相鄰磁盤位置的操做請求都會馬上獲得處理,等待結束後,預測I/O調度程序
從新返回原來的位置,繼續執行之前的剩下請求。
預測I/O調度程序所能帶來的優點取決於可否正確預測應用程序和文件系統的行爲,須要啓發和統計工做,預測準確可以
減小尋址開銷,提升系統響應,提升吞吐量。
還有其餘調度程序:徹底公正的排隊I/O調度程序(每一個進程獨立I/O請求隊列)和空操做I/O調度程序(相鄰合併)
要在提升全局吞吐量和使請求獲得公平處理之間進行平衡。
系統調度程序再啓動時能夠進行配置。