新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于嵌入式設(shè)備瀏覽器內(nèi)存管理策略研究

        基于嵌入式設(shè)備瀏覽器內(nèi)存管理策略研究

        作者: 時間:2011-07-22 來源:網(wǎng)絡(luò) 收藏

        摘要:為了解決頻繁分配和釋放所引起的碎片以及正常運(yùn)行難問題,提出具有垃圾回收機(jī)制的可動態(tài)增長池式分配數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)和具有Compaction機(jī)制的Vector分配方法;在環(huán)境系統(tǒng)設(shè)計(jì)時,采用可回收動態(tài)增長池式分配,系統(tǒng)無需預(yù)潮大小,而且可以循環(huán)使用池內(nèi)空間;Compaction機(jī)制的Vector分配方法可以移動“在用”對象和“廢棄”對象調(diào)整內(nèi)存占用,減少碎片。實(shí)驗(yàn)設(shè)計(jì)中應(yīng)用上述,驗(yàn)證了該內(nèi)存效率比系統(tǒng)級效率要高,中打開網(wǎng)頁文件越大,體現(xiàn)出來的效率更高。
        關(guān)鍵詞:嵌入式;池式分配;位圖;對象表

        0 引言
        在嵌入式系統(tǒng)中,由于設(shè)備性能限制系統(tǒng)總的可分配內(nèi)存相對較小,而在嵌入式平臺上正常運(yùn)行所需內(nèi)存一般都比較大,并且內(nèi)存分配和釋放操作也比較頻繁,例如,IPTV EPG界面上顯示各類菜單按鈕、鏈接以及為用戶提供動態(tài)和靜態(tài)的多媒體內(nèi)容時,往往EPG頁面中存在著各種長短不一節(jié)目導(dǎo)航提示信息、各種表單、導(dǎo)航按鈕以及圖片等,對于這些要顯示的對象需要通過數(shù)個矩形數(shù)據(jù)結(jié)構(gòu)來表示它們。在界面排版過程中,隨著上、下文的改變,會進(jìn)行頻繁的分配釋放,例如把圖片插入到網(wǎng)頁的時候,網(wǎng)頁會把一個局部區(qū)域內(nèi)的顯示對象釋放然后重新生成,從內(nèi)存角度來看,這導(dǎo)致了頻繁的內(nèi)存分配和釋放。為了保證瀏覽器Browser的正常運(yùn)行和減小內(nèi)部碎片,本文在分析和μCLinux嵌入式操作系統(tǒng)內(nèi)存基礎(chǔ)之上,提出運(yùn)行在嵌入式設(shè)備上瀏覽器的內(nèi)存管理,該策略主要針對瀏覽器中固定大小結(jié)構(gòu)的頻繁分配和釋放,比如各種box,采用池式分配的方式(Pooled Allocation)來管理固定大小結(jié)構(gòu)的分配和釋放;對于可變大小結(jié)構(gòu)的分配和釋放,比如字符串,采用Vector進(jìn)行分配和釋放。

        1 μCLinux內(nèi)存管理分析
        μCLinux是主流嵌入式Linux系統(tǒng)之一,其設(shè)計(jì)的目標(biāo)平臺是那些不具有內(nèi)存管理單元(MMU)的微處理芯片。μCLinux對標(biāo)準(zhǔn)Linux修改最大的部分在于內(nèi)存管理部分,而瀏覽器內(nèi)存管理是在一塊已分配的內(nèi)存上進(jìn)行苒組織內(nèi)存的使用方式,把這塊已分配的內(nèi)存當(dāng)作物理內(nèi)存來使用。因此μCLinux的內(nèi)存管理思想對于本文設(shè)計(jì)嵌入式設(shè)備瀏覽器內(nèi)存管理有較好參考意義。
        1.1 μCLinux內(nèi)存管理數(shù)據(jù)結(jié)構(gòu)
        μCLinux取消了標(biāo)準(zhǔn)Linux的VMA結(jié)構(gòu)(該結(jié)構(gòu)建立在虛擬內(nèi)存之上),每個進(jìn)程維護(hù)自己的內(nèi)存地址空間的方法是在它的mm_DataStruet中維護(hù)了一個此進(jìn)程所使用的內(nèi)存塊的鏈表。一個進(jìn)程可以擁有任意多個內(nèi)存塊,每個內(nèi)存塊用mm_Rblock_DataStruct類型的數(shù)據(jù)結(jié)構(gòu)描述其起始地址、長度以及當(dāng)前被使用的次數(shù)。每個內(nèi)存塊由mMap()的調(diào)用來建立。
        每個進(jìn)程維護(hù)了一個mm_DataStruct結(jié)構(gòu)(如圖1所示)用來管理它所擁有的內(nèi)存空間。tblock是管理所有這個進(jìn)程所用到的內(nèi)存區(qū)域塊的鏈表表頭。mm_Tbloek_DataStruet是管理mm_Rblock_DataStruct的鏈表結(jié)構(gòu),rblock指向當(dāng)前位置的鏈表項(xiàng),next是指向下一個位置的鏈表項(xiàng)。mm_Rblock_DataStruct結(jié)構(gòu)是用來管理內(nèi)存塊的數(shù)據(jù)結(jié)構(gòu),size指明kblock所指向的內(nèi)存區(qū)域的大小,ref_count記錄了這個內(nèi)存空間的用戶個數(shù),kbloek是指向這個內(nèi)存塊空間起始位置的指針。

        本文引用地址:http://www.104case.com/article/150448.htm

        b.JPG


        1.2 μCLinux物理空間管理
        雖然μCLinux中對內(nèi)存地址的操作都是直接對物理內(nèi)存進(jìn)行的,但是仍然需要使用Linux中對物理頁幀的管理數(shù)據(jù)結(jié)構(gòu),μCLinux對物理空間管理主要有以下幾個方面:
        (1)物理內(nèi)存以頁幀為單位,頁幀的長度固定為4 KB,在內(nèi)核中使用page結(jié)構(gòu)來表示每個物理頁幀;
        (2)所有的page結(jié)構(gòu)形成一個mem_map表,mem_map表在系統(tǒng)初始化時由free_area_init()函數(shù)創(chuàng)建;
        (3)在物理內(nèi)存低端的bitmap表以位圖方式記錄了所有物理內(nèi)存的空閑狀況,它也是在系統(tǒng)初始化時由free_area_init()函數(shù)創(chuàng)建,bitmap表分割NR_MEM_LISTS組,對第i組初始化時設(shè)定長度為(end_mem_start_mem)/PAGE_SIZE/2(i+3),每位表示連續(xù)2i個頁幀的空狀況,置位為1表示其中一頁或幾頁已被占用;
        (4)用free_area數(shù)組記錄空閑的物理頁幀,free_area數(shù)組由NR_MEM_LISTS個free_area_struct結(jié)構(gòu)類型的數(shù)組元素構(gòu)成,每個元素均作為一條空閑塊鏈表的表頭,連續(xù)2i個空閑頁幀則掛到free_area數(shù)組的第i項(xiàng)后面,free_area當(dāng)前空閑頁面?zhèn)€數(shù)要大于系統(tǒng)中硬性規(guī)定的必須保留的空閑頁面的個數(shù)(5或者低于5的某個數(shù)值),如果不足規(guī)定的空閑頁面,則調(diào)用try_to_free_page()函數(shù)嘗試增加系統(tǒng)中的空閑頁面的數(shù)量;
        (5)Linux采用buddy算法分配空閑塊。

        2 嵌入式設(shè)備瀏覽器內(nèi)存管理策略
        應(yīng)用程序?yàn)g覽器內(nèi)存管理是在一塊已分配的內(nèi)存上進(jìn)行再組織內(nèi)存的使用方式,它不會涉及操作系統(tǒng)的內(nèi)存管理,但是可以借鑒操作系統(tǒng)的各種內(nèi)存管理方法,使對應(yīng)用程序級的內(nèi)存管理更高效。首先系統(tǒng)獲得一塊固定大小的內(nèi)存,然后把這塊內(nèi)存按照功能進(jìn)行固定分區(qū),圖2是Brow ser內(nèi)存管理各分區(qū)的布局。把從系統(tǒng)獲得的內(nèi)存分為4個區(qū):第一個區(qū)是Static Section,大小為20 KB,這個區(qū)主要用于保存全局性數(shù)據(jù)結(jié)構(gòu)GlobalCtlVar,50 Word大小的索引緩存(Indi-ces Buffer)和Pool Linked List。第二個區(qū)是String Map Section是一個對象表,大小為20 KB,用于存入數(shù)組結(jié)構(gòu)StrMap的數(shù)組,預(yù)定義數(shù)組大小為1 000,String Map功能之一類似于bitmap,用于管理空閑的數(shù)據(jù)塊。第三個區(qū)是Reserve Section(保留區(qū)),大小是20 KB。第四個區(qū)是Available Section,真正分配給用戶的內(nèi)存從這個區(qū)取出,有關(guān)pool的分配從上到下,有關(guān)Vector的分配從下到上。

        linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

        上一頁 1 2 3 4 下一頁

        評論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 青州市| 宝鸡市| 铁力市| 莒南县| 宜兴市| 都江堰市| 鸡东县| 瑞安市| 岳阳市| 洛浦县| 平顺县| 克什克腾旗| 石棉县| 江达县| 凤冈县| 钟山县| 雅江县| 桂阳县| 鹤壁市| 尚义县| 巴青县| 山东省| 讷河市| 疏附县| 孟州市| 华池县| 宁德市| 唐海县| 五指山市| 林西县| 西畴县| 依兰县| 商洛市| 东辽县| 丰都县| 黄大仙区| 和平区| 惠安县| 天峨县| 宕昌县| 云南省|