IO設備與異步

參考《操作系統導論》

介紹異步與多線程之前,先熟悉一下IO設備,這與異步關係密切

一、IO設備

       1、問題:IO是如何集成進系統中的?一般的機制是什麼?IO集成遇到的問題有哪些?如何解決集成遇到的問題?如何讓它們變得高效?

爲什麼需要這樣的佈局?因爲造價和物理佈局,高性能的內存總線沒有足夠的空間來連接外圍設備,而且高性能設備造價較高。

2、標準設備

由2部分組成,第1部分向系統展示的硬件接口,讓系統軟件來控制它的操作。第2部分內部結構主要包含一些複雜設備CPU、一些通用內存、設備相關的特性芯片。

3、標準協議具體

簡化的設備接口包含3個寄存器:一個狀態寄存器,可以查看設備的當前狀態;一個命令寄存器,用於通知設備執行某個具體任務;一個數據寄存器,將數據傳給設備或從設備接收數據。

操作系統與設備的經典交互,

while (status == BUSY)

        ;

write data to data register

write command to command regitster

while (status == BUSY)

        ;

這個簡單的模型效率低下,輪詢效率低下,在等待設備執行完成命令浪費大量CPU,如果此時切換到下一個就緒進程,就可以大大提高CPU使用率。

4、操作系統檢查設備狀態如何避免頻繁輪詢,降低CPU開銷?

中斷避免了頻繁輪詢,CPU向設備發送一個請求,然後切換到其他任務。當設備完成了自身操作,會拋出一個硬件中斷,引發CPU跳轉執行操作系統預先定義好的中斷服務例程,或者更簡單的中斷處理程序。中斷處理程序是一小段操作系統代碼,它會結束之前的請求並且喚醒等待IO的進程繼續執行。

中斷並非總是最佳方案,高性能設備處理請求很塊,通過在CPU第一次輪詢時就可以返回結果。此時用中斷反而會拖慢進程,因爲切換到其他進程,處理中斷,再切換回之前的進程代價不小的。

另外一種情況最好不要使用中斷的場景是網絡。網絡端收到大量的數據包,如果每個包都發生一箇中斷,那麼有可能引發操作系統發生活鎖,即不處理中斷無法處理用戶層的請求。web服務器因爲“點槓效應”而突然承受很重的負載。輪詢可以更好的控制系統的行爲,並允許web服務器先服務一些用戶的請求。

另一種基於中斷的優化就是合併。由於設備拋出中斷之前往往會等待一小段時間,在此期間,其他請求可能很塊完成,因此多次中斷可以合併爲一次中斷拋出,從而降低處理中斷的代價。等待太長會增加請求的延遲。

5、如何DMA進行更高效的數據傳輸?

前面介紹的還需要注意一點。具體的說,如果使用編程的IO將一大塊數據傳給設備,CPU又會因爲參與將數據拷貝到設備,或者從設備上接收數據的過程中,導致CPU負載很重。浪費了時間和算力,本來可以服務其他進程的。

如何減少CPU的時間會浪費在向設備傳輸數據或從設備傳出數據的過程中。從而提高CPU的使用率?

解決方案是使用DMA(Direct Memory Access)。DMA引擎是系統中的一個特殊設備,可以協調完成內存和設備間的數據傳遞,不需要CPU介入。

DMA工作過程如下,爲了能夠將數據傳給設備,操作系統會通過編程告訴DMA引擎數據在內存的位置,要拷貝的大小以及要拷貝到哪個設備。在此之後操作系統就可以處理其他請求了。當DMA的任務完成後,DMA控制器會拋出一箇中斷來告訴操作系統自己已經完成數據傳輸。

中斷與DMA的區別:

中斷是CPU向設備發送一個請求,然後切換到其他任務。當設備完成了自身操作後,會拋出一個硬件中斷,引發CPU跳轉執行中斷服務程序並重新喚醒等待IO的進程並繼續執行。

DMA不需要CPU參與,操作系統會通過編程告訴DMA引擎數據在內存位置,要拷貝的大小以及要拷貝到哪個設備,在此操作系統就可以處理其他請求了。當DMA的任務完成後,DMA控制器會拋出一中斷告訴操作系統自己已完成數據傳輸。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章