嵌入式实时操作系统中非缓冲内存动态分配方法

文档序号:6361873阅读:731来源:国知局
专利名称:嵌入式实时操作系统中非缓冲内存动态分配方法
技术领域
本发明涉及计算机领域,具体地说,涉及一种嵌入式实时多任务操作系统中的内存动态分配方法。
背景技术
嵌入式实时操作系统一般由任务调度管理、时间管理、任务同步和通信、内存管理等几部分组成。因为实时操作系统对内存的依赖性很强,因此内存管理作为操作系统的核心就显得很重要。
现在常用的固定大小内存分配算法是使用的UB(Unbuffer,非缓冲)块分配算法其具体算法如下预先向操作系统申请一块大的内存区,它预先把大块自由空间定义为用户保留空间,不能把全部空间都定义为用户保留空间,因为操作系统本身以及一些协议栈运行也需要一些空间。再将该内存区划分为若干内存池,每个内存池中内存块的大小固定,各种大小的内存块的数量可根据需要配置。为了能够最大程度上令初始配置与实际使用UB数量吻合,在程序中可以增加各种UB峰值使用的统计,以此数据调整各种UB的数量。
根据实际情况可以将缓冲池分为64,128,256,512,1024,2048,4096,8192八种大小,每种大小的缓冲池用循环队列来进行管理,提供申请内存和释放内存的接口。内存管理提供其调试信息和状态统计信息。申请内存时根据申请内存的大小选择管理队列,从队列的头摘取一个缓冲区返回指针给申请者,释放时将内存追加到队列的尾部。
每种大小的内存块都有一个内存管理结构,记录下该种内存的使用情况(空闲内存个数、最大利用个数和累计申请该种内存的次数)。内存队列使用一级索引,申请内存的大小直接映射到队列的编号。
内存划分和缓冲池结构及内存的操作维护算法图1所示是内存块划分的情况和缓冲池POOL的结构图。图2所示是内存的操作维护算法图,内存队列是一个简单的循环队列,申请时从队列头取一空闲块,归还时放在列尾。由于内存队列是系统每个任务都会申请和归还的,设置了一个信号量来互斥。为了提高效率,内存队列采用二级索引内存块的大小经过简单的移位得到一级索引值,一级索引值即为内存队列的编号。
申请和释放内存算法(1)申请内存时,根据所需内存数值的移位,得到一级索引值,找到相应的POOL及其对应的内存队列,根据队列的头,将可用数据块的指针值返回给调用者。如附图3所示。
(2)归还内存时,从HEAD找到相应的缓冲池POOL及其对应的内存队列,将要释放的内存的指针值放入相应内存队列的尾指针。
内存UB的配置表如下/*内存UB的配置表*/T_UBCTg_aUBPoolConfigTable[]={/*尺寸 总计 保留*/{0,0, 0},{1,120, 40},{4,100, 30},{8,80, 20},{16, 50, 10},{32, 20, 5},{64, 10, 0},{0,0, 0}};综上所述,UB块分配算法由于实际运用中首先需要根据平时使用量统计不同大小的固定大小内存块的使用数量进行静态配置,所以会出现面对新的上层应用的时候需要重新配置静态配置表,这样就会需要一定的时间统计不同大小的内存块的使用量。而且可能由于对不同UB块数量需求的变化而修改配置表。另外如果配置的UB块数量不能满足需求会出现内存申请失败的情况。

发明内容
本发明所要解决的技术问题是提供一种基于现在所用的UB内存分配算法的动态分配算法,解决以前算法中必须存在的统计操作和空间浪费的缺点,一定程度上提高了内存的利用,而且具有伸缩性,可适应不同规模的嵌入式系统。
本发明所述的非缓冲内存动态分配方法,包括(1)预先向操作系统申请一块大的内存区;(2)将申请的内存区设定为用户保留区;(3)设置64,128,256,512,1024,2048,4096,8192八种UB的描述数组;(4)当程序需要内存块时,根据所需的内存块大小首先在此大小UB的描述数组中查找有没有已经释放空置出来的UB块(标识为没有分配),如果有,则按顺序分配给需要的程序;如果没有,则从内存区中按顺序申请内存块,并根据申请内存块的大小在此大小的UB描述数组尾部添加,然后分配,同时修改描述数组中该块内存标识为已经分配;(5)当释放内存块的时候,根据内存块的大小在UB描述数组中查找该内存块的位置并释放,同时修改描述数组中该块内存标识为没有分配。
采用本发明所述的UB的内存动态分配方法,与现有技术相比,解决了内存模块必须有的静态配置问题,同时解决了当静态配置数目不正确而导致的内存申请失败的情况,从而达到了简单性、可伸缩性的效果,节省了嵌入式系统的内存管理所需的统计静态配置数量的问题,降低了配置数目不正确的风险。


图1所示是内存块划分的情况和缓冲池POOL的结构图;图2所示是内存的操作维护算法图;图3所示是申请内存的算法图;图4是申请的内存区以及不同大小的UB描述数组示意图;图5是内存申请的示意图;图6是内存释放的示意图;图7是本发明所述内存申请的流程图。
具体实施例方式
下面结合附图,对本发明的具体实施作进一步的详细描述。
图4显示了预先向操作系统申请一块大的内存区1,如图中灰色所示,并设置了64,128,256,512,1024,2048,4096,8192八种UB的描述数组。
当需要操作系统分配一块64字节的内存时,根据所需的内存块大小首先在此64字节UB的描述数组中查找有没有已经释放空置出来的UB块(标识为没有分配),在图5,申请的内存区b和c中以小点4和斜杠3表示,在64字节的描述数组中以小点4表示,如果有,则按顺序分配;如果没有,则从内存区中按顺序申请内存块,图5申请的内存区d中小点4表示,并根据申请内存块的大小在此大小的UB描述数组尾部添加,图5中64字节的描述数组中以竖杠5表示,然后分配,同时修改描述数组中该块内存标识为已经分配。
由图6所知释放64字节内存的时候,在64字节UB描述数组中查找该内存块的位置并释放,同时修改描述数组中该块内存标识为没有分配,图6中用斜杠6来描述释放后的内存块。
图7是内存申请的流程图。根据需要分配的内存块大小到相应的描述数组中查找是否有可分配的内存块,有,就按顺序分配内存块;没有,就在内存区中申请相同大小的一块内存,如果申请不成功,即没有可给予的内存空间,则分配内存失败;如果申请成功则在此大小的UB描述数组尾部添加然后分配该内存块。
综上所述,本发明采用UB内存动态分配算法较以前的UB算法节省了嵌入式系统的内存管理所需的统计静态配置数量的问题,降低了配置数目不正确的风险。
权利要求
1.一种嵌入式实时操作系统中非缓冲内存动态分配方法,包括如下步骤(1)预先向所述嵌入式实时操作系统申请一块大的内存区;(2)将申请的内存区设定为用户保留区;其特征在于,还包括(3)在用户保留区中设置不同内存大小的UB描述数组;(4)需要内存块时,根据所需内存大小,在相应大小的所述UB描述数组中查找已经释放空置出来、标识为没有分配的非缓冲块,按顺序分配给需要的程序,同时修改所述非缓冲描述数组中该块内存标识为已经分配;(5)释放内存块时,根据内存块的大小,在相应大小的所述非缓冲描述数组中查找该内存块的位置并释放,同时修改描述数组中该内存块标识为没有分配。
2.如权利要求1所述的嵌入式实时操作系统中非缓冲内存动态分配方法,其特征在于,步骤(3)所述不同内存大小的非缓冲描述数组可为64,128,256,512,1024,2048,4096,8192八种。
3.如权利要求1所述的嵌入式实时操作系统中非缓冲内存动态分配方法,其特征在于,步骤(4)还包括,如果没有已经释放空置出来的非缓冲块,则从内存区中按顺序申请内存块,并根据申请内存块的大小在相应大小的所述非缓冲描述数组尾部添加,然后分配,同时修改所述非缓冲描述数组中该块内存标识为已经分配。
4.如权利要求3所述的嵌入式实时操作系统中非缓冲内存动态分配方法,其特征在于,内存区中没有可给予的内存空间,分配内存失败。
全文摘要
一种嵌入式实时操作系统中非缓冲内存动态分配方法,包括如下步骤,预先向操作系统申请一块大的内存区;将申请的内存区设定为用户保留区;设置非缓冲描述数组;在所述非缓冲描述数组中查找已经释放空置出来、标识为没有分配的非缓冲块,按顺序分配给需要的程序,同时修改所述非缓冲描述数组中该块内存标识为已经分配;在非缓冲描述数组中查找该内存块的位置并释放,同时修改描述数组中该内存块标识为没有分配。本发明解决以前算法中必须存在的统计操作和空间浪费的缺点,一定程度上提高了内存的利用,而且具有伸缩性,可适应不同规模的嵌入式系统。
文档编号G06F12/06GK1570883SQ0313207
公开日2005年1月26日 申请日期2003年7月15日 优先权日2003年7月15日
发明者鲁旭, 缪敬, 黄烨明, 芦东昕 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1