新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式系統(tǒng)e_slab的研究與實(shí)現(xiàn)

嵌入式系統(tǒng)e_slab的研究與實(shí)現(xiàn)

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

隨著硬件技術(shù)的發(fā)展和內(nèi)存容量的擴(kuò)大,操作中內(nèi)存管理技術(shù)日趨完善。但是在領(lǐng)域中,硬件性能和內(nèi)存容量遠(yuǎn)遠(yuǎn)落后于PC機(jī),其內(nèi)存管理受到多種因素制約,若直接采用操作中的內(nèi)存管理技術(shù),不僅難以達(dá)到預(yù)期效果,而且會(huì)影響的性能。

本文引用地址:http://www.butianyuan.cn/article/148166.htm

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

1 slab分配器分析

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

1.1 slab分配器設(shè)計(jì)思想

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

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

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

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

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

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

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

(1)slab管理結(jié)構(gòu)和存儲開銷較大

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

(2)cache結(jié)構(gòu)復(fù)雜而且數(shù)量較多

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

(3)復(fù)雜的隊(duì)列管理

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

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

針對上節(jié)中slab分配器的三點(diǎn)缺陷,給出相應(yīng)的改進(jìn)方案。

(1)改進(jìn)slab結(jié)構(gòu)

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

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

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

(3)精簡隊(duì)列管理

簡化cache中繁雜的隊(duì)列,將cache中的前兩個(gè)slab隊(duì)列合并成一個(gè)隊(duì)列。

本文將經(jīng)過上述三方面改進(jìn)的分配器稱之為分配器。

2 分配器設(shè)計(jì)

2.1 基本管理結(jié)構(gòu)

分配器有3個(gè)重要的基本結(jié)構(gòu),下面分別對其作相關(guān)介紹。

(1)object_t結(jié)構(gòu)

typedef struct object {

unsigned long size;

unsigned long offset;

} object_t;

object_t是描述對象的基本結(jié)構(gòu),每個(gè)對象對應(yīng)一個(gè)object_t結(jié)構(gòu),它描述了對象的大小和下一個(gè)空閑對象的地址。

(2)e_slab_t結(jié)構(gòu)

typedef struct e_slab _s {

struct list_head list;

void *s_mem;

unsigned int units;

unsigned int free;

} e_slab _t;

e_slab _t是管理對象的基本結(jié)構(gòu),它不僅描述了本結(jié)構(gòu)的頁塊起始地址,而且存儲了空閑對象的數(shù)量和地址等信息。

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

(3)cache結(jié)構(gòu)

typedef struct cache_s {

struct list_head next;

struct list_head slab_list;

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

上一頁 1 2 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉