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

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

(2)cache結構復雜而且數量較多
系統中存在著(zhù)專(zhuān)用對象和通用對象。專(zhuān)用對象專(zhuān)門(mén)存儲特定用途的數據結構,例如CPU、文件系統等,其數量與系統密切相關(guān);通用對象用來(lái)存儲一般的數據結構,大小在幾十KB到幾千KB之間(一般為2的整次冪字節),有十多種。不管是專(zhuān)用對象還是通用對象,slab分配器都為其建立了一個(gè)cache結構,眾多cache組織和管理的較大開(kāi)銷(xiāo)是嵌入式系統難以承受的。
(3)復雜的隊列管理
如圖1所示,slab分配器中存在較多的隊列,每個(gè)cache管理著(zhù)3個(gè)slab隊列,每個(gè)slab隊列與cache組成循環(huán)隊列。所有的cache組成雙向循環(huán)隊列。面對眾多的隊列,如何有效地管理是很困難的。
1.3 slab在嵌入式系統中的改進(jìn)
針對上節中slab分配器的三點(diǎn)缺陷,給出相應的改進(jìn)方案。
(1)改進(jìn)slab結構
針對slab中對象管理數組開(kāi)銷(xiāo)過(guò)大的問(wèn)題,可以將多個(gè)不同的slab合并成一個(gè)slab,從而減少slab的數量,即一個(gè)slab管理對象的大小可在一個(gè)小范圍內浮動(dòng)。由于slab中對象大小不同,無(wú)法確定slab中對象的大小、數量和位置,所以必須重新設置slab結構。
(2)限制slab分配器管理的內存粒度范圍
由于內核內存管理器主要負責細粒度的內存管理,所以限制所管理對象的大小。對于大塊內存的申請,直接由頁(yè)面分配器處理。
(3)精簡(jiǎn)隊列管理
簡(jiǎn)化cache中繁雜的隊列,將cache中的前兩個(gè)slab隊列合并成一個(gè)隊列。
本文將經(jīng)過(guò)上述三方面改進(jìn)的分配器稱(chēng)之為e_slab分配器。
2 e_slab分配器設計
2.1 基本管理結構
e_slab分配器有3個(gè)重要的基本結構,下面分別對其作相關(guān)介紹。
(1)object_t結構
typedef struct object {
unsigned long size;
unsigned long offset;
} object_t;
object_t是描述對象的基本結構,每個(gè)對象對應一個(gè)object_t結構,它描述了對象的大小和下一個(gè)空閑對象的地址。
(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是管理對象的基本結構,它不僅描述了本結構的頁(yè)塊起始地址,而且存儲了空閑對象的數量和地址等信息。
object_t、e_slab _t和對象結構如圖3虛框②內所示。
(3)cache結構
typedef struct cache_s {
struct list_head next;
struct list_head slab_list;
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂) 紅外熱像儀相關(guān)文章:紅外熱像儀原理
評論