先看设计准则:
-
一个层级(hierarchy)就是一棵数,它可以包含一个资源子系统(subsys)或者多个资源子系统(subsys);
-
一个资源子系统(subsys)只能存在一个层级(hierarchy);
-
一个层级(hierarchy)中不同的cgroup之间的task都是互斥的,也就是说一个task只能存在于一个层级(hierarchy)中唯一的一个cgroup;
-
一个task可以同时存在于多个层级(hierarchy)中;即一个task对应于多个cgroup
-
一个cgroup可以对应多个css_set;
-
一个css_set可以对应多个cgroup;
- 一个task只对应唯一一个css_set。
下面的结构可以说明这种寻找关系:
方法1:首先从task.cgroups找到css_set结构,从css_set结构中找到css_set结构对应的所有的cgroup,从中找出属于指定层级(hierarchy)的cgroup(每个层级都有一个唯一的top
cgroup通过对比cgroup cgroup来判断是否属于该层级)。
方法2:首先从task.cgroups找到css_set结构,从css_set结构的struct
cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]元素中找到每个子系统状态的结构struct
cgroup_subsys_state变量,其中有个指针,指向该子系统对应的cgroup。
问题2:如何通过一个cgroup找到它目录下所有的task?
cgroup通过cg_cgroup_link连接了多个css_set结构变量,每个结构变量都有一个tasks的链表,上面是该css_set对应的所有tasks。如图所示: