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;
延伸閱讀
- ssh框架
2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍牙鎖
2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe
2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標分割】
2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞
2017-07-26
- 從棧不平衡問題 理解 calling convention
2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明
2017-07-26
- Swift實現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解
2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應(yīng)用分析
2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二)
2017-07-26
學(xué)習(xí)是年輕人改變自己的最好方式