Back to Blog

Linux中TASK_RUNNING状态的进程链表

#linux#struct#list
  • tasks.prevtasks.next 分别指向前后两个 task_struct 元素,实现 双向链表
  • 当进程进入 TASK_RUNNING 状态时,会被插入到对应优先级的 queue 链表中;离开该状态(例如阻塞或退出)时,则会从链表中摘除。

这种设计保证了 同一优先级内部的进程可以在 O(1) 时间内完成插入、删除,而跨优先级的调度决策则通过位图一次性完成。

5. 调度流程概览

下面给出一个简化的调度流程示意,帮助读者理清 O(1) 调度器的核心步骤:

  1. 检查位图bitmap 中最高位 1 对应的索引即为当前最高优先级 prio
  2. 定位链表queue[prio] 为该优先级的链表头。
  3. 遍历链表:从链表头取出第一个 task_struct(通常是最早加入的进程),即为 next 要运行的进程。
  4. 切换上下文:内核完成 context_switch(prev, next),并更新 nr_active、位图等状态。
  5. 重新插入:如果 next 仍保持 TASK_RUNNING(例如时间片未耗尽),则在调度结束后重新插入到同一优先级链表的尾部,以实现轮转(Round‑Robin)策略。

6. 常见调试场景

6.1 查看单核运行队列