关于进程的不可中断状态(Uninterruptible Sleep)的疑惑?

2021-01-06 21:24:47 +08:00
 aiqier

在网上搜关于不可中断状态( Uninterruptible Sleep )的博客都是“不可中断状态在等 IO”。 首先 io 有很多种,常见的有网络 io 和文件 io,首先网络 io 我理解分阻塞式和非阻塞式,阻塞式 io 在 io 没好的时候直接就变成 TASK_INTERRUPTIBLE (信号可中断的睡眠),非阻塞式 io 在 io 没好的时候直接就继续往下执行是 TASK_RUNNING ( 进程运行状态)。那网络 io 啥时候才会是“不可中断状态在等待 IO”?

而且文件 io 都不分阻塞不阻塞,而且我印象中 io 操作都是交给 dma 处理了,那到底啥时候文件 io 才会产生不可中断状态( Uninterruptible Sleep )?

我理解不可中断 io 应该时间很短啊,如果等磁盘 io 就是不可中断状态,那不是时间很长。

1607 次点击
所在节点    程序员
2 条回复
codehz
2021-01-06 21:44:40 +08:00
阻塞调用不是一直禁止中断,只有操作已经开始进行了之后才会变成不可中断的状态...
也就是如果大量程序访问磁盘,但是由于你的操作被排队了,在实际进行之前还是可以 EINTR 的。。。
如果卡在这个状态,多半是由于硬件故障,驱动故障,或者 fuse 的死锁(
aiqier
2021-01-07 10:28:50 +08:00
@codehz 那等待 io 的不可中断状态是指“等 io 开始执行到 io 执行完成”么?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/742327

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX