为什么 I/O 是不间断的?

twi*_*imo 12 process io

使 I/O 不间断的基本原理是什么?如果允许处理 I/O 的进程处理信号,会有什么负面后果?

Law*_*ceC 10

任何 I/O 都由进程调用的系统调用处理。最终,这样的系统调用将向下传递到一些适当的低级设备驱动程序函数,以执行实际的 I/O 操作。

I/O 可能很棘手 - 要真正将数据输入和输出设备,可能需要按顺序执行各种步骤,并且可能还需要时序要求。如果这些步骤没有自动完成,下一次尝试时,设备可能无法响应、行为异常,甚至导致系统锁定。每个设备的这些步骤可能不同且独特,因此为什么有这么多设备驱动程序。

编写良好的设备驱动程序应该知道如何处理它尝试服务的设备,因此它通常不会遇到问题,除非存在驱动程序错误、您为设备使用了错误的驱动程序或物理设备出现故障。


twi*_*imo 6

看完莫里斯·巴赫的《Unix操作系统的设计》一书,让我自己来回答这个问题。

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

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

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