据我所知,到目前为止,Linux CFS的调度实体是由RB树内的虚拟运行时(vruntime
)索引的。
调度程序通过调用vruntime
函数定期更新此update_curr
,这基本上会增加当前正在运行的实体的vruntime值。
我不明白的是调度程序如何保持RB树始终排序良好。 update_curr
函数增加了vruntime
的值,但似乎没有检查实体是否应该移回RB树的右侧。哪个功能执行此检查?
答案 0 :(得分:0)
update_curr不仅会增加vruntime
的值,还会调用account_cfs_rq_runtime
,而resched_curr
最终会调用{{1}}来修复RB树(最终)
答案 1 :(得分:0)
虽然艾哈迈德关于update_curr
是正确的,但我仍然感到困惑的是,在更新vruntime和最终调用resched_curr
之间树可能不平衡。事实上,事实证明,当前安排的任务不是树的一部分。
从调用set_next_entity(cfs_rq_of(se), se);
时调用的pick_next_task_fair
中的树中删除它。因此,树始终是平衡的,执行平衡的唯一功能是enqueue_entity
和dequeue_entity