为什么I / O不间断?


11

使I / O不间断的背后原理是什么?如果允许处理I / O的进程处理信号,将会带来什么负面影响?


write(2)允许提前返回,返回写入的实际字节数,该字节数可以小于作为第三个arg传递的缓冲区长度。
彼得·科德斯

Answers:


9

任何I / O均由进程调用的系统调用处理。最终,这样的系统调用将逐步将其引导至某些适当的低级设备驱动程序功能,以执行实际的I / O操作。

I / O可能很棘手-为了实际地将数据进出设备,可能需要遵循各个步骤,以确保时序要求。如果这些步骤没有自动完成,则在下次尝试时,设备可能不会响应,行为不正常,甚至导致系统锁定。对于每个设备,这些步骤可能是不同的并且是唯一的,因此,为什么会有这么多设备驱动程序。

编写良好的设备驱动程序应知道如何处理其要维修的设备,因此,除非出现驱动程序错误,您为设备使用了错误的驱动程序或物理设备出现故障,否则通常不会遇到问题。


5

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

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

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

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

2

内核中的某些代码路径被标记为不间断的,这主要是因为代码必须遵守严格的时序(以响应设备)或因为它在做不允许干扰的事情。在Linux的情况下,前者中的大多数已被推到独立的内核中,而后者则大部分被根除(我怀疑主要是在当前多CPU机器的压力下)。也就是说,已经有一段时间了,我还没有看到不间断睡眠的过程。


3
尝试读取划痕的CD。
约书亚

1
或使用sshfs进行安装,然后拉动网络电缆。即使当下,当底层的媒体/存储功能发挥作用时,也确实会发生不间断的睡眠。而且通常要处理的是流血的痛苦。
Nubarke '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.