基于中断的I/O 请求
Updated: Sep 21st, 2023
当有I/O请求,如读/写请求需要设备完成时,OS需要准备好相关指令,发送至设备,然后等待设备完成该I/O操作。设备通过中断通知系统该操作已完成。
需要注意的是,由于一般的I/O操作较慢,OS会在发出I/O指令后,将自身进程调度到休眠状态,并让出CPU时间片给其他进程使用,因此需要一次 [[ Context Switch|上下文切换 ]](CS)。当中断到来,继续触发CS以执行中断处理函数,并唤醒相应的I/O进程,唤醒的过程又需要一次CS,才能完成一次完整的I/O操作。
因此一般来说,基于中断的I/O请求的额外开销是额外的上下文切换和中断处理函数,这部分导致了中断的延迟会略大一些。当设备速度越来越快时,该部分延迟的占比更为显著。
一些优化
- OSDI22 [1] 提出
- 可以 Interrupt coalescing,即多个I/O请求完成再触发中断,合并多个I/O的完全请求,从而平摊开销。
- 需要自适应的方式来处理 I/O完成请求的合并。大概的思路是:延迟敏感型的应用快点发中断,吞吐敏感型的应用慢点发中断,合并多一些。
参考资料
[1]
A.
Tai, I. Smolyar, M. Wei, and D. Tsafrir, “Optimizing Storage
Performance with Calibrated Interrupts,” 2021, pp. 129–145
[Online]. Available: https://www.usenix.org/conference/osdi21/presentation/tai.
[Accessed: 04-Aug-2021]