您好、欢迎来到现金彩票网!
当前位置:众彩 > 分支限界 >

基于μCLinux嵌入式操作系统上的浏览器内存管理策略研究详解

发布时间:2019-05-14 10:16 来源:未知 编辑:admin

  在嵌入式系统中,由于设备性能限制系统总的可分配内存相对较小,而在嵌入式平台上浏览器正常运行所需内存一般都比较大,并且内存分配和释放操作也比较频繁,例如,IPTV EPG界面上显示各类菜单按钮、链接以及为用户提供动态和静态的多媒体内容时,往往EPG页面中存在着各种长短不一节目导航提示信息、各种表单、导航按钮以及图片等,对于这些要显示的对象需要通过数个矩形数据结构来表示它们。在界面排版过程中,随着上、下文的改变,会进行频繁的分配释放,例如把图片插入到网页的时候,网页会把一个局部区域内的显示对象释放然后重新生成,从内存管理角度来看,这导致了频繁的内存分配和释放。为了保证浏览器Browser的正常运行和减小内部碎片,本文在分析和研究μC嵌入式操作系统内存管理基础之上,提出运行在嵌入式设备上浏览器的内存管理策略,该策略主要针对浏览器中固定大小结构的频繁分配和释放,比如各种box,采用池式分配的方式(Poon)来管理固定大小结构的分配和释放;对于可变大小结构的分配和释放,比如字符串,采用Vector进行分配和释放。

  μCLinux是主流嵌入式Linux系统之一,其设计的目标平台是那些不具有内存管理单元(MMU)的微处理芯片。μCLinux对标准Linux修改最大的部分在于内存管理部分,而浏览器内存管理是在一块已分配的内存上进行苒组织内存的使用方式,把这块已分配的内存当作物理内存来使用。因此μ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是指向这个内存块空间起始位置的指针。

  虽然μCLinux中对内存地址的操作都是直接对物理内存进行的,但是仍然需要使用Linux中对物理页帧的管理数据结构,μCLinux对物理空间管理主要有以下几个方面:

  (1)物理内存以页帧为单位,页帧的长度固定为4 KB,在内核中使用page结构来表示每个物理页帧;

  (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()函数尝试增加系统中的空闲页面的数量;

  应用程序浏览器内存管理是在一块已分配的内存上进行再组织内存的使用方式,它不会涉及操作系统的内存管理,但是可以借鉴操作系统的各种内存管理方法,使对应用程序级的内存管理更高效。首先系统获得一块固定大小的内存,然后把这块内存按照功能进行固定分区,图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的分配从下到上。

  (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。

  如果对许多对象执行Compaction,那么整个Compaction过程是比较费时的,因此,什么时候执行Compaction将对一个应用程序的执行效率有着重大影响。原则是:在内存空间和可用索引能够满足分配的情况下,能不要Compaction就不要执行Compaction。因此建立了两个执行Compaction的触发点,一个触发点是当用完了预分配1 000个索引值时;另一个触发点是当没有可用内存空间用于分配时触发。结果,在许多情况下避开了Compaction过程。对于管理索引值问题,采用了如下简单算法:先取前50个索引值放到Index Buffer中,用完50个索引值以后,再取50个索引值放入Buffer中,直到预分配的1 000个索引值用完为止,这时执行Compaction,然后按顺序搜索对象表,如果对象表表项标志为可以重复利用,则把这个对象表表项的索引加入到Index Buffer之中,直到填满Index Buffer为止;如果1 000个索引值已经全部用完,则按100为单位动态增加索引值。在Vector中,存放对象表需要一些额外的空间,大量对象的Compaction会占用比较多的时间,从而降低时间效率。

  Browser分别调用自己应用程序级的内存管理的接口与系统级的内存管理的接口进行运行比较,结论是应用程序级的内存管理效率比系统级的内存管理效率要高,网页越大,体现出来的效率越高。

  对于Browse中各种固定大小的结构(这种结构称谓thing),分别用相对应的一个内存池(pool)进行管理,各个pool形成一条pool链,内存管理器在执行一段时间后会按照各个pool的调用频率高低对pool链进行排序,从而提高了查找pool的效率。用小网页、中等大小网页和大网页对pool链中的各个pool进行测试,得到如图5所示的结果。

  如果对许多对象执行Compaction,那么整个Compaction过程是比较费时的,因此,什么时候执行Compaction将对一个应用程序的执行效率有着重大影响。原则是:在内存空间和可用索引能够满足分配的情况下,能不要Compaction就不要执行Compaction。因此建立了两个执行Compaction的触发点,一个触发点是当用完了预分配1 000个索引值时;另一个触发点是当没有可用内存空间用于分配时触发。结果,在许多情况下避开了Compaction过程。对于管理索引值问题,采用了如下简单算法:先取前50个索引值放到Index Buffer中,用完50个索引值以后,再取50个索引值放入Buffer中,直到预分配的1 000个索引值用完为止,这时执行Compaction,然后按顺序搜索对象表,如果对象表表项标志为可以重复利用,则把这个对象表表项的索引加入到Index Buffer之中,直到填满Index Buffer为止;如果1 000个索引值已经全部用完,则按100为单位动态增加索引值。在Vector中,存放对象表需要一些额外的空间,大量对象的Compaction会占用比较多的时间,从而降低时间效率。

  Browser分别调用自己应用程序级的内存管理的接口与系统级的内存管理的接口进行运行比较,结论是应用程序级的内存管理效率比系统级的内存管理效率要高,网页越大,体现出来的效率越高。

  对于Browse中各种固定大小的结构(这种结构称谓thing),分别用相对应的一个内存池(pool)进行管理,各个pool形成一条pool链,内存管理器在执行一段时间后会按照各个pool的调用频率高低对pool链进行排序,从而提高了查找pool的效率。用小网页、中等大小网页和大网页对pool链中的各个pool进行测试,得到如图5所示的结果。

  首先我们察看在打开网页的过程中在没有执行Compaction的情况下,Vector中的内存使用情况,如图6所示,由图可知,标志为蓝颜色区域是正在使用的内存空间,白颜色表示已经废弃不用的内存空间。在没有Compaction以前,已经废弃不用的区域占用了大量的内存空间,在执行Compaction以后,所有正在使用的区域都会整齐地排列在内存的高端,从而提高了内存的使用效率。

  首先从系统堆中分配出4 MB的内存,然后对这4 MB的内存进行应用程序级的内存管理,为了测试应用程序级的内存管理的各项性能指标,使用小、中和大三种网页对总体内存使用情况进行了统计,并且做了与调用系统内存分配和释放接口进行性能比较。表1是实验网页文件大小以及性能占用数据表,图7是运行一个大网页的时候,所有内存池占用空间和Vec-tor所占用空间的比例图,图8是针对一段关键上下文,

  调用应用程序级的内存管理接口和调用系统级的内存管理接口对三种大小不一的网页在执行这段上下文的时候所用平均时间的比较。从图8中可以看出,网页越大,内存管理的性能越优于直接运用系统的内存管理。

  本文主要在对嵌入式操作系统μCLinux内存管理进行分析和小结的基础之上,根据Browser实际运行情况,提出了运行在嵌入式设备上浏览器的内存管理池式分批和Vector分配策略,并分析了这种策略的特点和性能。最后通过实验数据来分析并得出浏览器分别调用应用程序级的内存管理的接口与系统级的内存管理的接口进行运行比较,得出应用程序级的内存管理效率比系统级的内存管理效率要高。

  将原来动态开辟的动态内存重新开辟一个字节数,如果这个数比以前的大,前面的数据保存。如果比原来的小,保...

  专用的停车场嵌入式计算机系统,集成视频采集、通讯、防雷、存储以及数据库。嵌入式停车场系统,针对传统停...

  路由(Routing):路由是指从一个设备(一般指路由器)的接口上接收到数据包,依据设备所既定的某些...

  计算机用于嵌入式控制设备领域的历史和计算机本身的历史一样久远。最初的用于控制机电式电话交换器的通讯设...

  现在 广泛用于各类计算应用,不仅包括 微型 腕表、手持设备( 和蜂窝电话)、因特网装置、瘦客户机、防...

  就拿简单的一个芯片厂商提供的demo来说,代码也会被细分到寄存器操作(Drv层)、板级支持包接口(B...

  究竟应用使用静态分配还是动态分配,一直是嵌入式系统设计中一个争论不休的总是。当然,最合适的答案是对于...

  尽管 FPGA 为嵌入式设计带来了强大的功能与灵活性,但额外的开发流程也给设计工作增加了新的复杂性和...

  在Internet的日益普及,信息共享程度的不断提高的今天,人们的工作和生活方式已经有了革命性的改变...

  为了保护数据不被泄漏,我们使用软件和硬件防火墙来限制外部未经授权的访问,但是数据泄露也可能发生在内部...

  stream算法的原理从上图可以看出非常简单:某个内存块之间的数据读取出来,经过简单的运算放入另一个...

  硬盘的历史中,以往并行接口的 IDE 硬盘已经逐渐退出市场,而 SATA 串行机械硬盘,目前已是主流...

  新的内核总是会定期发布出来,但是其实大家并不是十分了解内核是如何被深入测试的。那么这里可以提前告诉大...

  作者十年来做过小的嵌入式系统,大的电信系统以及基于web的系统。使用过C ++,Ruby,Java和...

  对于嵌入式系统来讲,嵌入式软件相当于嵌入式系统的灵魂,整个嵌入式系统如何工作,都是由嵌入式软件来控制...

  作为嵌入式工程师,写一个效率高效,思路清晰的C语言程序是我们的终极目标,那么,怎么才能写好这样的程序...

  1、内存管理我们需要知道——变量,其实是内存地址的一个抽像名字罢了。在静态编译的程序中,所有的变量名...

  单片机和嵌入式,其实没有什么标准的定义来区分他们,对于进行过单片机和嵌入式开发的开发者来说,都有他们...

  嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、...

  嵌入系统开发已经趋于规范化,但是嵌入式系统的开发并不像在普通PC机上进行软件开发那样容易,它同样需要...

  可以看到,测试所使用的机器配置十分强劲,英特尔酷睿 i7 5775C 仍然是强大的 CPU,特别是其...

  做电子硬件开发,常常要为设计一个良好的用户界面(UI)伤透脑筋。因为界面开发是个细致活,设计一个界面...

  Cortex-M这类微控制器编程通常采用C代码,那么编程人员如何编写代码才能让C编译器产生高质量底层...

  由于分析师对2019年全球半导体市场的预期比较悲观,全球最大存储芯片供应商三星电子正考虑放缓扩大生产...

  大家应该看过很多优秀的水冷装机效果图,大多用BP、EK等国外大牌的水冷件,视觉效果确实攒,我也很是羡...

  Anaflash(加利福尼亚州圣何塞)是一家初创公司,它开发了一种测试芯片,用于演示在逻辑兼容的嵌入...

  时光倒退二十年,彼时不可一世的微软将开源软件视为眼中钉肉中刺,甚至吐槽其是知识产权的癌症。如今,从“...

  近年来,以PC机为代表的通用计算机系统在硬件和软件方面都取得了飞速的发燕尾服,处理器的运算速度已经达...

  嵌入式工业控制机特指深藏于工业系统内部,完成一种或多种特定工业任务的计算机。一个成功的工控机要具有开...

  美光旗下品牌英睿达(Crucial)宣布已经开始出货自家容量最高、速度最快的服务器级内存,128GB...

  市场调研机构Gartner送出的最新报告显示,2017年全球半导体行业发生了大变革,从1992年以来...

  在2009年英特尔大学峰会上,记者遇到一位厦门大学通信工程系教师,他表示他们一直都对英特尔的嵌入式产...

  AMD 7nm Zen2处理器预计将在明年一季度大规模上市,其中第二代EPYC霄龙先行,随后是消费级...

  整个内存市场,在2018年的最后俩月里,稍微让人缓了口气,内存价格一路走低,到了双十一期间,有些品牌...

  未来,嵌入式发展趋势将会不断提高技术门槛、产品开发周期不断压缩、向智能系统演变、向成体系系统演变、嵌...

  2018年行将落幕,PC DIY市场依然是负重前行,不过自中旬开始的内存、SSD降价一定程度上为攒机...

  游戏玩家装机首先看显卡,其次看处理器,这两个部件是影响游戏性能最关键的。在处理器、显卡之外呢?内存也...

  嵌入式计算已经笑傲江湖多年,然而,最近它的地位似乎正在受到某种撼动。全球最大的开源基金会——Apac...

  我今天写了一个小小的python程序,可以在完全不看源代码的情况下,分析a如果调用b.so的时候,会...

  作为大陆市场显卡销量NO.1,一直以来很多人都以为七彩虹只是专注于生产显卡的公司,其实除了显卡,在主...

  Make可以从一个名为Makefile的文件中获得如何构建程序的知识,该文件列出了每个非源文件以及如...

  嵌入式工控机最主要的特点就是抗潮抗高温,适应环境能力强,所以他可以适用于各种设计,工业的场合,他大大...

  试想一下,若智能手机还用台式电脑的CPU,那终成型产品得有几十斤,那样的手机还有人买吗?因此嵌入式系...

  作为一名在嵌入式行业摸爬滚打许久的老鸟,回想自己的经历之路,那么漫长可又仿佛近在眼前。随着学生的日益...

  奇趣科技公司日前宣布与日本主要的嵌入式系统集成商Nissin达成合作协议,携手为日本市场提供基于的嵌...

  这两年,DRAM芯片和内存条价格经历了一波疯涨,如今已经慢慢回归理智,而在另一方面,NAND闪存产能...

  已有几家初创企业在开发专门的机器学习芯片,但上述这些应用不仅仅要集成机器学习,还有计算机视觉,传感器...

  SoC和MCU需要外部电路实现电源管理、人机接口或连接传感器。因此,设计中几乎总是需要比较器、运算放...

  本文用off-cpu火焰图分析一个程序的延迟(主要在拿锁上),找出来瓶颈,并消除该瓶颈的故事。本文非...

  我这个专业没学过C++,一开始不知道什么是向对象,什么叫面向过程,这可能让大家笑话了。不过这说的是实...

  Boot中包含了CPU的初始化代码,Memory与外围接口的初始化代码,随后会回引系统(OS),最后...

  从和林总的谈线年就已经研发成功物联网操作系统,在大多数企业对物联网还没有...

  据相关消息了解到,美光公司已经带来了2019财年Q1季度财报,当季营收79.1亿美元,同比增长16%...

  AMD内存管理技术一直在不断完善中,因此厂商也会对BIOS进行升级。虽然个人不太建议没有遇到问题的情...

  我是学物联网工程的,在学校编程和嵌入式都有学习,前段时间集中实践发现自己对嵌入式挺感兴趣的,但身边从...

  TI AM437x高性能处理器基于ARM Cortex-A9内核。 这些处理器通过3D图形加速得到增强,可实现丰富的图形用户界面,还配备了协处理器,用于进行确定性实时处理(包括EtherCAT,PROFIBUS,EnDat等工业通信协议)。该器件支持高级操作系统(HLOS)。基于Linux的® 可从TI免费获取。其它HLOS可从TI的设计网络和生态系统合作伙伴处获取。 这些器件支持对采用较低性能ARM内核的系统升级,并提供更新外设,包括QSPI-NOR和LPDDR2等存储器选项。 这些处理器包含功能方框图中显示的子系统,并且后跟相应的“说明”中添加了更多信息说明。 处理器子系统基于ARM Cortex-A9内核,PowerVR SGX图形加速器子系统提供3D图形加速功能以支持显示和高级用户界面。 可编程实时单元子系统和工业通信子系统(PRU-ICSS与ARM内核分离,允许单独操作和计时,以实现更高的效率和灵活性.PRU-ICSS支持更多外设接口和EtherCAT,PROFINET,EtherNet /IP,PROFIBUS,以太网Powerlink,Sercos,EnDat等...

http://jigsawesl.com/fenzhixianjie/236.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有