基于中断的I/O 请求 | My Note

基于中断的I/O 请求

Updated: Sep 21st, 2023


当有I/O请求,如读/写请求需要设备完成时,OS需要准备好相关指令,发送至设备,然后等待设备完成该I/O操作。设备通过中断通知系统该操作已完成。

Pasted image 20220423221158

图源

需要注意的是,由于一般的I/O操作较慢,OS会在发出I/O指令后,将自身进程调度到休眠状态,并让出CPU时间片给其他进程使用,因此需要一次 [[ Context Switch|上下文切换 ]](CS)。当中断到来,继续触发CS以执行中断处理函数,并唤醒相应的I/O进程,唤醒的过程又需要一次CS,才能完成一次完整的I/O操作。

因此一般来说,基于中断的I/O请求的额外开销是额外的上下文切换和中断处理函数,这部分导致了中断的延迟会略大一些。当设备速度越来越快时,该部分延迟的占比更为显著。

Pasted image 20220423230408

图源

一些优化

  1. OSDI22 [1] 提出
    1. 可以 Interrupt coalescing,即多个I/O请求完成再触发中断,合并多个I/O的完全请求,从而平摊开销。
    2. 需要自适应的方式来处理 I/O完成请求的合并。大概的思路是:延迟敏感型的应用快点发中断,吞吐敏感型的应用慢点发中断,合并多一些。

参考资料

  1. 图源
  2. Faster than Flash: An In-Depth Study of System Challenges for Emerging Ultra-Low Latency SSDs
[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]

Instead of authenticating the giscus application, you can also comment directly on GitHub.


Notes mentioning this note