首页 理论教育 代码分析与cgroup层次结构深入剖析

代码分析与cgroup层次结构深入剖析

时间:2023-11-22 理论教育 版权反馈
【摘要】:图21-2 cgroup层次结构下面看一下结构cgroupfs_root:结构中最重要的成员是sb和top_cgroup。图21-3 cgroup文件系统例子3.控制组的子系统控制组子系统相关的数据结构为结构cgroup_subsys_state是一个“中介”,介于结构cgroup和结构cgroup_subsys之间。假设有3个进程,4个控制组,进程1用到控制组1和3,进程2用到控制组2和4,进程3用到控制组2和4。

代码分析与cgroup层次结构深入剖析

先看一下控制组在代码中的定义:

978-7-111-54905-5-Part06-64.jpg

上述代码并不是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文件系统的根节点。

978-7-111-54905-5-Part06-65.jpg

图21-2 cgroup层次结构

下面看一下结构cgroupfs_root:

978-7-111-54905-5-Part06-66.jpg

结构中最重要的成员是sb和top_cgroup。sb指向文件系统的超级块,top_cgroup是一棵cgroup树的顶级节点。其他成员中,subsys_mask表示这个cgroup文件系统挂载中包含的控制组子系统,number_of_cgroups表示这个cgroup文件系统中包含的cgroup的数量。

控制组定义了一个新的文件系统,名字为cgroup:

978-7-111-54905-5-Part06-67.jpg

下面看一个例子

978-7-111-54905-5-Part06-68.jpg

上述命令挂载了两个cgroup文件系统,一个使用CPU子系统,一个使用memory子系统内核中的数据结构如图21-3所示。

978-7-111-54905-5-Part06-69.jpg

图21-3 cgroup文件系统例子

3.控制组的子系统

控制组子系统相关的数据结构为

978-7-111-54905-5-Part06-70.jpg

978-7-111-54905-5-Part06-71.jpg

结构cgroup_subsys_state是一个“中介”,介于结构cgroup和结构cgroup_subsys之间。结构cgroup_subsys的成员分两大类,一类是一系列函数指针,另一类关联cgroup文件——cftype实例。

不同的控制组子系统关联的文件各有不同,还是看CPU子系统的例子:

978-7-111-54905-5-Part06-72.jpg

978-7-111-54905-5-Part06-73.jpg

目前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所示。

978-7-111-54905-5-Part06-74.jpg

图21-4 控制组和进程关系(从进程的角度看)

978-7-111-54905-5-Part06-75.jpg

图21-5 控制组和进程关系(从控制组的角度看)

为了表达这种多对多映射关系,控制组系统引入了一个数据结构css_set:

978-7-111-54905-5-Part06-76.jpg

在进程控制结构task_struct中,引入了:

978-7-111-54905-5-Part06-77.jpg

在结构cgroup中有:

978-7-111-54905-5-Part06-78.jpg

结构cgroup的成员cset_links和另一个结构cgrp_cset_link关联:

978-7-111-54905-5-Part06-79.jpg

联系在一起,还是上面那个例子,内核中的数据结构如图21-6所示.

978-7-111-54905-5-Part06-80.jpg

图21-6 控制组和进程关系(联系在一起)

为了画图方便,作者将cgroup2和cgroup3的位置互换了一下.

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈