Cgroup框架分析
cgroups概念掃盲
關(guān)于cgroups本文主要分析的是cgroups整體框架,不涉及對各個子系統(tǒng)的介紹和cgroupsfs的介紹,在分析cgroup整體框架的時候,首先我們需要對cgroups中的一些概念有所深刻認(rèn)識,只有在這個基礎(chǔ)上,才能明白為何cgroups的框架是設(shè)計成這樣的,為了節(jié)約篇幅,更好突出cgroup框架這一內(nèi)容,所以我不打算花時間來描述cgroup的一些概念。關(guān)于這方面的內(nèi)容我推薦閱讀附錄A中提到的文章,如果你英文不好,你也可以參考下我總結(jié)的幾篇cgroup文章,從基本概念到用戶態(tài)的基本使用都所有涉及文章鏈接參考附錄B
cgroups框架分析
cgroups框架中涉及了大量的結(jié)構(gòu)體,并且嵌入了很多l(xiāng)ist_head以及hlist_node等數(shù)據(jù)結(jié)構(gòu),目的是將這些數(shù)據(jù)結(jié)構(gòu)鏈接在一起,無論從任何一個結(jié)構(gòu)體出發(fā)都可以很好的找到自己想要的目標(biāo)結(jié)構(gòu)體,因此內(nèi)核中也出現(xiàn)了大量的短小精悍的inline funtion,這些function基本只有一兩句話,核心的語句就是通過list_head或者h(yuǎn)list_node找到目標(biāo)鏈接的結(jié)構(gòu)體。內(nèi)核中更有甚者會給兩個概念上是多對多的這樣關(guān)系的結(jié)構(gòu)體專門抽象出一個單獨的結(jié)構(gòu)體嵌入list_head實現(xiàn)兩個結(jié)構(gòu)體的多對多關(guān)系,cgroup中就有這樣的例子。
cgroups中的結(jié)構(gòu)體概述
struct task_struct,這是進程描述符的結(jié)構(gòu)體,和cgroup相關(guān)的則是其中struct css_set *cgroup成員,以及struct list_head cg_list成員struct css_set這是個啥東東呢css的全稱為cgroup subsystem state,也就是cgroup子系統(tǒng)的狀態(tài),set很自然就是集合的意思了,所以css_set維護了一組子系統(tǒng)的狀態(tài)所以呢css_set中核心的成員就是struct cgroup_subsys_state[CGROUP_SUBSYS_COUNT],一個子系統(tǒng)對應(yīng)一個這樣的結(jié)構(gòu)體,好吧那就繼續(xù)分析下這個結(jié)構(gòu)體吧,struct cgroup_subsys_state對于這個結(jié)構(gòu)體來說,里面有這個子系統(tǒng)對應(yīng)的cgroup,這個子系統(tǒng)引用的次數(shù),一個子系統(tǒng)如果使用了,那么肯定是屬于一個cgroup的,所以這個結(jié)構(gòu)體中最核心的成員應(yīng)該是struct cgroup *cgroup,很顯然struct cgroup就是一個cgroup組,如果不知道什么是cgroup中組或者是層次的概念,請看附錄A或B中提到的文章,好了現(xiàn)在一個子系統(tǒng)對應(yīng)一個cgroup,那么現(xiàn)在來看看struct cgroup是個啥啥,struct cgroup 首先會指向一組子系統(tǒng),因為一個cgroup可以對應(yīng)多個子系統(tǒng),其次,一個cgroup應(yīng)該維護層次關(guān)系,應(yīng)該可以找到其兄弟cgroup,父cgroup等信息,所以cgroup中含有struct list_head children,struct list_head sibling還有struct cgroup cgroup,還應(yīng)該有個啥呢?cgroup的name,所以就有了*struct cgroup_name __rcu *name這個成員,還應(yīng)該有個指針指向cgroupfs文件系統(tǒng),因為創(chuàng)建一個cgroup會在對應(yīng)的cgroupfs文件系統(tǒng)中創(chuàng)建一系列的文件,所以就有了一個struct cgroupfs_root *root 成員,struct cgroup_name 就是一個char數(shù)組,加上一個鎖,這個部分核心成員應(yīng)該算是cgroupfs_root吧,好了到此為止吧,再往下分析我怕我收不住。總結(jié)一下就是結(jié)構(gòu)體中的成員以及結(jié)構(gòu)體之間的關(guān)于和cgroup的基本概念息息相關(guān),所以在掌握cgroup的基本概念的前提下去分析cgroup框架是必經(jīng)之路。cgroup框架還不僅僅是這些,下面會繼續(xù)挖掘cgroup中結(jié)構(gòu)體之間的深層次關(guān)系。
cgroups中結(jié)構(gòu)體之間的關(guān)系
從上面的這幅圖可以看出,通過task_struct可以找到一個css_set,這是一個子系統(tǒng)狀態(tài)的集合,里面有cgroup_subsys_state,所以,通過task_struct來找到這個進程附加在哪些子系統(tǒng)中,受到哪些子系統(tǒng)的限制,通過cgroup_subsys_state子系統(tǒng)狀態(tài)結(jié)構(gòu)體又可以找到這個子系統(tǒng)屬于哪個cgroup,所以通過css_set建立了task_struct和cgroup_subsys 以及task_struct和cgroup的一對多的關(guān)系。同時內(nèi)核為了方便查找css_set,將所有的css_set建立了一個hash table 通過子系統(tǒng)可以快速找到子系統(tǒng)對應(yīng)的狀態(tài),也就是cgroup_subsys_state,注意看下task_struct的cg_list成員,這個成員將所有具有相同css_set的進程連接起來,好吧,這一切都是為了快速查找,內(nèi)核可謂之用心良苦啊。
css_set和cgroup是什么樣的關(guān)系呢,內(nèi)核為了清晰的表達出這兩者的關(guān)系可謂之用心良苦,專門設(shè)計了一個結(jié)構(gòu)體來表現(xiàn)其多對多的關(guān)系cg_cgroup_link,一個css_set對應(yīng)多個子系統(tǒng),每個子系統(tǒng)都有其對應(yīng)的cgroup,所以一個css_set對應(yīng)多個cgroup,反之,一個cgroup可能包含多個子系統(tǒng),而多個子系統(tǒng)可能分開存在于多個css_set集合中,所以一個cgroup就對應(yīng)多個css_set了
好吧,到此為止內(nèi)核完美的呈現(xiàn)了這些數(shù)據(jù)結(jié)構(gòu)直接的關(guān)系。最后來張大集合。
這張是cgroup涉及到的一些 結(jié)構(gòu)體,以及這些結(jié)構(gòu)體之間的關(guān)系,可見關(guān)系還是很復(fù)雜的,其中cgroup_subsys很重要,這是一個抽象類,每一個子系統(tǒng)都會去實例化這樣的一個結(jié)構(gòu)體,然后實現(xiàn)其中的一些方法,比如附加子系統(tǒng),對子系統(tǒng)中的數(shù)據(jù)讀寫,等等一系列的操作,cgroupfs_root則是表示的是一個層次,很顯然這個結(jié)構(gòu)體應(yīng)該將所有層次連接起來,以及所有的子系統(tǒng)連接起來,所以你會看到圖中有roo_list和subsys_list兩個鏈表。到此為止整個cgroup的框架其實以及很清楚了。
總結(jié): cgroup總體框架的代碼不難,難的是這些結(jié)構(gòu)體的復(fù)雜關(guān)系。
附錄
附錄A
RedHat Resource Manager Document
附錄B
Cgroup基本入門
Cgroup基本使用
Cgroup使用進階
總結(jié)
以上是生活随笔為你收集整理的Cgroup框架分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gerrit的用法及与gitlab的区别
- 下一篇: SmartFoxServer资料