linux源碼分析(四)-start_kernel-cgroup

2016-10-27 10:51 by 軒脈刃, 77 閱讀, 0 評論, 收藏編輯

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

cgroup_init_early();

聊這個函數(shù)就需要先了解cgroup。

cgroup概念

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

我們把每種資源叫做子系統(tǒng),比如CPU子系統(tǒng),內(nèi)存子系統(tǒng)。為什么叫做子系統(tǒng)呢,因為它是從整個操作系統(tǒng)的資源衍生出來的。然后我們創(chuàng)建一種虛擬的節(jié)點,叫做cgroup,然后這個虛擬節(jié)點可以擴展,以樹形的結(jié)構(gòu),有root節(jié)點,和子節(jié)點。這個父節(jié)點和各個子節(jié)點就形成了層級(hierarchiy)。每個層級都可以附帶繼承一個或者多個子系統(tǒng),就意味著,我們把資源按照分割到多個層級系統(tǒng)中,層級系統(tǒng)中的每個節(jié)點對這個資源的占比各有不同。

下面我們想法子把進程分組,進程分組的邏輯叫做css_set。這里的css是cgroup_subsys_state的縮寫。所以css_set和進程的關(guān)系是一對多的關(guān)系。另外,在cgroup眼中,進程請不要叫做進程,叫做task。這個可能是為了和內(nèi)核中進程的名詞區(qū)分開吧。

進程分組css_set,不同層級中的節(jié)點cgroup也都有了。那么,就要把節(jié)點cgroup和層級進行關(guān)聯(lián),和數(shù)據(jù)庫中關(guān)系表一樣。這個事一個多對多的關(guān)系。為什么呢?首先,一個節(jié)點可以隸屬于多個css_set,這就代表這這批css_set中的進程都擁有這個cgroup所代表的資源。其次,一個css_set需要多個cgroup。因為一個層級的cgroup只代表一種或者幾種資源,而一般進程是需要多種資源的集合體。

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

task_struct

首先先看進程的結(jié)構(gòu),里面和cgroup有關(guān)的是

#ifdef CONFIG_CGROUPS // 設(shè)置這個進程屬于哪個css_set struct css_set __rcu *cgroups; // cg_list是用于將所有同屬于一個css_set的task連成一起 struct list_head cg_list; 
        		

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負責(zé)任的教育,學(xué)習(xí)改變命運,軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式