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

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

时间:2026-01-27 理论教育 南栀 版权反馈
【摘要】:图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在代码中原本的样子。作者对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(https://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的位置互换了一下.

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

我要反馈