为什么在Linux中I / O是不可中断的?

它背后的理由是什么? 如果允许进行I / O的进程处理信号,会有什么坏结果呢?

根据Linux开发者文档 ,这是为了防止数据丢失,并避免硬件进入不一致的状态。

想象一下,如果一个read() (例如来自磁盘)是可中断的,并且信号处理程序(除其他职责之外)改变了读缓冲区,会发生什么情况。 由于信号是异步的,读取结果将不可重现。 如果写作中断,类似的混乱也会随之而来。

现在我读了Maurice Bach的“Unix操作系统的设计”一书,让我自己来回答这个问题。

总之,使I / O不中断是为了使I / O任务尽快完成,而不受信号的干扰。

我从书中获得的一些相关知识:

  1. “不可中断”一词应指“不间断睡眠”。 当进程处于不可中断的睡眠状态时,它不能被信号唤醒,也不能处理信号。
  2. 进程在以下情况下处理信号:a。 它正在内核模式下运行,即将返回到用户模式。 湾 当睡眠中断时即将进入和离开睡眠状态。
  3. 睡眠过程被信号唤醒时会发生什么? 它将处理信号,默认行动正在退出过程。 当一个进程正在等待I / O完成时,你当然不希望它过早退出。