出處: 初識I/O | I/O系列(一)
- I/O,input/output的簡寫,也就是輸入/輸出。在計算機系統中,I/O與處理器(CPU)、存儲器(內存和磁盤)是計算機的重要組成部件。輸入是從I/O設備復制數據到主存,輸出是從主存復制數據到I/O設備。I/O實現的功能是通過某種方式,實現計算機和外部環境(磁盤、終端、網絡等)之間移動數據。
I/O設備,包括磁盤、鍵盤、顯示器、各種網絡傳輸設備、及各種驅動程序等。計算機系統參與I/O的外設大體分為三類:
- 人可讀:適用於計算機用戶間的交互,如打印機和終端,終端包括顯示器和鍵盤,以及鼠標;
- 機器可讀:適用於與電子設備通信,如磁盤驅動器、USB密鑰、傳感器、控制器和執行器;
- 通信:適用於與遠程設備通信,如數字線路驅動器和調制解調器;
另外,按照輸入輸出特性還可分為輸入型外圍設備、輸出型外圍設備和存儲型外圍設備。
I/O的控制技術
詢問方式:CPU通過輪詢方式,讀取設備的標志位狀態,在整個數據傳輸過程中,CPU和外圍設備串行工作,效率較低;
中斷方式:外圍設備通過中斷方式通知CPU,由CPU進行數據的讀寫,CPU不需要全程參與。不過每次讀寫都需要CPU復制數據到內存,特點是處理的數據量小,而且,CPU每次都需要處理中斷,比較浪費CPU資源,不過相對於詢問方式,CPU和外圍設備可以並行工作;
DMA方式:由DMA直接復制內存與外設的數據傳輸,不需要CPU參與,CPU只負責處理DMA的中斷請求,不需要參與數據的讀取,效率比較高;
通道方式:通道又叫輸入輸出處理器,負責完成主存儲器和外圍設備之間的信息傳送,與CPU並行地執行操作,CPU負責處理通道的開始和結束事件,與DMA相比,通道可以完成數據更多的I/O操作。
縱觀I/O發展過程可以發現,越來越多I/O功能可在沒有CPU參與的情況下執行。CPU逐漸從I/O任務中解脫出來,因此提高了性能。
I/O的通用性和效率
在現代計算機系統中,I/O操作通常是計算機系統的瓶頸,與內存和處理器相比,大多數I/O設備的速度都非常低。

引用一張存儲設備的金字塔結構圖
為了理解操作系統的I/O類型,將I/O操作的幾個部分進行抽象化,按照分層思想將I/O組織類型分成三種重要的邏輯結構:邏輯外部設備、通信端口、文件系統。

本地外部設備:用戶進程將外部設備當做一個邏輯資源來處理,用戶進程根據設備標識符及簡單的命令,如打開、關閉、讀、寫等,與設備進行打交道;具體操作和數據由驅動程序轉換成適當的I/O指令、控制器命令;由調度和控制層進行處理I/O隊列、調度、中斷等。
網絡通信:網絡通信與本地外設的區別在於,邏輯I/O模塊被網絡通信體系結構取代。如,我們通常使用的HTTP、RPC、TCP/IP。
文件系統:文件系統通常是操作系統中重要的組成部分,所有文件都存在文件系統中。通常文件的訪問通過帶有文件目錄的標識訪問(目錄管理,還包括目錄本身的操作);文件的操作包括打開、關閉、讀、寫等(文件管理,還包括訪問權限模塊);不同物理設備的組織結構的特點,如物理磁道和扇區、磁盤陣列、虛擬內存、物理內存等。
文件系統
在計算機中,數據存儲的地方主要是內存和磁盤,從用戶角度看,用戶通過磁盤來存儲數據,而用戶直接使用的就是基於磁盤的文件系統,從系統角度來看,文件系統是操作系統為存儲設備和用戶之間提供的一個抽象接口,主要實現對文件存儲設備的空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。用戶不需要關心磁盤存放數據的細節,用戶只需知道文件名稱,就可以存取文件中的數據。
磁盤及其原理
磁盤主要部件為磁盤盤片、傳動手臂、讀寫磁頭和主軸馬達,實際數據都是寫在盤片上,讀寫主要是通過傳動手臂上的讀寫磁頭來完成。結構如下圖所示:


當磁盤需要讀取數據時,系統會將數據邏輯地址傳給磁盤,磁盤按照尋址邏輯將邏輯地址翻譯成物理地址(某個磁道、某個扇區),為了讀到某個扇區的數據,需要將磁頭放到這個扇區上。整個確定柱面,磁頭對准相應磁道的過程叫做尋道時間;然后,將磁盤的帶訪問地址區域旋轉到磁頭位置,這個時間叫旋轉延遲;最后,就是數據的傳輸時間,這主要取決於磁盤的旋轉速度速度。
所以,總平均存取時間表示為:

其中,Ts為平均尋道時間,r為旋轉速度(轉/秒),N為一個磁道中的字節數,b為要傳送的字節數。
注:為什么機械硬盤隨機讀取性能和連續讀寫性能差那么多?(https://www.zhihu.com/question/48254780)
我們知道磁盤在進行每次讀寫時候,除了數據的傳輸時間,都需要尋道時間和旋轉時間,這是沒有辦法避免的,所以,盡量使用順序讀取以減少硬盤的機械處理時間,可以提升整體的讀寫性能。很多開源框架Kafka、HBase就是將,隨機I/O轉化成順序I/O,以此來降低尋址時間和旋轉時延,提高IOPS。
操作系統對磁盤性能的優化
頁面緩存
由於存儲介質的特性,磁盤本身存取就比主存慢很多,再加上機械運動耗費,磁盤的存取速度往往是主存的幾百分分之一,因此為了提高效率,要盡量減少磁盤I/O。為了達到這個目的,磁盤往往不是嚴格按需讀取,而是每次都會預讀,即使只需要一個字節,磁盤也會從這個位置開始,順序向后讀取一定長度的數據放入內存。這樣做的理論依據是計算機科學中著名的局部性原理:
當一個數據被用到時,其附近的數據也通常會馬上被使用;
程序運行期間所需要的數據通常比較集中;
由於磁盤順序讀取的效率很高(不需要尋道時間,只需很少的旋轉時間),因此對於具有局部性的程序來說,預讀可以提高I/O效率。預讀的長度一般為頁(page)的整倍數。頁是計算機管理存儲器的邏輯塊,硬件及操作系統往往將主存和磁盤存儲區分割為連續的大小相等的塊,每個存儲塊稱為一頁(在許多操作系統中,頁得大小通常為4k),主存和磁盤以頁為單位交換數據。當程序要讀取的數據不在主存中時,會觸發一個缺頁異常,此時系統會向磁盤發出讀盤信號,磁盤會找到數據的起始位置並向后連續讀取一頁或幾頁載入內存中,然后異常返回,程序繼續運行。
I/O調度
I/O調度層的功能是管理塊設備的請求隊列。即接收通用塊層發出的I/O請求,緩存請求並試圖合並相鄰的請求。並根據設置好的調度算法,回調驅動層提供的請求處理函數,以處理具體的I/O請求。
如果簡單地以內核產生請求的次序直接將請求發給塊設備的話,那么塊設備性能肯定讓人難以接受,因為磁盤尋址是整個計算機中最慢的操作之一。為了優化尋址操作,內核不會一旦接收到I/O請求后,就按照請求的次序發起塊I/O請求。
常見的I/O調度算法包括Noop調度算法(No Operation)、CFQ(完全公正排隊I/O調度算法)、DeadLine(截止時間調度算法)、AS預測調度算法等。
緩沖技術
為了緩和CPU和I/O設備速度不匹配的矛盾,提高CPU和I/O設備的並行性,減少CPU響應中斷的頻率,在現代操作系統中,幾乎所有的I/O設備在與處理機交換數據時都用了緩沖區。通常CPU的速度要比I/O設備的速度快得多得多,所以可以設置緩沖區,對於從CPU來的數據,先放在緩沖區中,然后設備可以慢慢地從緩沖區中讀出數據。常見幾種方案包括單緩沖,雙緩沖,循環緩沖,緩沖池

其他關鍵概念
- 多道程序設計技術:單處理器系統中的多個進程調度
- 多處理器技術:多處理器系統中的多個進程調度
- 分布式處理器技術:多台分布式計算機系統中多個進程的調度
引申關鍵字
- TFS——Taobao File System
- HDFS
- Kafka
- 流式文件
- SSD
- 磁盤陣列
- Buffer與Cache
- 《操作系統精髓與設計原理》
- 《深入理解計算機系統》 第三版
- https://blog.csdn.net/qwe6112071/article/details/71822185
- https://tech.meituan.com/2017/05/19/about-desk-io.html
- https://blog.csdn.net/hguisu/article/details/7408047
- https://cloud.tencent.com/developer/news/332953
- https://baike.baidu.com/item/%E7%BC%93%E5%86%B2%E6%8A%80%E6%9C%AF/1937843?fr=aladdin