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初始化流程如下圖: