linux源碼分析(四)-start_kernel-cgroup
2016-10-27 10:51 by 軒脈刃, 77 閱讀, 0 評(píng)論, 收藏, 編輯前置:這里使用的linux版本是4.8,x86體系。
cgroup_init_early();
聊這個(gè)函數(shù)就需要先了解cgroup。
cgroup概念
這個(gè)函數(shù)就是初始化cgroup所需要的參數(shù)的。cgroup最初是在2006年由google的一名工程師提出的,目的是把一些共同目標(biāo)的進(jìn)程放在一個(gè)組里面,而這個(gè)組里面的進(jìn)程能共享指定數(shù)額的資源。而后就有了cgroup這個(gè)概念了。
我們把每種資源叫做子系統(tǒng),比如CPU子系統(tǒng),內(nèi)存子系統(tǒng)。為什么叫做子系統(tǒng)呢,因?yàn)樗菑恼麄€(gè)操作系統(tǒng)的資源衍生出來(lái)的。然后我們創(chuàng)建一種虛擬的節(jié)點(diǎn),叫做cgroup,然后這個(gè)虛擬節(jié)點(diǎn)可以擴(kuò)展,以樹(shù)形的結(jié)構(gòu),有root節(jié)點(diǎn),和子節(jié)點(diǎn)。這個(gè)父節(jié)點(diǎn)和各個(gè)子節(jié)點(diǎn)就形成了層級(jí)(hierarchiy)。每個(gè)層級(jí)都可以附帶繼承一個(gè)或者多個(gè)子系統(tǒng),就意味著,我們把資源按照分割到多個(gè)層級(jí)系統(tǒng)中,層級(jí)系統(tǒng)中的每個(gè)節(jié)點(diǎn)對(duì)這個(gè)資源的占比各有不同。
下面我們想法子把進(jìn)程分組,進(jìn)程分組的邏輯叫做css_set。這里的css是cgroup_subsys_state的縮寫(xiě)。所以css_set和進(jìn)程的關(guān)系是一對(duì)多的關(guān)系。另外,在cgroup眼中,進(jìn)程請(qǐng)不要叫做進(jìn)程,叫做task。這個(gè)可能是為了和內(nèi)核中進(jìn)程的名詞區(qū)分開(kāi)吧。
進(jìn)程分組css_set,不同層級(jí)中的節(jié)點(diǎn)cgroup也都有了。那么,就要把節(jié)點(diǎn)cgroup和層級(jí)進(jìn)行關(guān)聯(lián),和數(shù)據(jù)庫(kù)中關(guān)系表一樣。這個(gè)事一個(gè)多對(duì)多的關(guān)系。為什么呢?首先,一個(gè)節(jié)點(diǎn)可以隸屬于多個(gè)css_set,這就代表這這批css_set中的進(jìn)程都擁有這個(gè)cgroup所代表的資源。其次,一個(gè)css_set需要多個(gè)cgroup。因?yàn)橐粋€(gè)層級(jí)的cgroup只代表一種或者幾種資源,而一般進(jìn)程是需要多種資源的集合體。
美團(tuán)的這個(gè)圖片描寫(xiě)的非常清晰,一看就了解了:
task_struct
首先先看進(jìn)程的結(jié)構(gòu),里面和cgroup有關(guān)的是
#ifdef CONFIG_CGROUPS // 設(shè)置這個(gè)進(jìn)程屬于哪個(gè)css_set struct css_set __rcu *cgroups; // cg_list是用于將所有同屬于一個(gè)css_set的task連成一起 struct list_head cg_list;
網(wǎng)友評(píng)論