# I/O運作 ###### tags: `IT鐵人` ## I/O裝置 所謂的I/O裝置,就是input/output的裝置,負責輸出跟輸入資料,比如說鍵盤跟螢幕,或是網路等等的裝置,有時候我們需要通知這些裝置做事,就有幾個方法可以實行,分別是polling I/O, Interrupted I/O以及DMA,前兩者的前面六個步驟都相同,依序是下列六步: |No.|Action| |-|-| |1|User process發出I/O request給OS |2|OS收到請求,可能暫停此process執行,並執行相對應的system calls。 |3|kernel的I/O-subsystem會pass此請求給Device driver。 |4|Device driver依此請求設定對應的I/O commands參數給Device Controller。 |5|Device Controller啟動,監督I/O-Device之I/O運作進行。 |6|在此時,OS可能將CPU切給另外一個process執行。 後面依序介紹三種I/O處理方式,三種的差別在於I/O動作結束之後怎麼告知OS,讓自己取得I/O結果。 ## Polling I/O ![](https://i.imgur.com/WDS1zCu.png) Polling I/O稱為詢問式I/O,CPU在執行其他Process的過程時要不斷去pollling Device Controller確認I/O動作是否完成。 通常實作的方式會使用幾個bit,負責表示I/O動作完成或是出現錯誤,CPU每次只要檢查這幾個bit就好,處理完成後再把這些bit重設。 Polling I/O因為需要花大量的時間去polling Device Controller上,花在process execution的時間就相對被壓縮,所以適合用在Device執行很快的情況,如此一來才不會有一堆需要詢問的Device占用CPU時間。 ## Interrputed I/O ![](https://i.imgur.com/pOl2ESK.png) Interrupted I/O的做法是在I/O動作完成後,發出一個I/O Completed的Interrupt通知OS,CPU再花時間來尋找是哪個I/O完成並且處理之。 Interrupt的好處是不用一直花時間polling,能夠提升CPU utilization。不過要是I/O Device的處理方式很快,則會一直被interrupt,所以適合用在I/O Device有一定處理時間的裝置。 ## DMA I/O ![](https://i.imgur.com/wTCJlZS.png) DMA I/O的全名為Direct Memory Access,他的做法是把I/O的處理交給另一個硬體,讓他直接存取記憶體以便他直接把處理好的結果放在該放的位置。 DMA I/O的好處是可以很大幅度的提高CPU utilization。缺點是需要另外設計一個硬體處理I/O,並且DMA I/O還是會跟CPU搶Memory的使用權。 ## 白話說明I/O種類 ![](https://i.imgur.com/FRvDtJN.png) 其實我們可以把這個假設成工作中途煮開水: * Polling I/O就是時不時過去看看水滾了沒。 * Interrupted I/O就是水開了之後會發出高頻率的叫聲,像是以前的水壺會裝上一個通知水滾的尖嘴。 * DMA I/O就是雇用了一個傭人幫忙煮開水,好了就拿過來主人的身邊。 |上一篇|下一篇| |--|--| |[OS初體驗](https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/SJp_jMc-Y)|[Kernel Mode](https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/HJ8bbihWY) ![](https://i.imgur.com/QDDhZh4.png)