IO緩衝:在輸入請求發出之前就開始執行輸入傳送,並且在輸出請求發出一段時間之後才開始執行輸出傳送,這項技術成為緩衝;

執行IO的裝置物件是:

1、塊裝置,可以隨機訪問,例如硬碟、快閃記憶體等;

2、流裝置,必須順序訪問,例如串列埠和鍵盤;

塊裝置中最小的可定址單位是扇區,一般為2的整數倍,最常見的是512。一般的扇區指裝置最小定址單元,塊指檔案系統最小定址單元。下圖是二者的關係,塊包含一個或多個扇區,但大小不能超過一個頁面,所以一個頁可以容納一個或多個記憶體中的塊。

緩衝區頭:

每一個緩衝區都有一個描述符(struct buffer_head),包含了核心操作需要的所有資訊,它的作用是描述磁碟塊和實體記憶體間的對映關係。但在linux 2.6版本以後,多數IO操作都利用頁快取記憶體和頁回寫直接操作頁面或地址空間,不再使用緩衝區頭了。此後linux引入bio結構體代表IO操作,核心通過這兩種結構體,保證每種結構所含的資訊量儘量少。

頁快取記憶體:它指的是吧磁碟的資料快取到實體記憶體中,把磁碟的訪問變為對實體記憶體的訪問。linux的寫快取策略是回寫,寫資料是寫入記憶體,同時標記頁面為“髒”,加入“髒列表”,然後由回寫程序寫會磁碟,最後清理髒標識。

flush執行緒會在空閒記憶體低於一個閾值、或髒頁駐留時間過長,或使用者主動呼叫sync(), fsync()時,將髒頁回寫。flush執行緒為多執行緒,一般於裝置對應。

執行IO的三種技術

  1. 可程式設計IO:處理器代表一個程序給IO模組傳送IO命令,該程序進入忙等待,直到操作完成才可以繼續執行;
  2. 中斷驅動IO:處理器代表程序給IO模組傳送IO命令,有兩種可能性:如果來自程序IO指令是非阻塞的,那麼處理器繼續執行發出後續指令,如果IO指令是阻塞的,那麼處理器執行得下一條指令則來自作業系統,她將當前的程序設定為阻塞狀態並且排程其他程序;
  3. 直接儲存器訪問(DMA):一個DMA模組控制記憶體和IO模組之間的資料交換,為傳送一塊資料,處理器給DMA模組傳送請求,並且只有當整個數塊傳送借宿後,它才被中斷;
IO排程:
為了優化定址操作,核心會將請求合併排序,用以提高整體效能;排程策略有最終期限、預測、完全公正、空操作四種策略,最終降低了讀響應時間,也降低了吞吐量。預計策略為linux預設IO策略,除超大工作符合的服務(例如資料探勘)效果不錯;完全公平策略適用於多媒體環境;空操作適用於完全塊裝置,例如快閃記憶體卡;

DMA:


DMA技術工作流程如下,當處理器想讀或者寫一塊資料時,它通過DMA模組傳送一下訊息來給DMA模組發出一條命令:

  1. 是否請求讀操作或寫操作,通過在處理器和DMA模組之間使用讀寫控制線傳送;
  2. 相關的IO裝置地址,通過資料線傳送;
  3. 從儲存器中讀或者往儲存器中寫的起始地址,在資料線上傳送,並有DMA模組儲存在其地址暫存器中;
  4. 讀或寫的字數,也是通過資料線傳送,並有DMA模組儲存在其資料計數暫存器中;
  5. 備註:DMA和IO模組之間的資料互動是脫離系統匯流排完成的;

系統匯流排:系統總線上傳送的資訊包括資料資訊、地址資訊、控制資訊,因此,系統匯流排包含有三種不同功能的匯流排,即資料匯流排DB(Data Bus)、地址匯流排AB(Address Bus)和控制匯流排CB(Control Bus)

磁碟排程:

尋道時間(seek time): 磁頭定位到磁軌所需要的時間;

旋轉延遲(rotational delay):磁頭到達扇區開始位置的時間;

存取時間:尋道時間+旋轉延遲;

目前正常機器的尋道時間小於10ms(其實也很慢啦)

磁碟排程演算法:



  • SSTF:選擇使磁頭臂從當前位置開始移動最少的磁碟IO請求;
  • SCAN: 要求磁頭臂僅沿一個方向移動,並在雨中滿足所有未完成的氫氣,知道它到達這個方向上的最後一個磁軌,或者在這個方向上沒有別的請求位置,偏向於最靠裡或最靠外的磁軌作業,並且偏愛最近的作業(重複地請求一個磁碟容易影響高密度多面磁碟);
  • C-SCAN:把掃描限定在一個方向上;
  • N-Step-Scan:把自盤請求佇列分為長度為N的自佇列,每一次用SCAN處理一個自佇列;
  • FSCAN:使用兩個子佇列,一個處理請求,一個接受請求,兩個佇列輪流掃描;
磁碟快取記憶體:
  • 目的:通過區域性性原理,減小平均儲存器存取時間;
  • 常用演算法:LRU(置換在快取記憶體中未被訪問時間最長的快)和LFU(置換集合中被訪問次數最少的塊);