CFS Scheduler select 下一个 group/cgroup 到 运行 的任务是怎样的?

How does the CFS Scheduler select which task group/cgroup to run next?

This post 很好地总结了如何在每个任务的基础上完成调度,但它并没有真正涉及如何在 RB 树上对任务组进行排序。

我也找不到其他相关资源;他们都说了一些类似的话:

The pick_next_task_fair() function keeps picking the left most scheduling entity as long as the current scheduling entity is a CFS RQ (RB Tree with leftmost node having smallest vruntime).

但是 CFS 究竟如何在 RB 树上将一个任务组优先于另一个任务组?是根据里面任务的min_vruntime来完成的吗?是否根据分配给该任务组的 CPU 份额完成?

如有任何见解,我们将不胜感激!提前致谢!

But how exactly do you place a task group on the RB Tree?

以pick_next_task_fair()为例,任务组通过以下代码插入到RB Tree中。更具体地说,put_prev_entity().

if (prev != p) {
        struct sched_entity *pse = &prev->se;

        while (!(cfs_rq = is_same_group(se, pse))) {
                int se_depth = se->depth;
                int pse_depth = pse->depth;

                if (se_depth <= pse_depth) {
                        put_prev_entity(cfs_rq_of(pse), pse);
                        pse = parent_entity(pse);
                }
                if (se_depth >= pse_depth) {
                        set_next_entity(cfs_rq_of(se), se);
                        se = parent_entity(se);
                }
        }

        put_prev_entity(cfs_rq, pse);
        set_next_entity(cfs_rq, se);
}

Is it done on the basis of the min_vruntime of the tasks inside it? Is it done based on the CPU shares given to that task group?

不是分配给该任务组的全部 CPU 份额。只有一部分 1 分享。有关详细信息,请参阅 calc_group_shares() 和 update_curr()。