對I/O操作有三種可能的技術:可程式化I/O、中斷驅動I/O、直接記憶體存取(DMA)
可程式化I/O
當處理器正在執行程式並遇到一個與I/O相關的指令時,它通過給相應的I/O模組發命令來執行這個指令。使用可程式化I/O操作時,I/O模組執行請求的動作並設定I/O狀態寄存器中相應的位,它並不進一步通知處理器,尤其是它並不中斷處理器。因此處理器在執行I/O指令後,還要定期檢查I/O模組的狀態,以確定I/O操作是否已經完成。
如果使用這種技術,處理器負責從記憶體中提取資料以用於輸出,並在記憶體中儲存資料以用於輸入。I/O軟體應該設計為由處理器執行直接控制I/O操作的指令,包括檢測裝置狀態、發送讀命令或寫命令和傳送資料,因此指令集中包括以下幾類I/O指令:
控制:用於啟用外部裝置,並告訴它做什麼。
狀態:用於測試與I/O模組及其外圍裝置相關的各種狀態條件。
傳送:用於在儲存空間寄存器和外部裝置間讀資料或寫資料。
缺點:這是一個耗時的處理,處理器總是處於沒有用的繁忙中。
中斷驅動I/O
處理器給模組發出I/O命令,然後繼續做其他一些有用的工作。當I/O模組準備好與處理器交換資料時,它將打斷處理器的執行並請求服務。處理器和前面一樣執行資料傳送,然後恢複處理器以前的執行過程。
缺點:由於資料中的每個字無論從儲存空間到I/O模組還是從I/O模組到儲存空間都必須通過處理器處理,這導致中斷驅動I/O仍然會花費很多處理器時間。
直接記憶體存取
對於前面兩種形式的I/O,處理器都需要主動幹預在儲存空間和I/O模組之間的資料傳送,並且任何資料傳送都必須完全通過處理器。因此前兩種I/O形式由兩方面固有的缺陷:
I/O傳送速度受限於處理器測試裝置和提供服務的速度
處理器忙於管理I/O傳送的工作,必須執行很多指令以完成I/O傳送
當需要移動大量的資料時,需要使用一種更有效技術:直接記憶體存取(DMA)。DMA功能可以由系統匯流排中一個獨立的模組完成,也可以併入到一個I/O模組中。不論採用哪種形式,該技術的工作方式如下所示:當處理器要讀或寫一塊資料時,它給DMA模組產生一條命令,發送以下資訊:
是否請求一次讀或寫
涉及的I/O裝置的地址
開始讀或寫的儲存空間單元
需要讀或寫的字數
之後處理器繼續其它工作。處理器把這個操作委託給DMA模組,由該模組負責處理。DMA模組直接與儲存空間互動,傳送整個資料區塊,每次傳送一個字(16位系統)。這個過程不需要處理器參與。當傳送完成後,DMA模組發一個中斷訊號給處理器。因此只有在開始傳送和傳送結束時處理器才會參與。
DMA模組需要控制匯流排以便於儲存空間進行資料傳送。由於在匯流排使用中存在競爭,當處理器需要使用匯流排時要等待DMA模組。注意,這並不是一個中斷,處理器沒有儲存上下文環境去做其他的事情,而是僅僅暫停一個匯流排周期(在匯流排上傳送一個字的時間(16位系統))。其總的影響是在DMA傳送過程中,當處理器需要訪問匯流排時處理器的執行速度會變慢。
以下是三種技術的流程圖: