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