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