根据我目前对 Linux CFS 的了解,调度实体由它们vruntime
在 RB-tree 中的虚拟运行时 ( ) 进行索引。
vruntime
调度程序通过调用update_curr
基本上增加当前运行实体的 vruntime 值的函数来定期更新它。
我不明白的是调度程序如何使 RB-tree 始终井井有条。该update_curr
函数增加了 的值,vruntime
但似乎并未检查实体是否应移回 RB-tree 的右侧。哪个函数执行此检查?
根据我目前对 Linux CFS 的了解,调度实体由它们vruntime
在 RB-tree 中的虚拟运行时 ( ) 进行索引。
vruntime
调度程序通过调用update_curr
基本上增加当前运行实体的 vruntime 值的函数来定期更新它。
我不明白的是调度程序如何使 RB-tree 始终井井有条。该update_curr
函数增加了 的值,vruntime
但似乎并未检查实体是否应移回 RB-tree 的右侧。哪个函数执行此检查?
虽然 Ahmed 是对的update_curr
,但我仍然对树在更新 vruntime 和最终调用resched_curr
. 事实上,事实证明当前计划的任务不是树的一部分。
它从set_next_entity(cfs_rq_of(se), se);
调用时pick_next_task_fair
被调用的树中删除。所以树总是平衡的,唯一执行平衡的函数是enqueue_entity
和dequeue_entity
update_curr 不仅增加了vruntime
它的值,还调用account_cfs_rq_runtime
了最终resched_curr
会修复 RB-tree(最终)的调用