哪个内核函数管理平衡 linux CFS 的 RB 树?
Which kernel function manages balancing the RB-tree of the linux CFS?
根据我目前对 Linux CFS 的了解,调度实体由 RB 树中的虚拟运行时 (vruntime
) 索引。
调度程序通过调用 update_curr
函数定期更新此 vruntime
,这基本上增加了当前 运行 实体的 vruntime 值。
我不明白的是调度程序如何使 RB 树始终井井有条。 update_curr
函数增加了 vruntime
的值,但似乎没有检查实体是否应该移回 RB-tree 的右侧。哪个函数执行此检查?
update_curr 不仅会增加 vruntime
的值,它还会调用 account_cfs_rq_runtime
,后者最终会调用 resched_curr
,这将修复 RB-tree (最终)
虽然 Ahmed 关于 update_curr
的说法是正确的,但我仍然对树在更新 vruntime 和最终调用 resched_curr
之间可能不平衡这一事实感到困惑。事实上,事实证明当前调度的任务 不是树的一部分 .
它从 set_next_entity(cfs_rq_of(se), se);
中的树中删除,在调用 pick_next_task_fair
时调用。所以树总是平衡的,执行平衡的唯一函数是 enqueue_entity
和 dequeue_entity
根据我目前对 Linux CFS 的了解,调度实体由 RB 树中的虚拟运行时 (vruntime
) 索引。
调度程序通过调用 update_curr
函数定期更新此 vruntime
,这基本上增加了当前 运行 实体的 vruntime 值。
我不明白的是调度程序如何使 RB 树始终井井有条。 update_curr
函数增加了 vruntime
的值,但似乎没有检查实体是否应该移回 RB-tree 的右侧。哪个函数执行此检查?
update_curr 不仅会增加 vruntime
的值,它还会调用 account_cfs_rq_runtime
,后者最终会调用 resched_curr
,这将修复 RB-tree (最终)
虽然 Ahmed 关于 update_curr
的说法是正确的,但我仍然对树在更新 vruntime 和最终调用 resched_curr
之间可能不平衡这一事实感到困惑。事实上,事实证明当前调度的任务 不是树的一部分 .
它从 set_next_entity(cfs_rq_of(se), se);
中的树中删除,在调用 pick_next_task_fair
时调用。所以树总是平衡的,执行平衡的唯一函数是 enqueue_entity
和 dequeue_entity