嵌入式系統(tǒng)e_slab的研究與實現(xiàn)
unsigned int objsize;
unsigned int gfporder;
unsigned int num;
…
} cache_t;
cache的描述結(jié)構(gòu)為cache_t,它主要描述了所管e_slab的基本信息。由于cache_t結(jié)構(gòu)大小相同,可把cache_t看做一個專用對象,所有的cache組織在一起。
cache管理的所有e_slab被加入到list隊列。把管理所有cache的結(jié)構(gòu)稱之為cache_cache。cache_cache與cache之間有兩種關(guān)系:一種是雙向隊列關(guān)系,如圖3虛框①內(nèi)所示,cache_cache利用雙向鏈表將系統(tǒng)中所有的cache(包括專用cache和通用cache)組成循環(huán)隊列;一種是cache與對象之間的關(guān)系。
2.2 e_slab分配器初始化
e_slab分配器初始化主要完成cache、e_slab_t等結(jié)構(gòu)的創(chuàng)建,為對象的分配做好準備。
2.2.1 cache的創(chuàng)建
cache_cache是系統(tǒng)中所有cache的管理者,它的創(chuàng)建優(yōu)先于所有的cache。系統(tǒng)會為每種對象創(chuàng)建一個cache,創(chuàng)建流程如下:
(1)申請一個cache空間。從cache_cache中分配一個專用對象,即cache。設(shè)置cache中的各個域,包括管理的對象大小的上限和e_slab大小,其中e_slab大小與對象大小有關(guān)。
(2)將此cache加入管理隊列。將cache加入cache_cache組成的雙向隊列中,雙向隊列采用通用鏈表鏈接所有的cache。
(3)將cache加入分配隊列。用一個全局的cache指針指向生成的cache。
2.2.2 e_slab的創(chuàng)建
在cache的創(chuàng)建過程中,需為每個cache創(chuàng)建一個e_slab。e_slab中的對象全部空閑,可供分配,其流程如下:
(1)借助頁面分配器申請連續(xù)物理頁面。根據(jù)e_slab申請的大小和是否有DMA請求,在相應(yīng)的內(nèi)存區(qū)申請連續(xù)頁塊。
(2)設(shè)置頁面屬性。主要設(shè)置該頁面的e_slab標志,并將該頁塊與cache和e_slab關(guān)聯(lián)。
(3)設(shè)置e_slab描述結(jié)構(gòu),初始化對象結(jié)構(gòu)。
2.3 對象的分配與釋放
對象的分配與釋放是內(nèi)存管理模塊提供的兩個基本接口。
2.3.1 對象的分配
當系統(tǒng)需要小內(nèi)存塊或者專用對象時,系統(tǒng)會調(diào)用對象分配操作,完成對對象的分配,具體流程如圖4所示。
(1)找到對應(yīng)的cache。根據(jù)申請對象的大小定位相應(yīng)的cache。
(2)確定對應(yīng)的e_slab。檢查cache中的e_slab,找到滿足本次請求的e_slab,如果所有的e_slab均不能滿足,則創(chuàng)建一個新的e_slab并添加到cache管理的隊列中。
(3)從e_slab中分配一個空閑對象。從e_slab為系統(tǒng)分配一個空閑對象和object_t結(jié)構(gòu),將對象返還給系統(tǒng),調(diào)整e_slab中對象,管理數(shù)組結(jié)構(gòu)。
2.3.2 對象的釋放
系統(tǒng)使用完對象后,應(yīng)及時釋放對象,否則內(nèi)存會越用越少。對象釋放流程如圖5所示。
(1)確定對象對應(yīng)的cache與e_slab。根據(jù)對象的地址可以獲得所在頁面的描述符結(jié)構(gòu),從而獲得對應(yīng)的cache和e_slab。
(2)釋放對象。獲得對象在e_slab中的偏移,采用頭插法將對象加入空閑對象隊列,并使e_slab中空閑內(nèi)存增加釋放值。
(3)e_slab的調(diào)整。檢查e_slab中空閑內(nèi)存大小,若等于e_slab中所有對象都釋放,則清除頁面的e_slab標志,并把e_slab占用頁塊歸還給物理內(nèi)存管理器。
2.4 e_slab分配器的回收
在系統(tǒng)退出、內(nèi)存回收等不再需要e_slab分配器時,需進行e_slab分配器的回收,主要完成e_slab的釋放和cache的釋放。
2.4.1 e_slab的釋放
在對象釋放過程中,若發(fā)現(xiàn)某個e_slab已經(jīng)全部空閑,沒有分配的對象,則將其釋放,流程如下:
(1)將e_slab從cache結(jié)構(gòu)中刪除。e_slab從cache的list隊列中摘掉。
(2)清除頁面標志。將e_slab所在物理頁面的e_slab標志清除,并清除頁面與e_slab和cache的關(guān)聯(lián),使頁面回到初始狀態(tài)。
2.4.2 cache的釋放
當系統(tǒng)不再使用某種對象時,系統(tǒng)要銷毀管理對象的cache。cache銷毀流程如下:
(1)將cache從管理隊列摘掉。將cache從cache_cache組成的雙向隊列中刪除。
(2)確定cache中沒有e_slab。在cache銷毀前,必須確定所管理的對象都已釋放,檢查cache的list隊列,為空則cache中沒有e_slab,否則進行e_slab釋放。
(3)釋放cache結(jié)構(gòu)占用的內(nèi)存。由于cache是cache_cache管理的對象,cache結(jié)構(gòu)的釋放過程就是對象的釋放過程。
3 性能測試
在嵌入式系統(tǒng)內(nèi)存管理設(shè)計過程中,分別采用頁面分配器與slab分配器相結(jié)合的方案和頁面分配器與e_slab分配器相結(jié)合的方案,比較兩種方案中slab和e_slab管理結(jié)構(gòu)的內(nèi)存占用量和內(nèi)存分配釋放中的性能。
在管理結(jié)構(gòu)內(nèi)存占用方面,e_slab比slab節(jié)省了43%的空間;在對象的c過程中,e_slab的速度比slab快8%;內(nèi)存釋放過程中,e_slab比slab快5%??梢?,不管在時間上還是空間上,e_slab性能都比slab優(yōu)越。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂) 紅外熱像儀相關(guān)文章:紅外熱像儀原理
評論