2022年嵌入式系统中池式内存分配方法的分析 .pdf
《2022年嵌入式系统中池式内存分配方法的分析 .pdf》由会员分享,可在线阅读,更多相关《2022年嵌入式系统中池式内存分配方法的分析 .pdf(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、总第220期2008年第2期计算机与数字工程Computer&D igital EngineeringVol.36 No.257嵌入式系统中池式内存分配方法的分析3王明路 王希敏 王 哲(海军工程大学武汉 430033)摘 要 介绍适合嵌入式系统应用的池式内存分配方法,详细分析AD公司开发的一种实时操作系统核V isual DSP+Kernel(VDK)、嵌入式可配置实时操作系统eCos以及自适应通信框架ACE中的池式内存分配方法及具体应用。最后,针对平台异构及嵌入式实时操作系统RTOS的多样性导致的应用软件可复用性差问题,给出使用池式内存分配方法框架开发嵌入式系统软件的思路。关键词 池式内存
2、分配方法RTOSVDKeCosACE中图分类号TP316.21 引言嵌入式系统的应用领域越来越广泛,可供选择的嵌入式微处理器的种类也越来越多,包括 MPU、MCU、DSP等,这些嵌入式微处理器的内存资源差异很大。嵌入式实时操作系统RTOS是一个高效率的实时多任务内核,能够适应若干系列的嵌入式处理器,对内存、设备等资源进行管理。但是目前,还没有一个通用的RTOS适用于所有处理器,在开发嵌入式系统软件时,软件开发人员需要设计适合特定平台的内存分配方法,对内存资源进行管理,程序可复用性差。因此,设计灵活的、可移植的嵌入式应用软件成为目前研究的热点。模式、类库以及框架,是软件工程领域用以降低软件开发的
3、复杂性和成本的三种工具 1,可以有效解决由于平台异构带来的软件复用问题。开发出一个基于内存资源管理的框架,实现软件设计与硬件无关,将大大提高嵌入式软件的复用性。池式内存分配方法采用内存池管理内存,内存池是一块预先分配好的内存,在程序运行时为对象分配一定数量的内存。由于在内存池中预先划分出了若干内存块,采用高效的内存管理算法用于内存分配,可以有效降低内存碎片的产生,提高内存利用率,满足嵌入式软件设计的需要。池式内存分配方法在RTOS中得到了广泛应用。如AD I公司开发的一种实时操作系统核V isu2al DSP+Kernel(VDK),设置内存池对堆内存进行管理,实现简单、分配效率高,主要解决调
4、用mall oc分配内存时带来的堆中内存有碎片、分配与回收所需时间不确定两个主要问题。嵌入式可配置实时操作系统eCos 内存管理部分提供了多种方式的内存池,可满足不同应用需求,malloc函数本身也采用内存块大小可以变化的内存池分配内存。ACE中,内存管理类采用内存池分配内存,其中用于局部的动态分配类将动态堆内存的分配转化成为程序运行预先进行一次性堆分配的方式 2,避免动态内存分配所带来的问题。然而,VDK 的内存池只能分配大小固定的内存块,灵活性差;ACE 和eCos 的内存池可以动态分配内存块,但是内存池管理的内存空间通过定义全局数组的方法创建,将数组名作为内存池地址指针传递给生成函数,实
5、现起来固然简单,但是不够灵活,并且由于eCos 存在移植问题,内存池无法对具体平台作出优化处理。综上所述,如果针对嵌入式系统应用设计一个管理内存资源的框架,在框架中使用改进的池式内存分配方法,既可以有效管理嵌入式系统的内存资源,又能解决平台异构及RTOS的多样性带来的软件可复用性问题。2池式内存分配方法从内存池可分配内存单元大小来分,分为固定块大小内存分配方式的内存池和可变块大小内存分配方式的内存池 3。固定块大小内存分配方式3收稿日期:2007年10月30日,修回日期:2007年11月27日作者简介:王明路,男,硕士研究生,研究方向:计算机接口技术。王希敏,女,副教授,研究方向:军用仿真系统
6、体系结构。王哲,女,硕士研究生。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 7 页 -是指内存池中划分的内存块大小不变。可变块大小内存分配方式是指内存块大小可根据用户请求变化。池式内存分配方法的内存管理系统涉及了内存块的划分方式、组织方式、分配和回收方式,下面对这两种内存池分配方式分别介绍。2.1 固定块大小内存分配方式2.1.1内存块的划分及组织方式通常采用位图数组或单链表方式对内存块进行组织、管理。图 1是采用位图数组管理内存池的示意图,图中将一块内存划分成n个大小相等的内存块,用大小为n的 bitmap数组存储内存块的分配信息,0/1表示分配情况,它们的对应关系如图1所
7、示。图 2是采用单链表管理内存池的示意图,单链表中每个节点存放未被分配内存块的地址和下一个未被分配内存块地址等信息,图中链表中节点保存未被分配内存块0、1、n的内存地址。图1位图数组的图2单链表的数据结构 数据结构2.1.2内存块的分配及回收内存块的分配及回收采用的算法为最先适应算法,采用位图数组时,遍历数组,找到第一个未被分配的内存块,将其对应内存块分配出去,并对数组进行修改;回收时,直接修改数组信息。采用链表时,取出第一个节点中存放的内存块地址,将其返回给用户,并删去该节点,回收内存时,新建一个节点存放待回收的内存块地址,将其插入链表中。这两种组织方式实现都比较简单,分配效率高。采用位图数
8、组方式,当分配的内存块比较多时,遍历次数增加,链表方式不存在遍历问题,但是容易造成空间上的浪费。2.2 可变块大小内存分配方式根据实际需要,分为内存块静态设置的可变块大小分配方式和内存块大小动态变化的可变块大小分配方式。2.2.1内存块静态设置的可变块大小分配方式当需要的内存块有几种已知大小规格时,将内存块按大小分组,每组建立一个链表,每个链表管理大小相同的内存块,设置一个结构体数组存放这些链表的信息,图 3为一个预设为4种大小不同的可变块内存池组织情况图。采用最先适应算法进行管理。分配时,首先查找内存块适合存放的链表,将链表中的第一个内存块地址返回;回收时,将要回收的内存放到相应大小的链表中
9、。图3 可变块内存地组织2.2.2 内存块大小动态变化的可变块大小分配方式如果用户请求分配的内存大小随应用而变,这时,内存池中空闲内存块的大小也应该是动态可变的,采用链表方式组织未被使用的内存块。每个节点存放未被分配内存块的地址及其内存块大小。初始化时,表中只有一项,未被分配内存块的地址为内存池的起始地址,内存块大小为该内存池的大小。随着应用程序不断地申请和释放内存块,内存池被划分成多个内存块。内存块大小可变的内存池采用的算法有最先适应算法,最佳适应算法及一些特殊算法。最佳适应算法将内存池中和所需大小最接近的未被使用内存块分配给用户,此时内存池中内存块按照大小递增顺序排成链表,分配时,找到第一
10、个能满足的内存块,将其分配出去。回收时,将要回收的内存放到链表中。最先适应算法、最佳适应算法简单易行,但是,首次适应算法会使存储器的前端出现很多小的内存块,导致查找次数的增加,最佳适应算法查找满足要求的最小块,因而它保证剩下的碎片尽可能的小,但结果却使得内存很快被分成许多很小的块。为了避免碎片,采用一些特殊算法,如Doug Lea算法,可以有效解决上述碎片问题,但是算法复杂,适合复杂的嵌入式应用。此外,通过遍历内存池,还可以得到一些关于85 王明路等:嵌入式系统中池式内存分配方法的分析第36卷名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 7 页 -内存池的信息。采用池式内存分配
11、方法,内存池由用户按照实际需要划分内存块,减少了内存碎片,内存管理器调用预定义的池,内存分配效率高,满足了嵌入式系统对内存分配快速、准确的要求,合理使用了有限的内存资源。但在实际应用中,由于嵌入式平台的异构,RTOS中的池式内存分配方法对具体的平台应用有很大的局限性。下面将分析VDK、eCos和 ACE 中采用的池式内存分配的方法与应用,对池式内存分配的方法作进一步探讨。3VDK中的池式内存分配方法与应用V isualDSP+Kernel(VDK)是 AD I公司开发的一种实时操作系统核 4,适用于AD I公司生产的 SHARC和 Tiger SHRAC系列芯片。基于VDK的程序中,链接描述文
12、件(LDF)定义了程序与数据在存储器中的映射空间,描述了数据段、堆段和栈段的存储位置,VDK 中设置内存池(memory pool)是对堆段内存部分进行分配。3.1VDK 中的池式内存分配方法3.1.1内存块划分及组织方式VDK 中的内存池采用固定块大小内存分配方式。内存池的内存映像如图4所示,内存池占用一块连续地址,分为内存池控制区和实际内存块两部分。内存池控制区部分包含有内存池的基本信息:内存池地址,内存块首地址,内存池号,内存池大小,内存块数量,内存池分配情况等等;实际存储区存放内存池中的内存块。图4 内存池控制区定义内存池时,可以在指定的堆中定义,还可以选择是否对内存池预先划分内存块。
13、预先划分内存池时,内存池采用链表方式对内存块进行组织,图 4中,内存池控制区设置一个字存放第一个空闲内存块的地址,即链表头指针,链表内的节点是池中的内存块,内存块的首字参与了内存块的组织,它存储下一个空闲内存块的地址,最后一个内存块首字指向NULL(0 x00000000)。定义内存池但不预先划分内存块时,只对内存控制区的存储信息进行修改,不对内存池进行实际划分,当分配内存块时,根据内存控制区提供的信息对内存块从高地址端进行依次划分。3.1.2 内存块的分配及回收采用首先适应算法对内存块进行分配、回收。内存池选择为初始化定义时,通过遍历链表方式,找出首个空闲块,返回其地址,完成对所需内存的分配
14、;内存池回收时,只调整链表结构。当内存池定义但未初始化时,内存控制区提供空闲块个数、分配位数等信息对内存块从高地址端划分出内存块,将其内存块地址返回;回收时,调整控制信息位。3.2内存池的接口函数内存池提供关于内存池的AP I函数:创建函数CreatePool,增强的创建函数CreatePoolEx,分配函数 Mall ocB lock,回收函数FreeB lock,获得信息函数Get NumAllocatedBlocks等对内存池进行分配、回收等管理操作,方便用户对内存池的调用。3.3内存池的应用3.3.1 内存池的创建内存池创建方式有两种:一种是在编译开发环境VDSP+中静态设定内存池;一
15、种是在程序运行时通过调用AP I函数动态创建内存池。动态创建内存池代码如下:VDK:PoolIDmp1=VDK:CreatePool(32,4,0);/创建有4个内存块,每块大小为32bit的内存池3.3.2 内存池的使用使用内存池时,通过 MallocB lock分配内存块、Free Block函数回收内存块。使用内存池代码如下:if(VDK:GetN u mA llocatedB locks(mp1)4)/判断内存池是否已满void3it1=VDK:M alloc B lock(mp1);/取得一个内存块memcpy(it1,(void3)item,sizeof(int);/将数据存放到数
16、据块中VDK:FreeB lock(mp1,it1);/将内存块归还给内存池4eCos下的池式内存分配机制与应用嵌入式可配置实时操作系统eCos是源代码开放的 RTOS。eCos 的内核用C+实现,内存分配类包含在services配置包中。eCos的内存管理通过内存池对象来实现。eCos支持固定块和可变块两种内存分配方式 5,如图 5所示。4.1固定块内存分配方式的内存分配类95第36卷(2008)第2期 计算机与数字工程 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 7 页 -图 2中,Cyg_ Mempool_Fixed_ I mple mentation是固定块大小内存分
17、配方式的具体实现类,Cyg_Mempool_Fixed是提供给用户的接口类。固定块内存分配方式采用位图数组对内存池进行管理,类中设置一个位图数组指针,每个位图是一个32位大小的字,利用字中每位的0/1值表示内存块的使用情况。内存分配与回收算法采用最先适应算法。对内存块进行分配,首先遍历Bitmap数组,找到第一个为0的 Bitmap位,返回对应的内存块地址,回收时,将内存块相应的Bitmap位设置为1。固定块内存分配方式类实现简单,适合所需内存块大小相等的情况。4.2 可变块内存分配方式的内存分配类实现可变块内存分配方式的内存分配类有:4.2.1简单可变块大小内存分配类具体实现类为Cyg_Me
18、mpool_Variable _ I mple2mentation,Cyg_ Mempool_Variable是其接口类,适用于申请内存块大小未知的情况。简单可变块大小内存分配方式采用双向链表方式管理内存池,采用的分配算法为最先适应算法。具体为:从头开始遍历内存池,当所需内存大于内存块大小时,查找下一个内存块;当所需内存等于内存块大小时,将该内存块分配给用户,删除链表中的节点;当所需内存小于内存块大小时,将内存块分成两部分,其中后一块内存大小等于所需内存,分配给用户,调整链表;回收时,将内存块按顺序存放在链表中。4.2.2分离数据元可变块大小内存分配类具体实现类为Cyg_Mempool_ Se
19、pmeta _ I mple2mentation,Cyg_ Mempool_Sepmeta 是它的接口类。分离数据元可变块大小内存分配方式采用两个双向链表方式管理内存池,一个存放未被分配的内存块,一个存放已分配的内存块。链表中节点除有两个指针指向前一块和后一块内存块外,还有指向前一块和后一块物理上相连的内存块。采用这种组织方式,可以将物理上连续的内存块合并成一个大的内存块,可以在一定程度上避免产生碎片。采用的分配算法为最先适应算法,分配与回收过程于简单可变块大小内存分配方式类似。4.2.3采用 Doug Lea算法的内存分配类具体实现类为Cyg_Mempool_dlmalloc_ I mple
20、2mentation,Cyg_Mempool_dlmalloc是接口类。采用Doug Lea内存分配算法,尽量对最佳兼容性、适应性好、占用空间尽量少、最小分配时间、粒度尽量可调、使异常减少等方面的要求进行平衡设计。适用于申请内存的大小未知情况,用于比较复杂的嵌入式应用。该方式采用容量仓 5对内存块进行组织,容量仓是一个存储各种块大小的结构体数组,每个仓中有一个存储大小相同块节点的双向链表。具体组织方式为:所有内存块都放在容量仓中,共有128个大小容量仓,每个仓中内存块大小相同。对于小于512bit的容量仓,每仓内存存放固定大小的块,内存块从16bit 开始,以 8bit 递增,直到512bit
21、为止;大于 512bit的块,按块的大小递增排列。采用 Doug Lea内存分配方式采用最先适应算法和最佳适应算法相结合的算法,应用性更好。DougLea分配算法描述为:首先查找最近使用的内存块,如果还剩余足够大的内存,将其剩余内存部分分配出去;如果没有,查找合适的容量仓,将空闲块分配出去。使用内存分配类时,可以直接使用上述定义;系统提供模板类Cyg_ Mempolt2,根据用户在配置工具中的设置,模板类可实例化可选的内存池对象。4.3内存池的接口函数eCos 通过系列 API函数,对内存池进行操作,包括:创建、删除、分配、释放、查询等待、查询信息等。通过设置 API函数,隐藏内存池类的具体实
22、现。4.4内存池的应用eCos 的内存使用可使用上述的AP I函数进行内存的分配与回收。还可直接使用内存分配类对内存进行管理。以固定块大小内存分配为例介绍内存池的使用,程序如下:static int memfixM EM _POOL_SI ZE;/内存块定义static cyg_mempool_fixfix_mempool;/内存池类型定义static cyg_handle_t fix_mempool_h;/内存池句柄,指示内存池cyg_mempool_fix_create(memfix,sizeof(memfix),32,&fix_me mpool_h,&fix_mempool);/初始化内
23、存池m thread_a_count=(int3)Cyg_mempool_fix_ try_al2loc(var_mempool_h);/分配内存cyg_mempool _ fix _ free(var _mempool _ h,(int3)m thread_a_count);/回收内存5ACE下的池式内存分配机制与应用自适配通信环境ACE 是高度可移植的开源代码主机基础设施中间件工具包,它提供一组丰富的可重用C+包装外观(wrapper facade)和框架组件,其中包括内存管理部分。06 王明路等:嵌入式系统中池式内存分配方法的分析第36卷名师资料总结-精品资料欢迎下载-名师精心整理-第
24、4 页,共 7 页 -图5ACE分配器族类 ACE 提供了两个分配器族:对堆内存进行管理的 ACE _A llocator和对共享内存管理的ACE _Mall oc。ACE_Mall oc类族是基于类模板的,它对进程间共享的内存,即共享内存进行管理,不适合应用于嵌入式实时系统,这里不作介绍。ACE_A llo2cator分配器类族的内存分配类的继承关系如图5所示,ACE_A llocator是类族的基类。类 ACE_New_A llocator对 C+的内存分配函数new和delete进行封装,实现直接从堆中分配内存。5.1 内存分配类ACE_Static_A llocator类 ACE_St
25、atic _A llocator预分配一个地址、大小固定的内存池。定义的内存池采用可变块大小分配方式,不使用链表组织内存块,类中定义了内存池首地址、位移量和内存池大小,通过这些信息移动指针,分配内存块。当申请一个内存块时,将根据块的大小以及对象中的偏移量,算出块在内存池中的位置,返回内存块的地址,同时对偏移量进行修改。5.2 内存分配类ACE_Cached_AllocatorACE_Cached_A llocator是一个类模板,是一个固定尺寸的强类型分配器,内存池中内存块大小固定。它将内存对象保存在一个容器中。申请内存块时,将容器中的内存块地址返回。采用的算法为首先适应算法。5.3 内存分配
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年嵌入式系统中池式内存分配方法的分析 2022 嵌入式 系统 中池式 内存 分配 方法 分析
限制150内