Linux内核调试 - Hung_task机制分析上
TASK_UNINTERRUPTIBLE
- 在一个任务的整个生命周期中,它可能会在多种状态之间切换,比如当它正在运行时会处于
TASK-RUNNING
状态,又比如当它在等待mutex
锁时会处于TASK_UNINTERRUPTIBLE
。 TASK_UNINTERRUPTIBLE
状态为不可中断的睡眠状态,即所谓的D状态,当一个任务处于D状态时,该任务不占用CPU,但是该任务也不能接受响应信号,所以我们不能kill一个处于D状态的任务,只能等其他任务唤醒它才能继续运行。- 任务处于D状态的常见场景:
- 任务申请IO读写,等待IO操作完成,将内存高速缓存中数据回写到磁盘过长。
- 任务调用
mutex_lock
、down
等待访问某个共享资源; - 任务调用
wait_event
、io_wait_event
、ait_for_completion
等待某个事件发生; - 内核中其他设置任务状态为
TASK_UNTERRUPTIBLE
的场景;
- 正常情况下,一个任务处于D状态的时间不会太久ÿ