嵌入式实时操作系统中内存释放的方法

文档序号:6396106阅读:362来源:国知局
专利名称:嵌入式实时操作系统中内存释放的方法
技术领域
本发明涉及计算机领域,具体地说,涉及计算机领域中的嵌入式实时多任务操作系统中的内存释放。
背景技术
嵌入式实时操作系统一般由任务调度管理、时间管理、任务同步和通信、内存管理等几部分组成。因为实时操作系统对内存的依赖性很强,因此内存管理作为操作系统的核心就显得很重要。
现在常用的固定大小内存释放方法是使用的HEAD(内存头)释放方法和二分法,其具体方法分别如下预先向操作系统申请一块大的内存区,将该内存区划分为若干内存池,每个内存池中内存块的大小固定,各种大小的内存块的数量可根据需要配置。
根据实际情况可以将缓冲池分为64,128,256,512,1024,2048,4096,8192八种大小,每种大小的缓冲池用循环队列来进行管理,提供申请内存和释放内存的接口。申请内存时根据申请内存的大小选择管理队列,从队列的头摘取一个缓冲区返回指针给申请者,释放时将内存追加到队列的尾部。
内存块划分的情况和缓冲池POOL的结构如附图1所示。
附图2所示是内存的操作维护算法图。内存队列是一个简单的循环队列,申请时从队列头取一空闲块,归还时放在列尾。由于内存队列是系统每个任务都会申请和归还的,设置了一个信号量来互斥。为了提高效率,内存队列采用二级索引内存块的大小经过简单的移位得到一级索引值,一级索引值即为内存队列的编号。
HEAD释放方法归还内存时,从内存块的HEAD中找到相应的缓冲池POOL及其对应的内存队列,将要释放的内存的指针值放入相应内存队列的尾指针。
二分法释放方法
通过对被释放的内存块的地址,采用二分法进行查找比较后,能正确释放所需释放的内存块。
现有技术中的HEAD释放方法,由于必须通过内存块的HEAD才能正确的释放所需要释放的内存块,而HEAD经常由于内存越界而被破坏,这样当HEAD被破坏的时候就会出现释放失败的情况。而采用二分法释放内存时,由于进行查找比较操作,会耗费比较多的时间,这样在实际释放时对释放的效率会产生一定的影响。

发明内容
本发明所要解决的技术问题是提供一种新的内存释放方法,能克服现有技术中的HEAD释放方法因HEAD被破坏导致释放失败的缺点,相对于二分法提高了内存的释放效率,而且具有伸缩性,可适应不同规模的嵌入式系统。
本发明的技术方案为1、一种嵌入式实时操作系统中内存释放的方法,包括1.1预先在系统中划出一块内存区,设大小为X;1.2把划出的内存区根据需要设置成大小为m,2m,4m,8m,16m...2km的K种内存池,不同大小的内存池分别有nk块可供分配;1.3在系统初始化的时候,建立一个索引,索引指向内存块所属的内存池的位置;建立索引的方法可以是首先根据内存块的大小和块数求K个内存池的最大公约数,即求n0,2n1,4n2,8n3,16n4,32n5...2k-1nk-1这K个数字的最大公约数S,然后根据S和m以及X的值建立一个索引,索引的长度为X/(S×m)。
1.4当程序需要内存块时,根据所需的内存块大小,首先在含有此大小内存块的描述数组中查找有没有空置出来的块,如果有,则按顺序分配给需要的程序;如果没有,则从内存区中按顺序申请内存块,并根据申请内存块的大小在含有此大小的内存块的描述数组尾部添加,然后分配,同时修改描述数组中该块内存标识为已经分配;1.5在释放内存的时候,先求得索引的下标,通过索引确定被释放的内存块属于哪个内存池;然后进一步得到被释放内存块在内存池中的位置,最后释放。
求得索引的下标的方法可以是用释放时传入的释放地址*p2减去整个内存区的起始地址*p1所得差值再对(S×m)取模,所得的值就是索引的下标。
得到被释放内存块在内存池中的位置的方法可以是,用被释放内存块的地址减去所属内存池的起始地址,所得的结果对该内存池内存块大小取模,可得到被释放内存块在内存池中的位置。
采用本发明所述的释放方法,与现有技术相比,解决了内存模块中可能出现的HEAD头被破坏而导致释放失败的情况,同时由于S,m一定是一个2的n次方的数,所有的取模运算可以直接通过移位来完成,移位运算在计算机中的运行速度是非常快的,可以大大提高系统的效率,达到了简单性、可伸缩性的效果,降低了释放出错的风险。


图1是内存块划分的情况和缓冲池POOL的结构图;图2是内存的操作维护算法图;图3是在一块大的内存区设置释放内存块的内存池示例图;图4是本发明中系统内存的初始设置流程图;图5是本发明中释放内存块的流程图。
具体实施例方式
图3显示了预先向操作系统申请一块大的内存区并设置了大小为64(8块),128(4块),256(2块),512(1块)内存块的内存池(pool)。
图4是本发明中系统内存的初始设置流程图。先划出一块内存区,设大小为X,然后设置如图3所示的内存池。
图5是本发明的释放内存块的流程图。在发明的内容中已有详细描述,此处不再重复。
下面用一个实施例进行说明设a为所要释放的内存块位于内存池中的位置(a的值为0表示位于第一个内存池中,a的值为1表示位于第二个内存池中,依此类推)。
1.1预先在系统中划出一块内存区,设大小为2048;1.2把划出的内存区根据需要设置成大小为64,128,256,512的4种内存池,不同大小的内存池分别有8,4,2,1块可供分配;1.3在系统初始化的时候,建立一个索引,索引指向内存块所属的内存池的位置;建立索引的方法可以是首先根据内存块的大小和块数求4个内存池的最大公约数,即求8,2×4,4×2,8×1这4个数字的最大公约数S=8,然后根据8和64以及4的值建立一个索引,索引的长度为4/(8×64)。
1.4当程序需要内存块时,根据所需的内存块大小,首先在含有此大小内存块的描述数组中查找有没有空置出来的块,如果有,则按顺序分配给需要的程序;如果没有,则从内存区中按顺序申请内存块,并根据申请内存块的大小在含有此大小的内存块的描述数组尾部添加,然后分配,同时修改描述数组中该块内存标识为已经分配;1.5在释放内存的时候,先求得索引的下标,通过索引确定被释放的内存块属于哪个内存池;然后进一步得到被释放内存块在内存池中的位置,最后释放。
求得索引的下标的方法可以是用释放时传入的释放地址*p2减去整个内存区的起始地址*p1所得差值(64×8+128×2)再对(8×64)取模,所得的值就是索引的下标,即a=1(表明所要释放的内存块位于大小为128的内存池中)。再用被释放内存块的地址减去所属内存池的起始地址的差值(128×2)对该内存池内存块大小值128取模得到值为2,这样就可以知道需释放的内存块的具体位置并释放该块内存,同时修改该块内存标识为没有分配。
综上所述,本发明采用hash释放方法较以前的方法解决了内存模块中可能出现的HEAD头被破坏而导致释放失败的情况,同时提高了释放的效率。
权利要求
1.一种嵌入式实时操作系统中内存释放的方法,包括1.1预先在系统中划出一块内存区,设大小为X;1.2把划出的内存区根据需要设置成大小为m,2m,4m,8m,16m...2km的K种内存池,不同大小的内存池分别有nk块可供分配;1.3在系统初始化的时候,建立一个索引,索引指向内存块所属的内存池的位置;1.4当程序需要内存块时,根据所需的内存块大小,首先在含有此大小内存块的描述数组中查找有没有空置出来的块,如果有,则按顺序分配给需要的程序;如果没有,则从内存区中按顺序申请内存块,并根据申请内存块的大小在含有此大小的内存块的描述数组尾部添加,然后分配,同时修改描述数组中该块内存标识为已经分配;1.5在释放内存的时候,先求得索引的下标,通过索引确定被释放的内存块属于哪个内存池;然后进一步得到被释放内存块在内存池中的位置,最后释放。
2.权利要求1所述的嵌入式实时操作系统中内存释放的方法,其特征在于,所述步骤1.3中的建立一个索引的方法为首先根据内存块的大小和块数求K个内存池的最大公约数,即求n0,2n1,4n2,8n3,16n4,32n5...2k-1nk-1这K个数字的最大公约数S,然后根据S和m以及X的值建立一个索引,索引的长度为X/(S×m)。
3.权利要求1所述的嵌入式实时操作系统中内存释放的方法,其特征在于,所述步骤1.5中的求得索引的下标的方法为用释放时传入的释放地址*p2减去整个内存区的起始地址*p1所得差值再对(S×m)取模,所得的值就是索引的下标。
4.权利要求1所述的嵌入式实时操作系统中内存释放的方法,其特征在于,所述步骤1.5中的得到被释放内存块在内存池中的位置的方法为,用被释放内存块的地址减去所属内存池的起始地址,所得的结果对该内存池内存块大小取模,可得到被释放内存块在内存池中的位置。
全文摘要
一种嵌入式实时操作系统中内存释放的方法,预先在系统中划出一块内存区;把划出的内存区设置成大小为文档编号G06F9/50GK1556475SQ20041003201
公开日2004年12月22日 申请日期2004年3月25日 优先权日2004年1月2日
发明者鲁旭, 缪敬, 张芝萍, 王陈, 芦东昕, 鲁 旭 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1