【发布时间】:2018-02-12 22:04:24
【问题描述】:
这背后的原理是什么?如果允许执行 I/O 的进程处理信号会产生什么不良后果?
【问题讨论】:
标签: linux process io linux-kernel sleep
这背后的原理是什么?如果允许执行 I/O 的进程处理信号会产生什么不良后果?
【问题讨论】:
标签: linux process io linux-kernel sleep
既然我已经阅读了 Maurice Bach 的《Unix 操作系统的设计》一书,让我自己来回答这个问题。
简而言之,让 I/O 不可中断是为了让 I/O 任务尽快完成,不受信号干扰。
我从书中获得的一些相关知识:
【讨论】:
根据Linux Developers Documentation,是为了防止数据丢失,避免硬件进入不一致状态。
想象一下如果read()(例如来自磁盘)是可中断的并且信号处理程序(除其他职责外)更改了读取缓冲区会发生什么。由于信号是异步的,读取结果将无法重现。如果写作被打断,也会出现类似的混乱。
【讨论】:
read(2) 是可中断的 见kernel.org/doc/man-pages/online/pages/man2/read.2.html(然后你得到errno==EINTR);但是,当文件系统操作正在进行时,进程会保持D 状态。