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()。
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()。