使 I/O 不间断的原理是什么?如果允许处理 I/O 的进程处理信号,会产生什么负面后果?
答案1
任何 I/O 均由进程调用的系统调用处理。最终,这样的系统调用将逐渐向下传递到某个适当的低级设备驱动程序函数来执行实际的 I/O 操作。
I/O 可能很棘手 - 要实际将数据传入和传出设备,可能需要按顺序执行各种步骤,并且可能需要执行时序要求。如果这些步骤没有自动完成,那么下次尝试这些步骤时,设备可能不会响应、行为异常,甚至导致系统锁定。对于每个设备,这些步骤可能不同且独特,因此有如此多的设备驱动程序。
编写良好的设备驱动程序应该知道如何处理它试图服务的设备,因此它通常不会遇到问题,除非存在驱动程序错误、您使用了错误的设备驱动程序或物理设备出现故障。
答案2
现在我已经阅读了莫里斯·巴赫的《Unix操作系统的设计》一书,让我自己来回答这个问题。
简而言之,使I/O不可中断就是为了使I/O任务尽快完成,而不受信号的干扰。
我从书中获得的一些相关知识:
- “不间断”这个词应该是指“不间断的睡眠”。当进程处于不间断睡眠时,它不能被信号唤醒,也不能处理信号。
- 进程在以下情况下处理信号:它正在内核模式下运行,即将返回用户模式。 b.当睡眠可中断时,即将进入和离开睡眠状态。
- 当一个睡眠进程被信号唤醒时会发生什么?它将处理信号,默认操作是退出进程。当一个进程正在等待 I/O 完成时,您当然不希望它过早退出。
答案3
内核中的某些代码路径被标记为不可中断,主要是因为代码必须遵守严格的时序(以响应设备)或者因为它正在执行不允许干扰的操作。就 Linux 而言,前者的大部分已被推出独立的内核线程,而后者大部分已被消除(我怀疑主要是受到当前多 CPU 机器的压力)。即,已经有一段时间我没有看到不间断睡眠的进程了。