CFS调度器如何选择下一个待运行的task group/cgroup?
CFS任务组在RB树上的排序规则说明
- 核心排序逻辑:CFS红黑树的排序key始终是调度实体(sched_entity)自身的vruntime值,无论该调度实体是普通进程还是任务组的组调度实体,同一父层级下的所有调度实体都按照vruntime从小到大的顺序挂载到红黑树上。
- 组调度的层级执行逻辑:CFS组调度采用分层设计,每个CPU的根CFS运行队列挂载顶层调度实体(可以是普通进程,也可以是组调度实体);每个任务组自身也持有独立的CFS运行队列,用于挂载其下属的子调度实体(子任务组或归属该组的普通进程)。
pick_next_task_fair()执行时会从顶层队列开始,每次取出当前队列红黑树最左侧(vruntime最小)的调度实体,如果取出的是组调度实体,则进入该组的内部运行队列,重复取最左实体的逻辑,直到取出普通进程执行为止,和公开资料的描述一致。 - 常见疑问澄清:
- 排序不会直接使用任务组内部的min_vruntime作为key:任务组内部的min_vruntime是组内运行队列的基准值,作用是对齐组内所有子调度实体的vruntime基准,避免新加入组的实体vruntime偏差过大,不直接参与父层级红黑树的排序。
- 排序不会直接使用CPU shares作为key:shares的作用是决定调度实体的CPU时间分配权重,它只会影响vruntime的增长速率:shares越大的调度实体,相同实际运行时间下vruntime增长越慢,间接影响其在红黑树上的位置,最终保证不同调度实体拿到的CPU时间和自身shares占总shares的比例匹配。
内容的提问来源于stack exchange,提问作者Pranav Bhatt
相关产品推荐
相关产品推荐

