<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式系統e_slab的研究與實(shí)現

嵌入式系統e_slab的研究與實(shí)現

作者: 時(shí)間:2012-12-27 來(lái)源:網(wǎng)絡(luò ) 收藏

unsigned int objsize;

unsigned int gfporder;

unsigned int num;

} cache_t;

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

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

2.2 分配器初始化

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

2.2.1 cache的創(chuàng )建

cache_cache是中所有cache的管理者,它的創(chuàng )建優(yōu)先于所有的cache。會(huì )為每種對象創(chuàng )建一個(gè)cache,創(chuàng )建流程如下:

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

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

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

2.2.2 e_slab的創(chuàng )建

在cache的創(chuàng )建過(guò)程中,需為每個(gè)cache創(chuàng )建一個(gè)e_slab。e_slab中的對象全部空閑,可供分配,其流程如下:

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

(2)設置頁(yè)面屬性。主要設置該頁(yè)面的e_slab標志,并將該頁(yè)塊與cache和e_slab關(guān)聯(lián)。

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

2.3 對象的分配與釋放

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

2.3.1 對象的分配

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

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

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

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

2.3.2 對象的釋放

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

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

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

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

2.4 e_slab分配器的回收

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

2.4.1 e_slab的釋放

在對象釋放過(guò)程中,若發(fā)現某個(gè)e_slab已經(jīng)全部空閑,沒(méi)有分配的對象,則將其釋放,流程如下:

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

(2)清除頁(yè)面標志。將e_slab所在物理頁(yè)面的e_slab標志清除,并清除頁(yè)面與e_slab和cache的關(guān)聯(lián),使頁(yè)面回到初始狀態(tài)。

2.4.2 cache的釋放

當系統不再使用某種對象時(shí),系統要銷(xiāo)毀管理對象的cache。cache銷(xiāo)毀流程如下:

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

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

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

3 性能測試

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

在管理結構內存占用方面,e_slab比slab節省了43%的空間;在對象的c過(guò)程中,e_slab的速度比slab快8%;內存釋放過(guò)程中,e_slab比slab快5%??梢?jiàn),不管在時(shí)間上還是空間上,e_slab性能都比slab優(yōu)越。

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

上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>