Linux中TASK_RUNNING状态的进程链表
#linux#struct#list
tasks.prev与tasks.next分别指向前后两个task_struct元素,实现 双向链表。- 当进程进入 TASK_RUNNING 状态时,会被插入到对应优先级的
queue链表中;离开该状态(例如阻塞或退出)时,则会从链表中摘除。
这种设计保证了 同一优先级内部的进程可以在 O(1) 时间内完成插入、删除,而跨优先级的调度决策则通过位图一次性完成。
5. 调度流程概览
下面给出一个简化的调度流程示意,帮助读者理清 O(1) 调度器的核心步骤:
- 检查位图:
bitmap中最高位 1 对应的索引即为当前最高优先级prio。 - 定位链表:
queue[prio]为该优先级的链表头。 - 遍历链表:从链表头取出第一个
task_struct(通常是最早加入的进程),即为 next 要运行的进程。 - 切换上下文:内核完成
context_switch(prev, next),并更新nr_active、位图等状态。 - 重新插入:如果
next仍保持 TASK_RUNNING(例如时间片未耗尽),则在调度结束后重新插入到同一优先级链表的尾部,以实现轮转(Round‑Robin)策略。