輸入輸出系統與裝置管理

中斷驅動輸入輸出(interrupt-driven I/O)

與其站在水壺旁盯到它煮開,不如打開一個煮好時會鳴笛的電熱水壺,然後去回電子郵件。那聲笛響正好在有事可做時把你拉回來,一秒都不會更早。中斷驅動輸入輸出就是電腦在用一個哨子:CPU 啟動一個裝置,然後跑去執行別的工作,而裝置在它完成或有資料就緒的那一刻發出中斷——一個電子訊號。

具體來說,流程是:CPU 寫一個命令給控制器以啟動操作,然後回頭去執行其他行程。緩慢的裝置自行工作。當它完成時,控制器拉起一條中斷線。CPU 做完目前這條指令、存下它正在做的事、透過中斷向量查出正確的處理常式、執行那個中斷服務常式來搬移資料或記下完成、還原它存下的狀態,再繼續它原本在做的事。和輪詢相比,差別有如天壤:CPU 不浪費週期去問「好了沒?」——它做真正的工作,只在真的有事要處理時才被打斷。

為什麼重要:對於相對 CPU 而言較慢、卻仍需即時服務的多數裝置——鍵盤、滑鼠、網路卡、中等速率的磁碟——這是主力方案。它讓一顆 CPU 能同時讓許多裝置與許多行程都運轉順暢。它的極限在於每次中斷的開銷:每一次都要付出一次狀態儲存、一次處理常式呼叫、一次狀態還原,所以對於極高速率的串流(千兆位元網路、高速 SSD),中斷的洪流本身就可能把 CPU 淹沒——這正是這類裝置會加上直接記憶體存取、有時還刻意把中斷批次化或合併的原因。

你發起一次磁碟讀取,你的程式被安置入睡。接下來幾毫秒裡 CPU 去執行其他行程。當磁碟備妥資料時,它的控制器發出中斷;作業系統喚醒你的程式並把資料交給它。沒有任何週期被浪費在等待上。

CPU 去處理別的事,只在裝置真正完成時才被召喚回來。

中斷驅動輸入輸出仍然由 CPU 在它的處理常式裡搬移每一個位元組(只是僅在資料就緒時才動手)。對於大區塊,要連這也省掉,就需要直接記憶體存取,它只在最後完成時中斷一次。

又称
interrupt-driven input/output中斷式輸入輸出