輸入輸出系統與裝置管理

程式化輸入輸出(programmed I/O)

想像你泡茶時就站在水壺旁盯著它,在它煮開之前拒絕做任何別的事,接著還親自一杯一杯地倒。每一個步驟、每一滴水你都親自在場。程式化輸入輸出就是電腦正在做這件事:CPU 自己一個位元組接一個位元組地驅動整個傳輸,全程盯著裝置,在完成之前絕不跑去做別的工作。

具體來說,CPU 跑迴圈。要送出資料時,它一遍又一遍地讀控制器的狀態暫存器,直到忙碌位元清除,才把下一個位元組寫進資料暫存器、設定命令暫存器的啟動位元,然後對每一個位元組重複。要接收時,它輪詢狀態暫存器直到有一個位元組就緒,再讀取資料暫存器,然後再次迴圈。沒有任何幫手:CPU 既是大腦又是信差,而它全程就卡在這個緊湊的忙碌等待迴圈裡,等待一個緩慢裝置的同時什麼有用的事都不做。

為什麼重要:程式化輸入輸出是最容易實作的方案,對於極小、極快或一次性的傳輸,或在沒有別的事可做的極小嵌入式系統裡,都還算可以。但當裝置很慢時它極度浪費:一顆每秒能執行數十億條指令的 CPU,被貶低到去照看一個鍵盤或一條慢速序列線,在迴圈裡空燒週期。正是這種浪費,才有了另外兩種方案——中斷驅動輸入輸出讓 CPU 自由工作直到裝置發出訊號,而直接記憶體存取讓控制器搬移整塊資料,CPU 完全不必碰每一個位元組。

一個微小的開機載入器把字串送到序列埠的做法是:對每個字元,反覆讀狀態暫存器直到「傳送器已空」被設定,再把字元寫入資料暫存器。CPU 在這整段時間什麼別的事都不做。

簡單,但 CPU 在整個(往往很慢的)傳輸過程中被完全佔住。

程式化輸入輸出總是由 CPU 親自搬移每一個位元組;它等待的那一半就是輪詢。相反的做法是讓裝置發出中斷——程式化輸入輸出之所以浪費,正因為它讓 CPU 一直忙碌等待。

又称
PIOpolled I/O輪詢式輸入輸出