I/O 调用上下文中什么是“慢速”设备?

问题描述 投票:0回答:1

在 man 7 信号中,它描述了有关 SA_RESTART 标志何时生效的某些约束。

“慢速”设备上的 read(2)、readv(2)、write(2)、writev(2) 和 ioctl(2) 调用。 “慢速”设备是 I/O 调用可能无限期阻塞的设备,例如终端、管道或套接字。 如果慢速设备上的 I/O 调用在被信号处理程序中断时已经传输了一些数据,则该调用将返回成功状态(通常是传输的字节数)。 请注意,根据此定义,(本地)磁盘并不是慢速设备。磁盘设备上的 I/O 操作不会被信号中断。

我的问题是

  1. 根据手册,终端设备、管道和套接字是慢速设备,而磁盘不是。网络设备(eth、wlan 等)、GPU 或 ASIC 加速器怎么样?我很难根据“不定时间”这个属性来判断。
  2. 在哪个内核文件或函数中完成此操作(即内核是否区分慢速和非慢速设备?当内核被信号等中断时,内核如何重新启动操作)?也许我可以去那里了解更多细节。

谢谢。

c linux linux-kernel system-calls
1个回答
0
投票

答案比手册更容易理解。

“慢”设备是设备驱动程序可以被信号中断的设备。

大多数设备驱动程序都可以被中断。块驱动程序不能。

对于您列出的其他设备,网络设备是字符设备,并且必须是可中断的。 (数据包驱动程序只能在数据包之间中断,但这并不真正相关,因为您无法通过线路接收半个数据包......)至于 GPU 或 ASIC 加速器,我必须从字面上打开驱动程序并检查,但如果我不得不猜测,我会猜测它们不是慢速设备,因为有人必须费心去实现中断功能,但没有这样做,因为这些设备比磁盘更快。

不可中断的块设备在等待有划痕的 CD-ROM 时可能会很痛苦,但这与理论上可以永远等待的设备无法相比。

© www.soinside.com 2019 - 2024. All rights reserved.