微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于嵌入式设备浏览器内存管理策略研究

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

时间:07-22 来源:互联网 点击:

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

    从理论上分析,由于内存管理器减少了存储每一个对象需要的一个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所示,从而达到了废弃内存区域的循环使用。
    (2)管理策略二:具有Compaction机制的Vector分配策略。在Browser中,除了结构大小固定的对象频繁分配和归还外,经常有大量大小不同的对象分配和归还,目前,这种现象主要出现在处理TextBox这一块内容上,这些大小不向的对象具有如下特点:其一是对象的分配和归还是随机发生的;其二是对象可以在其生命过程中改变自身大小。如果直接利用系统函数进行分配和释放,在总内存比较小的嵌入式系统中会造成过多的碎片,从而浪费了大量内存空间。具有Compaction机制的Vector通过移动“继续在用对象”来移除“继续在用对象”之间的“已经废弃不用的对象”,从而把“继续在用对象”移成连续排列,而“已经废弃不用的所有对象”所占用的空间解放出来放到地址空间的某一端,对它们进行循环使用,移动对象,最富有挑战的问题在于保证原来对内存空间的引用都被正确更新。当某个对象移往一个新位置,所有指向原地址的指针都将失效。虽然技术上有可能找出每一个移动对象的原有指针并更新之,但通常引入一个额外的间接层会使问题更简单:用户引用的是指向对象表中一个项目栏内对象的“handle”,而不再直接指向对象地址,“handle”是指向某对象真实地址的“惟一”指针,对象表中一个项目栏内有代表handle的addr、有表示对象所占空间的大小size和用于标志对象所占空间是否为“继续在用对象”还是“已经废弃不用的对象”的标志位mark。图4表示了对象引用、对象表和实际对象的三者关系。当内存中移动“继续在用对象”的时候,只需要更新对象表中相对应项目栏中代表handle的addr,使它指向对象的新地址,其他所有引用都可以继续正确地访问该对象。这里返回给用户的引用是对象表的索引,用户再通过索引获得相对应的handle指针addr,为了使用户快速获取可用索引,建立了50个可用索引的buffer。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top