在 Linux 内核中,停驻线程是什么意思?是指处于TASK_PARKED
“停驻”状态的线程吗?
TASK_INTERRUPTIBLE
此状态与和有何不同TASK_UNINTERRUPTIBLE
?
线程可以从哪种状态更快地被唤醒?一般来说,以及在特定情况下,如果用于等待:kthread_parkme / kthread_unpark
而不是[s]wait_event_... / [s]wake_up_...]
?
我知道 waitqueues 支持多个等待者,但我只对单个睡眠者/唤醒者对感兴趣。
CPU 暂停是一项省电功能,允许将闲置的 CPU 核心下线,从而停止消耗电量。当 CPU 再次有使用需求时,CPU 就会恢复暂停状态。
在 CPU 暂停之前,CPU 上的所有线程必须先与 CPU 解除绑定或暂停。如果要暂停 CPU,则其他 CPU 可能处于可用且空闲状态,因此可以将正在运行的线程从 CPU 核心解除绑定并移至其他核心。但是,如果某个线程也处于空闲状态(可能正在等待 I/O 完成或超时,或者内核线程正在等待执行任务),则无需执行昂贵的解除绑定线程并将其移至其他核心的操作,只需将其也暂停即可。
当内核停放一个线程时,它会唤醒该线程并告诉它自己停放。内核线程有机会执行任何它想要的清理操作,包括释放可能导致死锁的资源,然后调用 parkme 来处理一些竞争条件,并将线程标记为已停放。一旦核心上的所有线程都迁移或停放完毕,内核就可以停放 CPU 了。
据推测,取消暂停一个线程(以及它所在的 CPU)会比等待在繁忙的 CPU 上进行调度或将其绑定到另一个已经空闲的 CPU(它可能已经自行暂停了)要快。
请注意,一些特殊的内核线程专用于它们所绑定的核心,因此总是处于停放状态而不是解除绑定。