基于嵌入式設備瀏覽器內存管理策略研究
摘要:為了解決嵌入式設備中內存頻繁分配和釋放所引起的內存碎片以及瀏覽器正常運行難問(wèn)題,提出具有垃圾回收機制的可動(dòng)態(tài)增長(cháng)池式分配數據結構設計和具有Compaction機制的Vector分配方法;在嵌入式環(huán)境系統設計時(shí),采用可回收動(dòng)態(tài)增長(cháng)池式分配策略,系統無(wú)需預潮內存大小,而且可以循環(huán)使用池內空間;Compaction機制的Vector分配方法可以移動(dòng)“在用”對象和“廢棄”對象調整內存占用,減少碎片。實(shí)驗設計中應用上述策略,驗證了該內存管理效率比系統級效率要高,嵌入式設備中打開(kāi)網(wǎng)頁(yè)文件越大,體現出來(lái)的效率更高。
關(guān)鍵詞:嵌入式設備;瀏覽器;池式分配;位圖;對象表
0 引言
在嵌入式系統中,由于設備性能限制系統總的可分配內存相對較小,而在嵌入式平臺上瀏覽器正常運行所需內存一般都比較大,并且內存分配和釋放操作也比較頻繁,例如,IPTV EPG界面上顯示各類(lèi)菜單按鈕、鏈接以及為用戶(hù)提供動(dòng)態(tài)和靜態(tài)的多媒體內容時(shí),往往EPG頁(yè)面中存在著(zhù)各種長(cháng)短不一節目導航提示信息、各種表單、導航按鈕以及圖片等,對于這些要顯示的對象需要通過(guò)數個(gè)矩形數據結構來(lái)表示它們。在界面排版過(guò)程中,隨著(zhù)上、下文的改變,會(huì )進(jìn)行頻繁的分配釋放,例如把圖片插入到網(wǎng)頁(yè)的時(shí)候,網(wǎng)頁(yè)會(huì )把一個(gè)局部區域內的顯示對象釋放然后重新生成,從內存管理角度來(lái)看,這導致了頻繁的內存分配和釋放。為了保證瀏覽器Browser的正常運行和減小內部碎片,本文在分析和研究μCLinux嵌入式操作系統內存管理基礎之上,提出運行在嵌入式設備上瀏覽器的內存管理策略,該策略主要針對瀏覽器中固定大小結構的頻繁分配和釋放,比如各種box,采用池式分配的方式(Pooled Allocation)來(lái)管理固定大小結構的分配和釋放;對于可變大小結構的分配和釋放,比如字符串,采用Vector進(jìn)行分配和釋放。
1 μCLinux內存管理分析
μCLinux是主流嵌入式Linux系統之一,其設計的目標平臺是那些不具有內存管理單元(MMU)的微處理芯片。μCLinux對標準Linux修改最大的部分在于內存管理部分,而瀏覽器內存管理是在一塊已分配的內存上進(jìn)行苒組織內存的使用方式,把這塊已分配的內存當作物理內存來(lái)使用。因此μCLinux的內存管理思想對于本文設計嵌入式設備瀏覽器內存管理有較好參考意義。
1.1 μCLinux內存管理數據結構
μCLinux取消了標準Linux的VMA結構(該結構建立在虛擬內存之上),每個(gè)進(jìn)程維護自己的內存地址空間的方法是在它的mm_DataStruet中維護了一個(gè)此進(jìn)程所使用的內存塊的鏈表。一個(gè)進(jìn)程可以擁有任意多個(gè)內存塊,每個(gè)內存塊用mm_Rblock_DataStruct類(lèi)型的數據結構描述其起始地址、長(cháng)度以及當前被使用的次數。每個(gè)內存塊由mMap()的調用來(lái)建立。
每個(gè)進(jìn)程維護了一個(gè)mm_DataStruct結構(如圖1所示)用來(lái)管理它所擁有的內存空間。tblock是管理所有這個(gè)進(jìn)程所用到的內存區域塊的鏈表表頭。mm_Tbloek_DataStruet是管理mm_Rblock_DataStruct的鏈表結構,rblock指向當前位置的鏈表項,next是指向下一個(gè)位置的鏈表項。mm_Rblock_DataStruct結構是用來(lái)管理內存塊的數據結構,size指明kblock所指向的內存區域的大小,ref_count記錄了這個(gè)內存空間的用戶(hù)個(gè)數,kbloek是指向這個(gè)內存塊空間起始位置的指針。
1.2 μCLinux物理空間管理
雖然μCLinux中對內存地址的操作都是直接對物理內存進(jìn)行的,但是仍然需要使用Linux中對物理頁(yè)幀的管理數據結構,μCLinux對物理空間管理主要有以下幾個(gè)方面:
(1)物理內存以頁(yè)幀為單位,頁(yè)幀的長(cháng)度固定為4 KB,在內核中使用page結構來(lái)表示每個(gè)物理頁(yè)幀;
(2)所有的page結構形成一個(gè)mem_map表,mem_map表在系統初始化時(shí)由free_area_init()函數創(chuàng )建;
(3)在物理內存低端的bitmap表以位圖方式記錄了所有物理內存的空閑狀況,它也是在系統初始化時(shí)由free_area_init()函數創(chuàng )建,bitmap表分割NR_MEM_LISTS組,對第i組初始化時(shí)設定長(cháng)度為(end_mem_start_mem)/PAGE_SIZE/2(i+3),每位表示連續2i個(gè)頁(yè)幀的空狀況,置位為1表示其中一頁(yè)或幾頁(yè)已被占用;
(4)用free_area數組記錄空閑的物理頁(yè)幀,free_area數組由NR_MEM_LISTS個(gè)free_area_struct結構類(lèi)型的數組元素構成,每個(gè)元素均作為一條空閑塊鏈表的表頭,連續2i個(gè)空閑頁(yè)幀則掛到free_area數組的第i項后面,free_area當前空閑頁(yè)面個(gè)數要大于系統中硬性規定的必須保留的空閑頁(yè)面的個(gè)數(5或者低于5的某個(gè)數值),如果不足規定的空閑頁(yè)面,則調用try_to_free_page()函數嘗試增加系統中的空閑頁(yè)面的數量;
(5)Linux采用buddy算法分配空閑塊。
2 嵌入式設備瀏覽器內存管理策略
應用程序瀏覽器內存管理是在一塊已分配的內存上進(jìn)行再組織內存的使用方式,它不會(huì )涉及操作系統的內存管理,但是可以借鑒操作系統的各種內存管理方法,使對應用程序級的內存管理更高效。首先系統獲得一塊固定大小的內存,然后把這塊內存按照功能進(jìn)行固定分區,圖2是Brow ser內存管理各分區的布局。把從系統獲得的內存分為4個(gè)區:第一個(gè)區是Static Section,大小為20 KB,這個(gè)區主要用于保存全局性數據結構GlobalCtlVar,50 Word大小的索引緩存(Indi-ces Buffer)和Pool Linked List。第二個(gè)區是String Map Section是一個(gè)對象表,大小為20 KB,用于存入數組結構StrMap的數組,預定義數組大小為1 000,String Map功能之一類(lèi)似于bitmap,用于管理空閑的數據塊。第三個(gè)區是Reserve Section(保留區),大小是20 KB。第四個(gè)區是Available Section,真正分配給用戶(hù)的內存從這個(gè)區取出,有關(guān)pool的分配從上到下,有關(guān)Vector的分配從下到上。
評論