I/O Performance
Basic Concept
I/O performance 討論的是:為什麼 I/O 常常成為整體系統效能瓶頸,以及 OS 可以怎麼降低 I/O path 上的成本。一次 I/O request 不只是 device 本身慢;它還會讓 CPU 執行 driver code、進出 kernel、排程 process、處理 interrupt、copy data、競爭 memory bus。
application ↔ kernel ↔ driver ↔ controller ↔ deviceCost Sources
Interrupt Handling
Interrupt 讓 CPU 不必一直 polling,但每次 interrupt 都要保存 state、執行 handler、restore state。如果 interrupt rate 很高,這些 overhead 會明顯消耗 CPU。
Context Switching
Blocking I/O 會讓 process 從 run queue 移到 wait queue;I/O 完成後又回到 ready queue。這會造成 scheduler 工作、CPU cache disruption、以及 process state 切換成本。
Memory Copy
資料常常需要在多個地方 copy:
- controller / DMA → kernel buffer。
- kernel buffer → user buffer。
- application buffer → kernel buffer。
- protocol stack 中不同 layer 之間的 packet copy。
這些 copy 會消耗 CPU 和 memory bandwidth。當 device 很快,例如高速 NVM 或 network 時,copy overhead 反而可能成為瓶頸。
Software Layers
Network I/O 尤其明顯。遠端 login 的一個 character 可能經過 keyboard interrupt、terminal driver、user process、network system call、protocol stack、network driver、network controller、remote kernel、daemon,再回傳 echo
Polling vs Interrupt
現代 driver 可能使用 hybrid strategy:低流量時用 interrupt;流量高時切換到 polling 或批次處理,降低 interrupt frequency。
Offloading
一種改善 I/O performance 的方法,是把工作從 main CPU 移到 specialized hardware 像是 DMA controller
Offloading 的目標是提高 concurrency:main CPU 可以繼續執行 computation,I/O controller 同時搬資料或處理 protocol
Where to Put Functionality
I/O functionality 可以放在不同層:
| Layer | 優點 | 缺點 |
|---|---|---|
| Application | 容易開發、debug,不容易 crash kernel | context switch 多,不能直接用 kernel internal data structure |
| Kernel / driver | 效能較好,可用 kernel locking/threading/cache | bug 可能造成 data corruption 或 system crash |
| Controller / hardware | 最高效,可和 CPU 並行 | 難修改、開發成本高、彈性低 |
常見發展路徑是:新演算法先在 application 層實驗;證明有效後移到 kernel;若非常重要且穩定,最後可能移到 hardware。