當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀]嵌入式系統(tǒng)e_slab的研究與實現(xiàn)

隨著硬件技術的發(fā)展和內(nèi)存容量的擴大,操作系統(tǒng)中內(nèi)存管理技術日趨完善。但是在嵌入式領域中,硬件性能和內(nèi)存容量遠遠落后于PC機,其內(nèi)存管理受到多種因素制約,若直接采用操作系統(tǒng)中的內(nèi)存管理技術,不僅難以達到預期效果,而且會影響嵌入式系統(tǒng)的性能。

在嵌入式系統(tǒng)內(nèi)存管理設計過程中,發(fā)現(xiàn)操作系統(tǒng)中的slab分配器雖然在PC機上有良好的性能,但是在嵌入式系統(tǒng)中不但不能發(fā)揮其優(yōu)勢,還降低了系統(tǒng)的整體性能。本文通過分析,指出了slab分配器的不足,并給出相應的解決方案。實驗結果表明,slab分配器經(jīng)過改進可適用于嵌入式系統(tǒng)。

1 slab分配器分析

操作系統(tǒng)內(nèi)核運行時會頻繁地為某些對象分配內(nèi)存空間,而這些對象往往只需要幾十或幾百KB的空間,如果直接采用頁面管理器進行內(nèi)存分配,將產(chǎn)生很多內(nèi)存碎片,造成嚴重的內(nèi)存浪費。slab分配器支持細粒度的內(nèi)存分配,較好地解決了此問題。由于性能優(yōu)越,slab被Linux、FreeBSD等操作系統(tǒng)采用,是目前應用最廣的內(nèi)核內(nèi)存管理器之一[1]。

1.1 slab分配器設計思想

基于頁面分配器[2],將一頁或幾頁的內(nèi)存組織起來,劃分成一定數(shù)量的小塊內(nèi)存,這種連續(xù)的頁面稱之為slab。它為內(nèi)核中使用頻繁的對象建立專門的緩沖區(qū)(cache),每種類型的對象都有自己專用的cache[2]。一個cache管理著多個slab,每個slab又管理著多個對象。slab的大小與所管理對象的大小有關。根據(jù)slab管理對象的分配情況,可將每個cache中的slab分為3類[3-4]:(1)slab管理的對象已經(jīng)完全分配,沒有空閑的對象;(2)slab管理的對象部分分配,還有部分空閑對象;(3)slab中的對象都未分配,都是空閑對象。

不同的slab分別放入不同的隊列中,即每個cache管理3個slab隊列,cache與cache之間的關系如圖1虛框①內(nèi)所示,cache與slab的關系如圖1虛框②內(nèi)所示。

 

 

當slab分配器接收到內(nèi)存申請時,根據(jù)所申請內(nèi)存的大小找到合適的cache,從cache管理的第二類slab中分配對象,若失敗則從第三類slab中分配對象,若還不成功則說明cache中沒有空閑對象,須為cache創(chuàng)建一個新的slab,從新的slab中分配空閑對象。

對象釋放過程中,不僅要清空對象占用的空間,而且還要調整對象所屬slab的狀態(tài),判斷是否改變此slab在cache中的位置。

slab分配器采用著色機制將不同slab中的對象放入不同的偏移處,利用硬件高速緩存的映射機制,將頁的不同偏移映射到硬件緩存的不同地址。而每個slab的開始部分訪問頻率最高,只要slab中起始對象的偏移不同則映射到硬件高速緩存的位置就不同,從而降低了頻繁換入換出的性能損失[4-5]。

1.2 slab分配器在嵌入式系統(tǒng)中的缺陷

slab分配器雖然能解決系統(tǒng)對小塊內(nèi)存的頻繁需求,但是管理結構復雜,內(nèi)存分配策略開銷較大。在內(nèi)存受限的嵌入式系統(tǒng)中,slab的缺陷大大影響了系統(tǒng)的整體性能??傊瑂lab分配器存在以下三方面的缺陷:

(1)slab管理結構和存儲開銷較大

每個slab由slab描述結構、管理空閑對象的整型數(shù)組和對象三部分組成,整型數(shù)組把slab中空閑對象組成一個順序隊列,數(shù)組大小與對象數(shù)有關,每個對象對應一個整數(shù),如圖2所示。當對象較小時,整型數(shù)組將造成較大的內(nèi)存開銷。

 

 

(2)cache結構復雜而且數(shù)量較多

系統(tǒng)中存在著專用對象和通用對象。專用對象專門存儲特定用途的數(shù)據(jù)結構,例如CPU、文件系統(tǒng)等,其數(shù)量與系統(tǒng)密切相關;通用對象用來存儲一般的數(shù)據(jù)結構,大小在幾十KB到幾千KB之間(一般為2的整次冪字節(jié)),有十多種。不管是專用對象還是通用對象,slab分配器都為其建立了一個cache結構,眾多cache組織和管理的較大開銷是嵌入式系統(tǒng)難以承受的。

(3)復雜的隊列管理

如圖1所示,slab分配器中存在較多的隊列,每個cache管理著3個slab隊列,每個slab隊列與cache組成循環(huán)隊列。所有的cache組成雙向循環(huán)隊列。面對眾多的隊列,如何有效地管理是很困難的。

1.3 slab在嵌入式系統(tǒng)中的改進

針對上節(jié)中slab分配器的三點缺陷,給出相應的改進方案。

(1)改進slab結構

針對slab中對象管理數(shù)組開銷過大的問題,可以將多個不同的slab合并成一個slab,從而減少slab的數(shù)量,即一個slab管理對象的大小可在一個小范圍內(nèi)浮動。由于slab中對象大小不同,無法確定slab中對象的大小、數(shù)量和位置,所以必須重新設置slab結構。

(2)限制slab分配器管理的內(nèi)存粒度范圍

由于內(nèi)核內(nèi)存管理器主要負責細粒度的內(nèi)存管理,所以限制所管理對象的大小。對于大塊內(nèi)存的申請,直接由頁面分配器處理。

(3)精簡隊列管理

簡化cache中繁雜的隊列,將cache中的前兩個slab隊列合并成一個隊列。

本文將經(jīng)過上述三方面改進的分配器稱之為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是管理對象的基本結構,它不僅描述了本結構的頁塊起始地址,而且存儲了空閑對象的數(shù)量和地址等信息。

object_t、e_slab _t和對象結構如圖3虛框②內(nèi)所示。

(3)cache結構

typedef struct cache_s {

struct list_head next;

struct list_head slab_list;[!--empirenews.page--]

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虛框①內(nèi)所示,cache_cache利用雙向鏈表將系統(tǒng)中所有的cache(包括專用cache和通用cache)組成循環(huán)隊列;一種是cache與對象之間的關系。

 

 

2.2 e_slab分配器初始化

e_slab分配器初始化主要完成cache、e_slab_t等結構的創(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。設置cache中的各個域,包括管理的對象大小的上限和e_slab大小,其中e_slab大小與對象大小有關。

(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請求,在相應的內(nèi)存區(qū)申請連續(xù)頁塊。

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

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

2.3 對象的分配與釋放

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

2.3.1 對象的分配

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

 

 

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

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

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

2.3.2 對象的釋放

系統(tǒng)使用完對象后,應及時釋放對象,否則內(nèi)存會越用越少。對象釋放流程如圖5所示。

 

 

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

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

(3)e_slab的調整。檢查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結構中刪除。e_slab從cache的list隊列中摘掉。

(2)清除頁面標志。將e_slab所在物理頁面的e_slab標志清除,并清除頁面與e_slab和cache的關聯(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結構占用的內(nèi)存。由于cache是cache_cache管理的對象,cache結構的釋放過程就是對象的釋放過程。

3 性能測試

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

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

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉