先看一下控制组在代码中的定义:
上述代码并不是cgroup在代码中原本的样子。作者对cgroup的定义进行了简化,删除了一些涉及细节的成员,调整了一些成员的位置。调整后的代码大致可以分为四部分:第一部分涉及cgroup的层级结构,包括三个成员:sibling、children、parent;第二部分涉及cgroup和名为cgroup的文件系统的关系,包括三个成员:files、dentry、root;第三部分涉及控制组子系统,成员为subsys;第四部分涉及cgroup和进程的关系,成员为cset_links。
1.控制组的层级结构
假设存在这样一棵“控制组树”。根节点有两个儿子,第一个儿子又有两个儿子。那么cgroup机构中相关成员的关系就如图21-2所示。
2.cgroup文件系统
内核控制组子系统创造了名为cgroup的伪文件系统。每个cgroup都和此文件系统中的一个目录相联系。结构cgroup中的成员dentry指向与之相关联的目录,成员files指向目录下的文件,成员root指向cgroup文件系统的根节点。
图21-2 cgroup层次结构
下面看一下结构cgroupfs_root:
结构中最重要的成员是sb和top_cgroup。sb指向文件系统的超级块,top_cgroup是一棵cgroup树的顶级节点。其他成员中,subsys_mask表示这个cgroup文件系统挂载中包含的控制组子系统,number_of_cgroups表示这个cgroup文件系统中包含的cgroup的数量。
控制组定义了一个新的文件系统,名字为cgroup:
下面看一个例子
上述命令挂载了两个cgroup文件系统,一个使用CPU子系统,一个使用memory子系统内核中的数据结构如图21-3所示。
图21-3 cgroup文件系统例子
3.控制组的子系统
控制组子系统相关的数据结构为
结构cgroup_subsys_state是一个“中介”,介于结构cgroup和结构cgroup_subsys之间。结构cgroup_subsys的成员分两大类,一类是一系列函数指针,另一类关联cgroup文件——cftype实例。
不同的控制组子系统关联的文件各有不同,还是看CPU子系统的例子:
目前Linux内核(3.14-rc4)中包含下面这些cgroup子系统:
●cpuset
●debug(www.xing528.com)
●cpu_cgroup
●cpuacct
●mem_cgroup
●devices
●freezer
●net_cls
●blkio
●perf
●net_prio
●hugetlb
4.控制组与进程的关系
控制组和进程的关系是多对多映射。一个控制组中可以有多个进程,一个进程也可以加入多个控制组。
假设有3个进程,4个控制组,进程1用到控制组1和3,进程2用到控制组2和4,进程3用到控制组2和4。从进程的角度看,如图21-4所示。从控制组的角度看,如图21-5所示。
图21-4 控制组和进程关系(从进程的角度看)
图21-5 控制组和进程关系(从控制组的角度看)
为了表达这种多对多映射关系,控制组系统引入了一个数据结构css_set:
在进程控制结构task_struct中,引入了:
在结构cgroup中有:
结构cgroup的成员cset_links和另一个结构cgrp_cset_link关联:
联系在一起,还是上面那个例子,内核中的数据结构如图21-6所示.
图21-6 控制组和进程关系(联系在一起)
为了画图方便,作者将cgroup2和cgroup3的位置互换了一下.
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。