【问题标题】:How does the CFS Scheduler select which task group/cgroup to run next?CFS 调度程序如何选择接下来要运行的任务组/cgroup?
【发布时间】:2021-12-04 08:35:15
【问题描述】:

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

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

只要当前调度实体是 CFS RQ(最左边节点具有最小 vruntime 的 RB 树),pick_next_task_fair() 函数就会一直选择最左边的调度实体。

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

对此的任何见解将不胜感激!提前致谢!

【问题讨论】:

    标签: linux-kernel scheduler cgroups


    【解决方案1】:

    但是,您究竟是如何在 RB 树上放置任务组的呢?

    以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);
    }
    

    是根据里面任务的min_vruntime做的吗?是 它是根据分配给该任务组的 CPU 份额完成的吗?

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

    【讨论】:

    • 感谢您的回复!当我问“你将如何插入任务组”时,我错误地表达了我的问题。我的意思是,一个任务组如何优先于另一个任务组。
    • 我已经编辑了这个问题以反映:)
    猜你喜欢
    • 2012-06-05
    • 2018-04-28
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 2017-09-23
    • 2021-04-16
    相关资源
    最近更新 更多