嵌入式系统内存管理方案研究
3 RTEMS动态内存管理
RTEMS动态内存管理机制提供两种分区机制,Partition和Region。
Partition分区管理用于固定大小内存块的分配,Region分区管理 用于可变大小内存块的分配。
3.1 固定长度分区管理
RTEMS定义的固定长度的分区(Partition)是一段连续的内存空间。它可以被划分成固定长度的内存块(buffer),允许应用在创建分区时配置分区的大小和内存块的大小,要求分区的大小是内存块的整数倍。例如,应用创建一个大小为1024字节的分区,内存块为256字节,如图2所示。
创建分区时,RTEMS根据分区和内存块的大小,形成一个空闲内存块的双向链表。当从分区中申请内存块时,按照空闲内存块链表的顺序分配。如果空闲空间不足,调用者不会被阻塞,而是获得一个空指针,以确保申请内存调用的时间确定性。释放内存块时,将该内存块挂在空闲内存块链表的链尾。分区被删除时将释放出这段连续的内存空间。
RTEMS的分区管理机制提供以下API:
rtems_partition_create 创建一个分区
rtems_partition_ident 获得分区标识号
rtems_partition_deldet1 删除一个分区
rtems_partition_get_buffer 申请一个内存块
rtems_partition_return_buffer 释放一个内存块
RTEMS的固定长度分区管理算法有以下特色:
①系统创建的分区数目可在运行时动态增减。
②内存块的控制结构所占用的内存空间在该内存块被分配出去时会变为可用空间,不会影响该内存块实际可用的大小;而在回收时控制块会自动生成,这一点使得分区管理的系统开销对用户的影响为零。
③在分区的内存块中还可以再定义分区,这就意味着内存块可以很容易地被分为子内存块,提高了分区管理的灵活性。
javascript:window.open(this.src);" style="cursor:pointer;"/>
3.2 可变长度分区管理
RTEMS定义的可变长度的分区(Region)是一段连续的、大小可配置的内存空间,可以被划分成很多大小不一的段(Segment)。创建分区时要指定一个分配单元,称为页。段的大小是页的倍数,如果应用程序在申请段时,给出的大小不是页的倍数,内核会将其调整为页的倍数。例如,应用从而大小为512个字节的分区中申请一个大小为700字节的段,那么,内核实际分配的段大小为1024字节。
创建Region分区时,RTEMS根据分区大小和页小建立分区的控制结构和段的控制结构。在创建之初,只有一个空闲段,其大小为分区的大小减去控制结构的内存开销。随着应用申请、释放段的操作不断进行,分区中形成用双向链表链接起来的空闲段链。当从分区中分配段时,依据首次适应算法(即第一个满足要求的空闲段就作为分配结果)查看空闲段链中是否存在合适的段。当把段释放回分区时,该段被挂在空闲段链的链尾,并且如果空闲段链中有与此段相邻的段,则将其合并成一个更大的空闲段。RTEMS在段的控制块中设置一个标志位表示其被使用的情况。标志位为1表示该段正被使用,标志位为0表示该段空闲。图3是一个分区中具有两个空闲段和一个正被使用的段的示例。
空闲段和已经使用段的控制结构有所不同,如图4所示。
RTEMS的分区管理机制提供以下API:
rtems_region_create 创建一个分区
rtems_region_ident 获得分区的标识
rtems_region_delete 删除一个分区
rtems_region_extend 扩展一个分区
rtems_region_get_segment 申请一个段
rtems_region_return_segment 释放一个段
RTEMS的可变长度分区管理算法有以下特色:
①系统创建的分区数目可在运行时动态增加;
②段的控制结构在该段被分配出去后会减小,而在回收到控制快会自动恢复大小。这一点使得分区管理的系统开销降低到最小;
③时应用程序发现一个分区的内存空间不够使用时,可以调用retms_region_extend函数(API)扩展该分区的大小。
④当程序要求从某个分区获取分段而未成功时,可以立即返回,也可以采取多种等待策略。等待策略包括优先级等待、FIFO等待。在FIFO等待策略中又可分为有限等待和无限等待。
在动态可变长度内存管理的基础上,RTEMS还提供了Malloc/free等标准的C函数。在使用Malloc/free等函数时应注意以下几个方面的限制:
①因为内存分区是一种临界资源,由信号量保护,使用Malloc会导致当前调用挂起,因此它不能用于中断服务程序。
②因为进行内存分配需要执行查找算法,其执行时间与系统当前的内存使用情况相关,具有不确定性,因此对于有规定时限的操作是不适宜的。
③由于采用简单的首次适应算法,容易导致系统中存在大量的内存碎片,降低内存使用效率和系统性能。
javascript:window.open(this.src);" style="cursor:pointer;"/>
4 结论
为了使嵌入式系统能够在不同的平台上进行移植,使之使用与各种应用环境,嵌入式系统内存管理方案在充分考虑实时性、可靠性和高效性的基础上,应该提供比较丰富的管理机制。本文分析了嵌入式系统中内存管理的要求、存在的问题,介绍了静态和动态两种分配策略;以开源的RTEMS系统为例,介绍了嵌入式系统中常用的内存管理方法,并对各种方法的特点进行了阐述,在实际应用时,可根据需求作出相应的选择。