【问题标题】:Uninterruptable write in LinuxLinux 中的不间断写入
【发布时间】:2017-10-06 07:08:54
【问题描述】:

根据对这个问题的回答:Why doing I/O in Linux is uninterruptible? linux 上的 I/O 是不可中断的(在睡眠中不可中断)。但是,如果我启动一个进程,比如说文件上的一个大“dd”,并且在进程进行时我强制卸载文件系统(文件所在的位置),进程就会被杀死。理想情况下,它应该处于挂起状态,因为它正在睡觉并且是联合国。

【问题讨论】:

  • 不确定您(和引用的问题)所说的“不间断 I/O”是什么意思,但处理 大量 数据肯定会被信号中断。顺便说一句,您可以手动中断dd 进程(例如使用Ctrl+C),并且进程终止相对较快。
  • 我认为dd 不会使用单个文件操作——更可能是许多小文件操作。
  • @KevinBoone:实际上,dd 会调用 write,字节数为 bs,默认为 512
  • @Tsyvarev "uninterruptible I/O" 含义:你启动了一个 I/O 说读取操作(大)进程启动读取并进入睡眠状态,等待设备的响应,所以现在进程处于睡眠状态即使有任何信号也无法唤醒。因此不间断..
  • @rodrigo -- 确实如此。所以除非你设置了一个很大的值bs,否则dd命令可以被中断这一事实并不能说明读/写系统调用是否可以被中断,只是关于dd中的信号处理。

标签: linux process linux-kernel filesystems signals


【解决方案1】:

“不间断”适用于内核处理的低级读/写操作。在 C 编程中,这些大致对应于 C 标准库上的 read()write() 调用。实用程序可以中断并不能说明 I/O 操作是否可以中断,因为实用程序中的特定文件操作可能对应于许多低级 I/O 操作。

dd 的情况下,默认传输块大小为 512 字节,因此复制大文件可能包含许多 I/O 操作。 dd 可以在这些操作之间 中断。我希望这同样适用于大多数对文件进行操作的实用程序。如果您可以强制它们处理巨大的数据块(例如,在 dd 中为 bs= 指定千兆字节大小的参数),那么您可能会看到低级 I/O 操作是不可中断的。

【讨论】:

  • 同意你所说的@Kevin Boone,当我说 I/O 操作时,我指的是系统调用。很有可能在两个 I/O 之间发生“卸载”,因此它从未发生过睡觉并被信号杀死。我将尝试使用非常大的块大小的“dd”,看看如何对卸载做出反应。
猜你喜欢
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
相关资源
最近更新 更多