从这篇开始介绍cgroup的原理,这两篇文章很不错先放这里
http://blog.csdn.net/ustc_dylan/article/details/4030824
http://blog.csdn.net/ustc_dylan/article/details/4030831
/* The default css_set - used by init and its children prior to any
* hierarchies being mounted. It contains a pointer to the root state
* for each subsystem. Also used to anchor the list of css_sets. Not
* reference-counted, to improve performance when child cgroups
* haven't been created.
*/
static struct css_set init_css_set;
static struct cg_cgroup_link init_css_set_link;
系统所有的subsystem都在这里:
static struct cgroup_subsys *subsys[] = {
#include <linux/cgroup_subsys.h>
};
cgroup_init_early:初始化init_css_set, init_css_set_link这两个全局结构,设置init进程的cgroups指针,为init_css_set
cgroup_init:调用cgroup_init_subsys初始化subsys数组里所有剩下的的subsystem(没有在cgroup_init_early中初始化的subsys),为init_css_set设置hlist指向的hash list,最后调用register_filesystem注册一个类型为cgroup的伪文件系统,并创建/proc/cgroups。其中cgroup_init会调用cgroup_init_subsys
cgroup_init_subsys:对于每一个subsystem,都要添加到rootnode(系统最高的唯一cgroupfs_root),rootnode保存了一个subsys_list里面是所有subsystem的列表,这些group_subsys互相保存在cgroup_subsys->sibling的列表中。这里出现了一个struct cgroup dummytop,用来表示hierarchy最高层的cgroup。
进程启动时会调用如下三个函数,
cgroup_fork:该函数执行 child->cgroups = current->cgroups,即把父进程指向的css_set 赋值给子进程,同时增加该css_set 的引用计数。
cgroup_fork_callbacks:对于cgroup里的所有subsystem(cgroup_subsys),调用sys->fork(sys, task_struct *)
cgroup_post_fork:更新task_struct->cg_list
进程退出是会调用:
cgroup_exit:如果run_callbacks为1,对于每一个subsystem,调用sys->exit(sys, task_struct* ),把自己从 css_set 的task列表中删除,然后把原来的css_set 结构保存在cg中,把自己的 css_set 设为 init_css_set。最后调用 put_css_set_taskexit (cg),里面判断css_set的引用计数,如果为0就释放掉了。释放的同时,清理掉css_set_table哈希表,cg_cgroup_link里相应项,如果对应的cgroup已经没有进程了,设置一个标志位 CGRP_RELEASABLE
我们注意到了每个subsystem有个need_forkexit_callback标志位,如果cgroup_subsys->fork,cgroup_subsys->exit 任意一个函数指针不为空,该位被置上,因此每次进程fork或者exit的时候,都会调用subsystem相应的fork, exit函数。
另外还有一个dummytop,用于无主的cgroup,比如把某个子系统移除cgroup之后就会把其对应的cgroup更改为dummytop
cgroup的文件系统这里不多说了,请参考这篇文章 http://blog.csdn.net/ustc_dylan/article/details/4030824
其实cgroup的文件系统就是通过文件系统的inode, dentry, file操作函数提供了一个控制的接口,用于设置QoS控制参数,和把进程和cgroup关联起来。每个子系统都会通过cgropu文件系统来关联自己的接口,获取需要控制的进程,从而和cgroup机制完美对接。