《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于嵌入式系統的e_slab研究與實現
基于嵌入式系統的e_slab研究與實現
來源:微型機與應用2012年第12期
李 勇,任 宏,王志林
(中國人民解放軍91245部隊,遼寧 葫蘆島125000)
摘要: 為降低嵌入式系統的內存管理開銷,提升內存分配效率,詳細分析了slab分配器機制并指出其不足,給出相應的改進措施,提出了基于e_slab算法的內存分配器。實驗表明,e_slab算法不僅簡化了內存管理結構,而且提高了內存分配效率。
Abstract:
Key words :

摘  要: 為降低嵌入式系統的內存管理開銷,提升內存分配效率,詳細分析了slab分配器機制并指出其不足,給出相應的改進措施,提出了基于e_slab算法的內存分配器。實驗表明,e_slab算法不僅簡化了內存管理結構,而且提高了內存分配效率。
關鍵詞: slab;e_slab;嵌入式系統;cache

    隨著硬件技術的發展和內存容量的擴大,操作系統中內存管理技術日趨完善。但是在嵌入式領域中,硬件性能和內存容量遠遠落后于PC機,其內存管理受到多種因素制約,若直接采用操作系統中的內存管理技術,不僅難以達到預期效果,而且會影響嵌入式系統的性能。
    在嵌入式系統內存管理設計過程中,發現操作系統中的slab分配器雖然在PC機上有良好的性能,但是在嵌入式系統中不但不能發揮其優勢,還降低了系統的整體性能。本文通過分析,指出了slab分配器的不足,并給出相應的解決方案。實驗結果表明,slab分配器經過改進可適用于嵌入式系統。
1 slab分配器分析
    操作系統內核運行時會頻繁地為某些對象分配內存空間,而這些對象往往只需要幾十或幾百KB的空間,如果直接采用頁面管理器進行內存分配,將產生很多內存碎片,造成嚴重的內存浪費。slab分配器支持細粒度的內存分配,較好地解決了此問題。由于性能優越,slab被Linux、FreeBSD等操作系統采用,是目前應用最廣的內核內存管理器之一[1]。
1.1 slab分配器設計思想
    基于頁面分配器[2],將一頁或幾頁的內存組織起來,劃分成一定數量的小塊內存,這種連續的頁面稱之為slab。它為內核中使用頻繁的對象建立專門的緩沖區(cache),每種類型的對象都有自己專用的cache[2]。一個cache管理著多個slab,每個slab又管理著多個對象。slab的大小與所管理對象的大小有關。根據slab管理對象的分配情況,可將每個cache中的slab分為3類[3-4]:(1)slab管理的對象已經完全分配,沒有空閑的對象;(2)slab管理的對象部分分配,還有部分空閑對象;(3)slab中的對象都未分配,都是空閑對象。
    不同的slab分別放入不同的隊列中,即每個cache管理3個slab隊列,cache與cache之間的關系如圖1虛框①內所示,cache與slab的關系如圖1虛框②內所示。


    當slab分配器接收到內存申請時,根據所申請內存的大小找到合適的cache,從cache管理的第二類slab中分配對象,若失敗則從第三類slab中分配對象,若還不成功則說明cache中沒有空閑對象,須為cache創建一個新的slab,從新的slab中分配空閑對象。
    對象釋放過程中,不僅要清空對象占用的空間,而且還要調整對象所屬slab的狀態,判斷是否改變此slab在cache中的位置。
    slab分配器采用著色機制將不同slab中的對象放入不同的偏移處,利用硬件高速緩存的映射機制,將頁的不同偏移映射到硬件緩存的不同地址。而每個slab的開始部分訪問頻率最高,只要slab中起始對象的偏移不同則映射到硬件高速緩存的位置就不同,從而降低了頻繁換入換出的性能損失[4-5]。
1.2 slab分配器在嵌入式系統中的缺陷
    slab分配器雖然能解決系統對小塊內存的頻繁需求,但是管理結構復雜,內存分配策略開銷較大。在內存受限的嵌入式系統中,slab的缺陷大大影響了系統的整體性能。總之,slab分配器存在以下三方面的缺陷:
    (1)slab管理結構和存儲開銷較大
    每個slab由slab描述結構、管理空閑對象的整型數組和對象三部分組成,整型數組把slab中空閑對象組成一個順序隊列,數組大小與對象數有關,每個對象對應一個整數,如圖2所示。當對象較小時,整型數組將造成較大的內存開銷。

    (2)cache結構復雜而且數量較多
    系統中存在著專用對象和通用對象。專用對象專門存儲特定用途的數據結構,例如CPU、文件系統等,其數量與系統密切相關;通用對象用來存儲一般的數據結構,大小在幾十KB到幾千KB之間(一般為2的整次冪字節),有十多種。不管是專用對象還是通用對象,slab分配器都為其建立了一個cache結構,眾多cache組織和管理的較大開銷是嵌入式系統難以承受的。
    (3)復雜的隊列管理
    如圖1所示,slab分配器中存在較多的隊列,每個cache管理著3個slab隊列,每個slab隊列與cache組成循環隊列。所有的cache組成雙向循環隊列。面對眾多的隊列,如何有效地管理是很困難的。
1.3 slab在嵌入式系統中的改進
    針對上節中slab分配器的三點缺陷,給出相應的改進方案。
    (1)改進slab結構
    針對slab中對象管理數組開銷過大的問題,可以將多個不同的slab合并成一個slab,從而減少slab的數量,即一個slab管理對象的大小可在一個小范圍內浮動。由于slab中對象大小不同,無法確定slab中對象的大小、數量和位置,所以必須重新設置slab結構。
    (2)限制slab分配器管理的內存粒度范圍
    由于內核內存管理器主要負責細粒度的內存管理,所以限制所管理對象的大小。對于大塊內存的申請,直接由頁面分配器處理。
    (3)精簡隊列管理
    簡化cache中繁雜的隊列,將cache中的前兩個slab隊列合并成一個隊列。
  本文將經過上述三方面改進的分配器稱之為e_slab分配器。
2 e_slab分配器設計
2.1 基本管理結構

    e_slab分配器有3個重要的基本結構,下面分別對其作相關介紹。
    (1)object_t結構
    typedef  struct object {
            unsigned long size;
            unsigned long offset;
    } object_t;
    object_t是描述對象的基本結構,每個對象對應一個object_t結構,它描述了對象的大小和下一個空閑對象的地址。
    (2)e_slab_t結構
    typedef struct e_slab _s {
            struct list_head    list;
            void                *s_mem;
            unsigned int        units;
            unsigned int        free;
    } e_slab _t;
    e_slab _t是管理對象的基本結構,它不僅描述了本結構的頁塊起始地址,而且存儲了空閑對象的數量和地址等信息。
    object_t、e_slab _t和對象結構如圖3虛框②內所示。
    (3)cache結構
    typedef struct cache_s {
            struct list_head    next;
            struct list_head    slab_list;
            unsigned int        objsize;
            unsigned int        gfporder;
            unsigned int        num;
            …
    } cache_t;
    cache的描述結構為cache_t,它主要描述了所管e_slab的基本信息。由于cache_t結構大小相同,可把cache_t看做一個專用對象,所有的cache組織在一起。
    cache管理的所有e_slab被加入到list隊列。把管理所有cache的結構稱之為cache_cache。cache_cache與cache之間有兩種關系:一種是雙向隊列關系,如圖3虛框①內所示,cache_cache利用雙向鏈表將系統中所有的cache(包括專用cache和通用cache)組成循環隊列;一種是cache與對象之間的關系。

 

 

2.2 e_slab分配器初始化
    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%的空間;在對象的內存申請過程中,e_slab的速度比slab快8%;內存釋放過程中,e_slab比slab快5%??梢?,不管在時間上還是空間上,e_slab性能都比slab優越。
參考文獻
[1] GORMAN M.Understanding the Linux virtual memory  manager[M].北京:北京航空航天大學出版社,2006.
[2] 陳燕暉.頁面分配器的研究與實現[D].長沙:國防科技大學,2006.
[3] 李毅.Slab內存分配策略與移植[D].成都:電子科技大學,2007.
[4] 李勇.虛擬機監控器內存管理機制研究與實現[D].鄭州:信息工程大學,2010.
[5] 史成偉.多核系統中的內存管理系統優化研究[D].成都:電子科技大學,2009.

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 成人观看免费大片在线观看 | 有码 在线| 亚洲日日做天天做日日谢 | 在线毛片免费 | 色狠狠狠色噜噜噜综合网 | 成人18免费视频 | 中国特级黄一级真人毛片 | 波多野结衣与老人公gvg在线 | 女全身裸无遮挡免费毛片 | 丁香五月亚洲综合在线 | 在线综合视频 | 美女一级毛片无遮挡内谢 | 最近的中文字幕视频完整 | 欧美狠狠入鲁的视频极速 | 清风阁我爱干视频网 | 日本一区二区在线播放 | 毛茸茸free牲交 | 手机毛片免费看 | 草久在线播放 | 亚洲国产成人资源在线软件 | 一集黄色片 | 色婷婷综合久久久中文字幕 | 干操视频| 在线观看www视频 | 一区二区在线看 | 欧美笫一页| 黄色毛片免费观看 | 特级深夜a级毛片免费观看 特级中国aaa毛片 | 亚洲精品国产精品精 | 国产亚洲蜜芽精品久久 | 色偷偷91久久综合噜噜噜 | 亚洲欧洲日本在线 | 欧美播放 | 欧美日韩中文字幕在线手机版本 | 亚洲天堂精品在线观看 | ccav成人| 手机在线伦理片 | 欧美成人高清 | 欧美在线网 | 无毛片| 成年人午夜视频 |