天天看點

子系統 Cgroups

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.

一個層次結構可以關聯一個或多個子系統。

子系統 Cgroups

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.

任何單個子系統不可以被關聯到一個以上的層次結構,如果其中一個層次結構已經關系到一個不同的子系統。

子系統 Cgroups

3. A task cannot be a member of two different cgroup in the same hierarchy.

一個任務不能同時屬于同一個層次結構中的兩個 cgroup。

子系統 Cgroups

4. A forked task inherits the exact same cgroups as its parent task.

當 cgroups 中的一個任務 fork 出一個新任務時,新任務自動繼承其父任務的 cgroup 關系。但是,新任務與父任務之間是完全獨立的,新任務可以被移動到其他的 cgroups 。

子系統 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的層次關系。同時操作一個程序加入或離開一個命名空間。