Interrupt Handling for I/O

請看 Interrupt 有關於 Interrupt 的詳細介紹

Basic Concept

Interrupt-driven I/O 是讓 device controller 在需要 CPU attention 時主動通知 CPU 的機制。和 polling 相比,CPU 不必一直讀 status register 等 device ready;device 完成輸入、輸出、或發生 error 時,controller 透過 interrupt-request line 發出訊號,CPU 再暫停目前執行流進入 interrupt handler。

簡化流程是:

  1. Device driver 啟動 I/O request。
  2. Controller 操作 device。
  3. I/O 完成或出錯時,controller raise interrupt。
  4. CPU 在 instruction boundary 偵測到 interrupt,保存目前狀態。
  5. CPU 根據 interrupt vector 找到 interrupt handler。
  6. Handler 處理 device event,清除 interrupt,必要時喚醒等待中的 process。
  7. CPU restore state,回到原本執行流。

Interrupt Vector and Dispatch

現代系統可能有很多 interrupt source,如果每次 interrupt 都讓同一個 handler 去問所有 device「是不是你?」,會很沒效率。因此 CPU 通常使用 interrupt vector:interrupt 帶有一個 Interrupt number,CPU 用它查表找到對應 handler 的 address,此 address 稱為 Interrupt vector

如果 device 數量比 vector table entry 多,OS 可能使用 interrupt chaining:一個 vector entry 指向一串 handlers,interrupt 發生時依序詢問,直到找到能處理該 event 的 handler。這是在巨大 table 和單一 handler 全面搜尋之間的折衷。

Interrupt and System Performance

Interrupt 不是免費的。每次 interrupt 都需要 state save/restore、進入 handler、可能造成 context switch。因此在 I/O rate 很高時,interrupt overhead 可能變成瓶頸。這也是為什麼一些 high-throughput device driver 會在低流量時使用 interrupt,在高流量時切換成 polling。

核心 trade-off

Interrupt 避免 CPU 長時間 busy waiting,但把成本轉成 interrupt dispatch、handler execution、state restore、以及可能的 context switch。是否划算取決於 event 頻率與每次等待時間