新闻中心

EEPW首页>嵌入式系统>设计应用> 基于嵌入式设备浏览器内存管理策略研究

基于嵌入式设备浏览器内存管理策略研究

作者: 时间:2011-07-22 来源:网络 收藏

c.JPG


(1)一:具有垃圾回收机制的可动态增长的池式分配。与传统固定大小的池技术相比,在此引入了具有垃圾回收机制的可动态增长的池式分配,其数据结构如图3所示。由于会根据需要而动态增长,因此不用预测池的大小;由于具有垃圾回收机制,因此可以循环使用池内空间。使用多种box对象,并经常对它们进行分配和归还,但典型的器会为每一个对象存储一个header(表头),对小对象而言这些headers可能会使程序的内存需求加倍,此外,在一个共享的heap中分配和归还小对象会带来碎片风险,并因大量动态对象而增加时间。因此,对每种分配和归还频繁的box对象分别建立一个对象池,各种对象池形成一个poollinkedlist。一个对象池首先预先分配一个固定大小的arena并按对象大小对arena进行格式化,当用完arena的最后一个对象时,对当前的pool进行垃圾回收,把回收的空间放入这个pool的freelist当中,用户可以重用freelist上的空间,如果垃圾回收后发现在这个pool中已经没有可用空间,则动态分配一个arena。从这种池式分配的过程来看,对arena的分配采用了动态分区方式,对arena中结构对象的分配采用了固定分区方式。

f.JPG

从理论上分析,由于内存管理器减少了存储每一个对象需要的一个header(表头)大小(在这里这个表头是GCThing,GCThing由next指针、flagp指针组成),并且减少了碎片,池式分配能够在较少内存中存储更多对象,减少系统的整体内存需求。同时,通过一个具有垃圾回收机制的可动态增长的内存池来容纳一类小型结构对象,使这些小型结构对象在内存中紧密排列,因而降低分页系统中的paging频率及其带来的额外开销。由于本方案实现的分配和归还函数性能较好,因而提高了时间效率和实时响应能力。但是,对于每个arena,由于在最后剩余空间不能容纳一个结构对象的大小,那么这块剩余空间就会成内部碎片。当然,求出arena的合理大小会使内部碎片减少到几个字节,甚至是没有内部碎片;特别是每个pool的最后一个arena,由于这个arena最有可能没有放满结构对象,因此可能会有比较多的空间浪费。
用户从arena中分配走内存空间,图3中标有allocated space的区域(这块区域由其上面的GCThing数据结构进行管理,GCThing由next指针、flagp指针组成),当用户用完这块内存空间,应用程序级的内存管理应该如何重用它,以及在什么时候重用它。采用位图与垃圾回收机制结合来重用在arena中已被用户废弃的内存空间。在图3中的FLAG SECTION其本质上是一个bitmap,在FLAG SECTION中最小的单位是一个字节而不是一个位,在FLAG SECTION中每一个flag都与一个按存放结构大小进行格式化后的内存区域相对应,在图3中用GCThing数据结构中的flagp指针处理flag与其相对应的内存区域之间相互挂钩,用flag字节来表示其相对应的内存区域是正在使用,还是用户已经废弃,或是已经被的内存管理器回收。用户通过的内存管理器获得一块内存区域,内存管理器把相对应的flag置为正在使用;用户通过内存管理器释放分配给它的内存区域,内存管理器把相对应的flag置为已经废弃;内存管理器回收flag标志为已经废弃的内存区域,把回收的内存区域通过GCTh-ing数据结构挂到以freeListHead为头指针的空闲块链表中,如图3所示,从而达到了废弃内存区域的循环使用。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭