• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式系統e_slab的研究與實現

    嵌入式系統e_slab的研究與實現

    作者: 時間:2012-12-27 來源:網絡 收藏

    unsigned int objsize;

    unsigned int gfporder;

    unsigned int num;

    } cache_t;

    cache的描述結構為cache_t,它主要描述了所管的基本信息。由于cache_t結構大小相同,可把cache_t看做一個專用對象,所有的cache組織在一起。

    cache管理的所有被加入到list隊列。把管理所有cache的結構稱之為cache_cache。cache_cache與cache之間有兩種關系:一種是雙向隊列關系,如圖3虛框①內所示,cache_cache利用雙向鏈表將中所有的cache(包括專用cache和通用cache)組成循環隊列;一種是cache與對象之間的關系。

    2.2 分配器初始化

    e_slab分配器初始化主要完成cache、e_slab_t等結構的創建,為對象的分配做好準備。

    2.2.1 cache的創建

    cache_cache是中所有cache的管理者,它的創建優先于所有的cache。會為每種對象創建一個cache,創建流程如下:

    (1)申請一個cache空間。從cache_cache中分配一個專用對象,即cache。設置cache中的各個域,包括管理的對象大小的上限和e_slab大小,其中e_slab大小與對象大小有關。

    (2)將此cache加入管理隊列。將cache加入cache_cache組成的雙向隊列中,雙向隊列采用通用鏈表鏈接所有的cache。

    (3)將cache加入分配隊列。用一個全局的cache指針指向生成的cache。

    2.2.2 e_slab的創建

    在cache的創建過程中,需為每個cache創建一個e_slab。e_slab中的對象全部空閑,可供分配,其流程如下:

    (1)借助頁面分配器申請連續物理頁面。根據e_slab申請的大小和是否有DMA請求,在相應的內存區申請連續頁塊。

    (2)設置頁面屬性。主要設置該頁面的e_slab標志,并將該頁塊與cache和e_slab關聯。

    (3)設置e_slab描述結構,初始化對象結構。

    2.3 對象的分配與釋放

    對象的分配與釋放是內存管理模塊提供的兩個基本接口。

    2.3.1 對象的分配

    當系統需要小內存塊或者專用對象時,系統會調用對象分配操作,完成對對象的分配,具體流程如圖4所示。

    (1)找到對應的cache。根據申請對象的大小定位相應的cache。

    (2)確定對應的e_slab。檢查cache中的e_slab,找到滿足本次請求的e_slab,如果所有的e_slab均不能滿足,則創建一個新的e_slab并添加到cache管理的隊列中。

    (3)從e_slab中分配一個空閑對象。從e_slab為系統分配一個空閑對象和object_t結構,將對象返還給系統,調整e_slab中對象,管理數組結構。

    2.3.2 對象的釋放

    系統使用完對象后,應及時釋放對象,否則內存會越用越少。對象釋放流程如圖5所示。

    (1)確定對象對應的cache與e_slab。根據對象的地址可以獲得所在頁面的描述符結構,從而獲得對應的cache和e_slab。

    (2)釋放對象。獲得對象在e_slab中的偏移,采用頭插法將對象加入空閑對象隊列,并使e_slab中空閑內存增加釋放值。

    (3)e_slab的調整。檢查e_slab中空閑內存大小,若等于e_slab中所有對象都釋放,則清除頁面的e_slab標志,并把e_slab占用頁塊歸還給物理內存管理器。

    2.4 e_slab分配器的回收

    在系統退出、內存回收等不再需要e_slab分配器時,需進行e_slab分配器的回收,主要完成e_slab的釋放和cache的釋放。

    2.4.1 e_slab的釋放

    在對象釋放過程中,若發現某個e_slab已經全部空閑,沒有分配的對象,則將其釋放,流程如下:

    (1)將e_slab從cache結構中刪除。e_slab從cache的list隊列中摘掉。

    (2)清除頁面標志。將e_slab所在物理頁面的e_slab標志清除,并清除頁面與e_slab和cache的關聯,使頁面回到初始狀態。

    2.4.2 cache的釋放

    當系統不再使用某種對象時,系統要銷毀管理對象的cache。cache銷毀流程如下:

    (1)將cache從管理隊列摘掉。將cache從cache_cache組成的雙向隊列中刪除。

    (2)確定cache中沒有e_slab。在cache銷毀前,必須確定所管理的對象都已釋放,檢查cache的list隊列,為空則cache中沒有e_slab,否則進行e_slab釋放。

    (3)釋放cache結構占用的內存。由于cache是cache_cache管理的對象,cache結構的釋放過程就是對象的釋放過程。

    3 性能測試

    系統內存管理設計過程中,分別采用頁面分配器與slab分配器相結合的方案和頁面分配器與e_slab分配器相結合的方案,比較兩種方案中slab和e_slab管理結構的內存占用量和內存分配釋放中的性能。

    在管理結構內存占用方面,e_slab比slab節省了43%的空間;在對象的c過程中,e_slab的速度比slab快8%;內存釋放過程中,e_slab比slab快5%。可見,不管在時間上還是空間上,e_slab性能都比slab優越。

    linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
    紅外熱像儀相關文章:紅外熱像儀原理

    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 滁州市| 崇明县| 双桥区| 嘉峪关市| 抚顺市| 永定县| 安吉县| 西乌珠穆沁旗| 藁城市| 洞头县| 四子王旗| 玉环县| 宕昌县| 延吉市| 故城县| 湄潭县| 丘北县| 栖霞市| 大竹县| 海林市| 达拉特旗| 安平县| 拜城县| 永清县| 勐海县| 广西| 东港市| 全椒县| 浑源县| 顺平县| 团风县| 资中县| 安庆市| 新闻| 莱州市| 贵定县| 泾阳县| 涿鹿县| 大英县| 陇南市| 五常市|