/* file: kernel/sched/sched.h */
struct task_group {
/* 以下字段的初始化在函数alloc_fair_sched_group()中,位于文件fair.c。在cgroup
* 初始化时调用 */
#ifdef CONFIG_FAIR_GROUP_SCHED
/* schedulable entities of this group on each CPU */
/* se[i] 表示该 task_group 中在第 i 个 CPU 上的 sched_entity, 该 se
* 代表的是一个任务组,即 sched_entity->my_q 指向该结构体的 cfs_rq[cpu] */
struct sched_entity **se;
/* cfs_rq[i] 表示该 task_group 中在第 i 个 CPU 上的 cfs_rq. 在函数
* alloc_fair_sched_group 中初始化 */
struct cfs_rq **cfs_rq;
/* 该 task_group 的 cpu.shares, 表示该 task_group 的权重 */
unsigned long shares;
#endif
struct rcu_head rcu;
struct list_head list;
struct task_group *parent;
struct list_head siblings;
struct list_head children;
struct cfs_bandwidth cfs_bandwidth;
};
这里我们暂时只关心两个字段:
struct sched_entity **se
struct cfs_rq **cfs_rq
通过前文我们知道,系统将一个任务组分布到各个CPU上时,同一个CPU上所分配到的所有任务会形成一个子组(sub-group)并通过一个cfsrq来管理;而CPU本身的cfsrq中会有一个代表任务组 se 指向该子组; task_group 的这两个字段分别用来保存这两方面的内容:se[i]用来保存CPU[i]队列上代表任务组的se,而cfsrq[i]用来保存CPU[i]所分配到的任务子组,其中 i 表示CPU的索引下标。总体结构的示意图如下: