在网上搜关于不可中断状态( 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 就是不可中断状态,那不是时间很长。
1
codehz 2021-01-06 21:44:40 +08:00 1
阻塞调用不是一直禁止中断,只有操作已经开始进行了之后才会变成不可中断的状态...
也就是如果大量程序访问磁盘,但是由于你的操作被排队了,在实际进行之前还是可以 EINTR 的。。。 如果卡在这个状态,多半是由于硬件故障,驱动故障,或者 fuse 的死锁( |