基于嵌入式设备浏览器内存管理策略研究
摘要:为了解决嵌入式设备中内存频繁分配和释放所引起的内存碎片以及浏览器正常运行难问题,提出具有垃圾回收机制的可动态增长池式分配数据结构设计和具有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的分配从下到上。
管理 策略 研究 内存 浏览器 嵌入式 设备 基于 相关文章:
- 利用udev在/dev下动态生成/移除设备文件(04-21)
- Linux内存使用的体会 (04-23)
- 无线动物识别和跟踪管理系统的设计(02-14)
- 嵌入式操作系统uCLinux详解(03-19)
- 微控制器省电管理方法(05-04)
- Linux 时钟管理(06-13)