freezer子系統用于挂起和恢複cgroup中的程序。freezer有一個控制檔案:freezer.state,将FROZEN寫入該檔案,
可以将cgroup中的程序挂起,将THAWED寫入該檔案,可以将已挂起的程序恢複。通過周遊cgroup中的程序,對其freeze或者wake_up。
freeze操作通過freeze架構實作,設定程序的TIF_SIGPENDING函數(僞信号),喚醒程序,然後程序在傳回使用者态時,信号處理入
口get_signal_to_deliver中通過try_to_freeze當機程序。
關于子系統,Cgroups 層次結構與任務之間的關系,有以下幾條規則:
1. A single hierarchy can have one or more subsystems attached to it.
一個層次結構可以關聯一個或多個子系統。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuETZsVnctcUTS9CXxEzLcJTMwIzLcNHZh9GbwV3Lc12bj5CcwFWYul2cuI3b0NnLzNXZyBHZy92dtIXZtxWZvw1LcpDc0RHaiojIsJye.png)
2. Any single subsystem cannot be attached to more than one hierarchy if one of those hierarchies has a different subsystem attached to it already.
任何單個子系統不可以被關聯到一個以上的層次結構,如果其中一個層次結構已經關系到一個不同的子系統。
3. A task cannot be a member of two different cgroup in the same hierarchy.
一個任務不能同時屬于同一個層次結構中的兩個 cgroup。
4. A forked task inherits the exact same cgroups as its parent task.
當 cgroups 中的一個任務 fork 出一個新任務時,新任務自動繼承其父任務的 cgroup 關系。但是,新任務與父任務之間是完全獨立的,新任務可以被移動到其他的 cgroups 。
Ns子系統
# mount -t cgroup none/mnt/cgroup/ -o ns
# ls -l /mnt/cgroup/
-r--r--r-- 1 root root 0 Jan 1 00:11 cgroup.procs
-rw-r--r-- 1 root root 0 Jan 1 00:11 notify_on_release
-rw-r--r-- 1 root root 0 Jan 1 00:11 release_agent
-rw-r--r-- 1 root root 0 Jan 1 00:11 tasks
ns 子系統提供了一個将程序分組到不同名稱空間的方法。在具體名稱空間中,程序可彼此互動,但會與在其它名稱空間中運作的程序隔絕。這些分開的名稱空間在用于作業系統級别的虛拟化時,也稱之為容器。
核心是利用cgroups ns子系統對程序做了一個自動分類,相同nsproxy(即所有Namespace都相同的程序)的程序在一個cgroup,一旦通過clone建立新的Namespace,就會在目前cgroup下建立一個新的cgroup。這樣以來,通過cgroup檔案系統,在挂載ns 子系統的目錄下,我們就可以清楚地看出Namespace的層次關系。同時操作一個程序加入或離開一個命名空間。