天天看點

linux源碼分析(四)-start_kernel-cgroupcgroup概念task_structcss_setcgroup_subsys_state 和 cgroup_subsyscgroupcgroup_init_early

前置:這裡使用的linux版本是4.8,x86體系。

聊這個函數就需要先了解cgroup。

這個函數就是初始化cgroup所需要的參數的。cgroup最初是在2006年由google的一名工程師提出的,目的是把一些共同目标的程序放在一個組裡面,而這個組裡面的程序能共享指定數額的資源。而後就有了cgroup這個概念了。

我們把每種資源叫做子系統,比如CPU子系統,記憶體子系統。為什麼叫做子系統呢,因為它是從整個作業系統的資源衍生出來的。然後我們建立一種虛拟的節點,叫做cgroup,然後這個虛拟節點可以擴充,以樹形的結構,有root節點,和子節點。這個父節點和各個子節點就形成了層級(hierarchiy)。每個層級都可以附帶繼承一個或者多個子系統,就意味着,我們把資源按照分割到多個層級系統中,層級系統中的每個節點對這個資源的占比各有不同。

下面我們想法子把程序分組,程序分組的邏輯叫做css_set。這裡的css是cgroup_subsys_state的縮寫。是以css_set和程序的關系是一對多的關系。另外,在cgroup眼中,程序請不要叫做程序,叫做task。這個可能是為了和核心中程序的名詞區分開吧。

程序分組css_set,不同層級中的節點cgroup也都有了。那麼,就要把節點cgroup和層級進行關聯,和資料庫中關系表一樣。這個事一個多對多的關系。為什麼呢?首先,一個節點可以隸屬于多個css_set,這就代表這這批css_set中的程序都擁有這個cgroup所代表的資源。其次,一個css_set需要多個cgroup。因為一個層級的cgroup隻代表一種或者幾種資源,而一般程序是需要多種資源的集合體。

美團的這個圖檔描寫的非常清晰,一看就了解了:

linux源碼分析(四)-start_kernel-cgroupcgroup概念task_structcss_setcgroup_subsys_state 和 cgroup_subsyscgroupcgroup_init_early

首先先看程序的結構,裡面和cgroup有關的是

我們會在代碼中經常見到list_head。它其實就是表示,這個在連結清單中存在。

它的結構很簡單,就能把某種相同性質的結構連成一個連結清單,根據這個連結清單我能前後找全整個連結清單或者頭部節點等。

結構體在include/linux/cgroup-defs.h中。

這裡的rcu_head就存儲了對這個結構上rcu鎖所需要的回調資訊。

回到css_set,其實最重要的就是cgroup_subsys_state subsys[]數組這個結構。

這個結構最重要的就是存儲的程序與特定子系統相關的資訊。通過它,可以将task_struct和cgroup連接配接起來了:task_struct->css_set->cgroup_subsys_state->cgroup

cgroup_subsys結構體在include/linux/cgroup-defs.h裡面

這裡特别說一下cftype。它是cgroup_filesystem_type的縮寫。這個要從我們的linux虛拟檔案系統說起(VFS)。VFS封裝了标準檔案的所有系統調用。那麼我們使用cgroup,也抽象出了一個檔案系統,自然也需要實作這個VFS。實作這個VFS就是使用這個cftype結構。

cgroup結構也在相同檔案,但是cgroup_root和子節點cgroup是使用兩個不同結構表示的。

還有一個結構是cgroup_root

回到這個函數

這個函數初始化的cgroup_root是一個全局的變量。定義在kernel/cgroup.c中。

了解了cgroup結構,裡面的設定就可以基本看懂了。

本文轉自軒脈刃部落格園部落格,原文連結:http://www.cnblogs.com/yjf512/p/6003094.html,如需轉載請自行聯系原作者