I/O設備管理
什麼是I/O設備
I/O 即 input/output 就是(輸入/輸出)
操作系統作爲系統資源的管理者,不僅要對主機內部設備如CPU,內存,外存等設備進行管理,還需要對主機外部設備進行管理。
I/O設備通常是指外部設備,例如鼠標,鍵盤即爲輸入型設備,顯示器即爲輸出型設備;但I/O設備也包含內部設備例如,外存(磁盤),網卡等;(鼠標,鍵盤爲字符型設備,輸入輸出以字符爲單位,採用中斷驅動的方式。磁盤爲塊設備,輸入輸出以磁盤塊大小爲單位)
類UNIX系統中將外設抽象爲一種特殊的文件,用戶可以用與文件操作相同的方式對外部設備進行操作。write寫入數據,read讀出數據。
I/O設備控制器
CPU是無法直接控制I/O設備的機械部件的,必須通過控制I/O控制器,再由I/O控制器來操作I/O設備,間接的實現CPU對I/O設備的操作。
I/O控制器的功能
-
接收和識別CPU發出的I/O指令
如CPU發來的read/write
命令,I/O控制器會有相應的控制寄存器來存放命令和參數。 -
向CPU報告設備的狀態
I/O控制器會有相應的狀態寄存器,用於記錄I/O設備的當前狀態。例如忙碌,空閒,故障,以便讓CPU知曉。 -
CPU和I/O設備數據交換中轉
I/O控制器中會設置相應的數據寄存器,輸出時,用於暫存CPU發來的數據,之後再由I/O控制器傳送給機械設備,輸入時,用於暫存機械設備發來的數據,之後CPU從數據寄存器中取走數據。 -
地址識別
類似內存地址,爲了區分不同I/O設備,的輸入和輸出。也需要給各個寄存器來劃分地址,I/O控制器,通過CPU發來的地址來判斷,CPU要調用讀/寫那個寄存器。I/O控制方式
程序直接控制方式
程序直接控制方式,完成一次I/O讀寫操作流程見下圖:
CPU執行程序完成一次I/O設備,讀/寫操作的步驟:
- CPU執行程序通過控制總線向I/O控制器接口發送讀操作,I/O控制器運行命令,啓動設備,並將設備狀態寄存器設爲1(未就緒,因爲CPU的速度比I/O設備塊,所以CPU得等待I/O設備)。
- CPU執行 輪詢檢查程序,檢查I/O控制器的狀態寄存器的狀態。(其實就是在不斷的執行程序循環,若狀態一直是1,說明設備還沒準備好輸入數據,於是CPU會不斷的輪詢執行檢查程序)
- 輸入設備準備好數據後將數據傳給I/O控制器,並報告自身狀態。
- I/O控制器將輸入的數據存放到,數據寄存器,並修改狀態寄存器狀態爲0(已就緒)。
- CPU執行的輪詢程序,發現狀態寄存器的設備狀態已就緒。即可將數據寄存器的內容,讀入到CPU寄存器,再把CPU寄存器中的內容放入內存。(例如用scanf輸入命令參數,參數最後還是要賦值給內存程序中的變量,相反如果執行printf打印命令,需要將內存中的變量輸出到顯示設備中)。
非阻塞I/O模型:
因爲CPU在當前進程上一直在執行輪詢檢查I/O狀態。所以放到這道作業的執行上過程上來講是非阻塞的。
非阻塞I/O模型特點:
CPU干預率:很頻繁,CPU和I/O設備只能串行工作,CPU需要一直輪詢檢查,長期處於"忙等"狀態。
缺點:cpu利用率低。
數據傳送單位:每次讀/寫入一個字
讀操作數據流向:I/O設備->CPU->內存
寫操作數據流向:內存->CPU->I/O設備
同步異步:同步執行模式。
關鍵詞:輪詢。
中斷驅動方式
正式因爲程序直接控制方式,程序執行需要一直忙等導致CPU利用率底下等問題,我們引入的中斷機制。中斷驅動方式完成一次讀寫操作流程如下圖:
在中斷驅動模式下,CPU執行程序完成一次I/O讀寫操作步驟:
- CPU通過控制總線向I/O控制器接口發送讀命令,CPU將等待I/O的進程阻塞。切換到別的進程進行執行。
- I/O控制器接受CPU命令,啓動I/O設備,準備數據。
- 外設準備好數據,將數據傳送給I/O控制器,I/O控制器向CPU發送中斷信號。
- CPU檢測到中斷信號,保存當前執行進程運行上下文環境,轉去執行中斷處理程序去處理該中斷。
- CPU從I/O控制器中的數據寄存器讀取一個字的數據傳送到CPU寄存器,再寫入內存中。接着CPU恢復執行因等待I/O數據阻塞的進程的上下文運行環境,然後繼續執行。
注意:cpu會在每個指令週期末尾檢查中斷;中斷處理過程需要保護,恢復進程的運行環境,這是需要一定時間開銷的。如果中斷髮生的頻率太高,也會降低系統性能。
阻塞IO模型:
因爲CPU在發送I/O指令以後,可以阻塞當前進程,切換執行其他進程。當前作業執行過程是阻塞的。CPU並沒有在這個進程上進行忙等。
CPU干預率:每次I/O之前,完成之後需要CPU介入,等待I/O完成之前,CPU執行其他進程。CPU利用率明顯提高,
缺點:每個字在I/O設備和內存之間傳輸都需要經過CPU,頻繁的中斷處理會消耗較多的CPU時間。
數據傳送單位:每次讀/寫入一個字
讀操作數據流向:I/O設備->CPU->內存
寫操作數據流向:內存->CPU->I/O設備
同步異步:同步執行模式。(此進程處於"閒等",進程並沒有去做其他事情或者完成)
關鍵詞:中斷。
DMA方式
因爲中斷一次只能從I/O設備讀取一個字,並且得通過CPU再到內存,導致浪費CPU資源。因此引入了DMA方式(Direct Memory Access,直接存儲器存取,主要用於塊設備的I/O控制)
具體步驟不在贅述;相較於中斷做出了一下改進。
- 數據傳送單位是磁盤塊,不在是以一個字爲單位;
- 數據流向是從設備直接流向內存,或者從內存直接到設備,不需要CPU作爲"快遞小哥"
- 僅在傳送一個或者多個塊的開始和結束時需要CPU干預,進一步提升效率。
DMA控制器也是I/O控制器的一種,和一般I/O控制器的區別在於數據的傳輸不進過CPU了。系統將數據從I/O外設讀入到內存的任務交給DMA控制器去做,DMA控制器把輸入數據一個字一個字的放到DR數據寄存器中,等DR數據達到一個或者規定的多個塊以後再由DMA控制器寫入內存,DMA控制向CPU發出中斷指令;喚起進程執行後續處理。數據傳輸效率和CPU利用率大幅提高。
通道控制模式
通道控制模式是DMA模式的升級版,可以一次性傳輸一組數據,由通道硬件支持。
通道:一種硬件,可以理解爲是一個弱雞版的CPU,通道可以識別並執行一系列通道指令,也就是CPU把把任務清單交給通道。通道接管I/O。
簡單理解一下下圖不再贅述。
緩衝區
進行I/O操作的時候,由於CPU速度快,I/O設備速度慢,如果CPU每次都向I/O設備輸出一個字符,就得產生中斷,等待I/O設備,導致大量中斷CPU利用率低,爲了解決數據傳輸速度不匹配的問題,需要在內存中開闢一塊存儲空間作爲緩衝區。
緩衝區的作用
CPU輸出數據的時候,可以把數據快速入緩衝區,之後就可以做別的事情了,慢速的I/O設備可以慢慢的從緩衝區中取走數據,等I/O完成以後再向CPU發出中斷信號。CPU在此期間可以做更多的事情,同時提高了CPU與I/O設備直接的並行性。
單緩衝
用戶進程請求磁盤讀入若干塊的數據,若採用單緩衝策略,操作系統會在主存中爲,其分配一個緩衝區。
注意:
- 當緩衝區非空時,不能往緩衝區輸入數據,只能從緩衝區輸出數據。
- 當緩衝區爲空時,不能從緩衝區輸出數據,可以往緩衝區輸入數據,但是必須把緩衝區充滿以後,才能從緩衝區把數據輸出。
管道通信中的"管道"其實就是緩衝區。要實現雙向傳輸,必須設置兩個管道。
緩衝池
緩衝池由系統中共用的緩衝區組成,這些緩衝區按使用情況可以分爲:空緩衝隊列,裝滿輸入數據的緩衝隊列(輸入隊列),裝滿輸出數據的緩衝隊列(輸出隊列)。
另外可以根據一個緩衝區實際運算中扮演的功能不同,又設置了四種工作緩衝區:
- 用於收容輸入數據的工作緩衝區(hin)
- 用於提取輸入數據的工作緩衝區(sin)
- 用於收容輸出數據的工作緩衝區(hout)
- 用於提取輸出數據的工作緩衝區(sout)