假设
我的假设是我自己根据我的理解认为的事实:
- 处于 TASK_INTERRUPTIBLE 和 TASK_UNINTERRUPTIBLE 状态的任务都不是“可运行的”。因此,当调度程序选择下一个要运行的任务时,它们不会被考虑(参考 Linux 内核开发第 4 章)。
- TASK_UNINTERRUPTIBLE 与 TASK_INTERRUPTIBLE 的唯一区别在于 SIGTERM 等信号不会影响前者。
- 这意味着 TASK_UNINTERRUPTIBLE/TASK_INTERRUPTIBLE 根本不应该消耗 CPU 时间。
我看到人们谈论什么
- https://stackoverflow.com/questions/223644/what-is-an-uninterruptible-process
- https://superuser.com/questions/791840/how-can-a-process-in-interruptible-sleep-state-use-100-cpu
上面两个链接中的许多评论/答案都说:
- TASK_UNINTERRUPTIBLE 不受 SIGNAL(例如 SIGTERM)影响。
- 该任务必须运行才能完成,并且不应被中断,就像“快速”磁盘 I/O 的情况(与 tty 等“慢速”I/O 不同)。
只有一个答案(第二个链接)明确表示不可中断任务会消耗 CPU,因为“CPU 被卡住”,因为该任务不会受到信号的影响。
问题
- 不间断任务会消耗CPU吗?
- 如果确实如此,那就与我的假设相矛盾。我的哪个假设是错误的?
答案1
处于可中断或不可中断睡眠状态的任务首先是处于睡眠状态,因此正如您所说,它们不可运行,不会被调度,因此不会消耗 CPU。
SU 问题中的混乱可能源于这样一个事实:CPU 使用率测量(在top
其他地方)是基于时间间隔的,而进程状态是在特定时间点测量的。因此,从技术上讲,一个进程有可能被调度超过其最后一次测量间隔的 100%,因此看起来消耗了 100% 的 CPU top
(或者更多,如果它有多个调度线程),但仍然处于非top
检查其状态时处于可运行状态。