Linux cgroup 源码解读(一)

Linux cgroup 几个重要的数据结构:

一个/多个cgroup_control子系统,组成一个树形结构。

1. cgroup_root:cgroup(树)的根,初始所有系统都挂载在全局默认cgrp_dfl_root上。一个cgroup_root可以挂载多个子系统。一个只系统,只能挂载在一个cgroup_root上。

2. cgroup:树子节点。每在一个cgroup_root下创建一个目录,就会创建一个cgroup。

3. cgroup_subsys_state:指定cgroup的子系统状态。因为无法确定一棵树所挂载的子系统,所以cgroup包含一个所有子系统状态的数组。

一个进程,一定是挂载多个子系统下,也即挂载多个不同的树的cgroup下。所以为了精简task结构体的大小,单独出一个css_set来表示。所以,css_set 包含一个系统当前所挂载的cgroup链表。

多个进程,可以在同一个css_set中,当把一个进程加入/移除某个cgroup,先在已有css_set查找是否已经存在这样的css_set,为了方便的查找是否已存在相应css_set,css_set还包括一个所有子系统状态的列表,只有所有子系统状态一样,再进行进一步查找,确保对应的cgroup也一样。

每次mount一个子/多个系统,就会创建一个cgroup_root,系统就会遍历所有css_set,更新所有css_set的cgroup链表。

 

cgroup初始化流程如下图:

Linux cgroup 源码解读(一)_第1张图片

 

 

 

你可能感兴趣的:(Linux内核,cgroup,源码)