一种嵌入式系统内存管理的方法

文档序号:72396阅读:326来源:国知局
专利名称:一种嵌入式系统内存管理的方法
技术领域
本发明涉及一种内存的管理方法,尤其是一种应用于数字电视机顶盒、PDA等嵌入式系统的内存管理方法。
背景技术
嵌入式系统的应用非常广泛。由于嵌入式系统资源的限制,并且内存的使用频率很高,所以如何高效的使用内存成为人们非常关心的一个问题。这就使嵌入式系统内存管理的方法显得十分重要。
目前,在嵌入式系统中,主要采用两种内存分配方法,一种是固定长度的内存分配策略,另一种是可变长度的内存分配策略。
对于可变长度的内存分配策略,该方法将空闲的内存块以链表的形式排列,当用户申请大小为size的内存时,就从链表的头部开始搜索空闲内存块,若空闲内存块小于size,则继续搜索,直到找到足够大小的空闲内存块,分配给用户。用户释放内存时,就将释放的内存块放在链表的尾部。
这种内存分配策略有明显的缺点。由于在嵌入式系统中,内存的分配与释放非常频繁,而且存在大量小内存的分配。使用这种内存管理方法,经过一段时间的运行后,小块内存将会散布在整个内存,必然产生大量的内存碎片。这时,虽然系统还有很多剩余内存,用户却申请不到内存,造成大量的内存浪费,甚至导致系统崩溃。
第二种是固定长度的内存分配策略。该方法是先把内存划分为几个区,每个区又划分为大小相等的内存块。例如,第一个内存区每个内存块为16字节,第二个内存区每个内存块为32字节,第三个内存区每个内存块为64字节,等等。当用户申请大小为size的内存时,扫描各个内存区,找到不小于size的最小的内存块所在的区,从该区中取出一个内存块分配给用户。用户释放内存时,再将该内存块归还其所在的区。
这种方法的缺点是,如果满足条件的内存区的内存块已经用完,则内存申请失败。即使其它区还有更大的内存块,也不会分配给用户。这样,使得内存不能得到充分利用,造成大量浪费。

发明内容
本发明所要解决的技术问题在于提出一种嵌入式系统的内存管理方法,可以充分的利用系统的内存资源,减少系统由于内存而引起的系统崩溃。
一种嵌入式系统内存管理的方法,包括如下步骤步骤一、嵌入式系统的内存管理模块,从内存中划分出一个区域作为内存池;步骤二、当用户申请的内存大于设定的阈值时,则为大内存申请,执行步骤三;否则,为小内存申请,执行步骤四;步骤三、用户申请的是大内存,内存管理模块就向系统申请为用户在内存池以外的区域分配一块内存,用完后,释放该内存;步骤四、用户申请的是小内存,内存管理模块就在内存池中为用户分配一块内存,用完后,归还内存池。
本发明所述的针对嵌入式系统的内存管理方法,通过将小内存集中于内存池中分配,大内存单独申请,有效减少由于大量小内存分配而产生的内存碎片;通过内存分配服务线程使得对公共内存的数据保护和管理得以实现。



图1是本发明方法的流程示意图;图2是本发明小内存分配的流程示意图;图3是本发明内存池结构的示意图。
具体实施方式
在嵌入式系统(如数字电视机顶盒或PDA或手机等系统)中,内存的使用频率非常高,大量的小内存分配会造成内存产生很多碎片。本发明的内存分配策略是将小内存分配集中在内存的某一区域(内存池),避免使小块内存散布在整个内存中,这样可以有效的减少内存碎片的产生。如图1所示,具体方法如下步骤一、嵌入式系统的内存管理模块,从内存中划分出一个区域作为内存池;步骤二、当用户申请的内存大于设定的阈值时,则为大内存申请,执行步骤三;否则,为小内存申请,执行步骤四;步骤三、用户申请的是大内存,内存管理模块就向系统申请为用户在内存池以外的区域分配一块内存,用完后,释放该内存;步骤四、用户申请的是小内存,内存管理模块就在内存池中为用户分配一块内存,用完后,归还内存池。
当用户申请大小为size的内存时,内存管理模块根据size的大小不同,以一定的阈值作为界定标准,分为大内存申请和小内存申请来分别处理。size大于阈值的作为大内存来处理,小于阈值的作为小内存来处理。
阈值的大小根据嵌入式系统的不同和应用的场合不同而可以有不同的设定,根据具体小内存申请的情况,取值范围一般为32——256之间,一般为2n字节,比如,对于数字电视机顶盒可以为256字节,对于手机可以为128字节。
内存池的大小根据阈值的大小、用户申请小内存的数量和系统内存总量设定,发明所述的内存池的大小为2——16K字节,如对于数字电视机顶盒可以取8K字节。
当用户申请的是大内存时,内存管理模块就向系统申请为用户在内存池以外的区域分配一块内存,内存用完后直接释放。由于所有的大内存的申请全部集中在内存池外,这样既有利于成功的分配,又可以避免大量的小内存申请而产生碎片,提高了内存的利用效率。
如果仅将小内存的分配集中在内存池中,仍采用原有的内存管理方法来管理,虽然可以起到一定的效果,但是并不能充分利用内存池的资源。因此,本发明中内存管理模块可以用一个内存管理链表来管理这个内存池。
如图2所示,在内存池中,每一段已分配的内存或空闲内存的前8个字节作为内存管理链表的一个节点。该节点记录了这段内存的状态STATE(已分配或空闲)、大小SIZE、这段内存所在的内存池的编号、下一节点的地址等信息。图2中A表示内存管理列表的节点,B表示用户实际占用的内存,图中的箭头表示NEXT中存储的是下一节点的地址信息。
通过以上的内存管理链表可以方便的监视内存的使用情况,完成内存的分配和回收。
如图3所示是本发明小内存分配的流程示意图,在内存池中分配时,内存管理模块将从第一个内存池开始逐个检查。找到有空闲空间的内存池后,内存管理模块在该内存池范围内搜索内存管理链表,检查是否有满足需求空闲空间。如果有,则分配给用户,如果没有,则继续检查下一个内存池。如果当前所有的内存池都没有满足需求空闲空间,内存管理模块将向系统申请增加一个内存池,如果申请成功,则在新内存池中为用户分配内存,如果申请失败,则返回内存分配失败信息。
具体包括如下步骤步骤40、内存管理模块将从第一个内存池开始;步骤41、判断该内存池中是否存在空闲内存空间;如果存在,则执行步骤42;否则执行步骤43;步骤42、在该内存池中搜索内存管理链表,根据链表判断是否存在满足需求的内存空间,如果存在,则将内存分配给用户,将剩余的内存添加到链表中,结束分配过程;否则执行步骤43;
步骤43、判断该内存池是否为最后一个内存池,如果不是,则检查下一个内存池,执行步骤41;如果是,则执行步骤44;步骤44、向系统申请,增加一个新的内存池;如果成功,则在新的内存池中,将内存分配给用户,将剩余的内存添加到链表中,结束分配过程;否则,提示用户内存分配失败,结束分配过程。
对于每一个内存池都按其建立的顺序,分配一个数字来区分不同的内存池,比如,最先建立的内存池的标号为1;第二个建立的内存池标号为2,依次类推。所述的步骤40和步骤43的循环就是遍历所有的内存池一次,判断是否是所有的内存池都已满或都不存在满足需求的空闲内存,作为是否建立新的内存池的条件。
如果内存池中存在的空闲空间与用户请求的内存空间相同,则直接将该内存分配给用户,并修改链表中对应节点的状态。
如果内存池中存在的空闲空间大于用户请求的内存,则分配给用户其所请求的大小的内存空间,同时更改内存管理链表中该段空闲内存的表项,状态改为已占用,大小改为用户请求的大小,NEXT指向剩余的内存空间;增加一个剩余的内存空间的表项,状态为未占用,大小为剩余的可用空间大小,NEXT指向原该段空闲内存NEXT的指向的地址。
为了避免不必要的内存管理链表的反复更改,如果空闲的内存空间比用户请求的空间大16个字节以内,则直接将该段内存分配给用户使用,不在将剩余的内存加入到链表中,以此来提高小内存处理的效率。
用户释放内存时,内存管理模块根据用户释放的内存空间地址,在内存管理链表中找到相应的节点,修改该节点的记录信息,将这段内存标记为空闲,并检查内存池中与其相邻的内存空间。如果与其相邻的内存空间为空闲空间,并且与要释放的内存空间在同一个内存池中,则合并它们,以满足以后的内存分配的需要。然后检查这个内存池,如果该内存池已经全部被释放,则将该内存池占用的内存空间归还系统。
具体包括如下步骤步骤45、内存管理模块根据用户释放的内存空间地址,在内存管理链表中找到相应的节点;步骤46、判断与待回收的内存空间相邻的内存空间是否为空闲空间;如果是,则执行步骤47;否则,修改该节点的记录信息,将这段内存标记为空闲,执行步骤48;步骤47、将待回收的内存空间与相邻的空闲内存空间合并,重新建立新的链表单元,状态为空闲,大小为合并后的空闲空间,NEXT指向整个空闲空间接下来的内存地址;步骤48、判断是否内存池中所有的内存空间均为空闲,如果是,则释放该内存池;否则结束释放过程。
最后所应说明的是以上实施例仅用以说明而非限制本发明的技术方案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术人员应当理解依然可以对本发明进行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其均应涵盖在本发明的权利要求
范围当中。
权利要求
1.一种嵌入式系统内存管理的方法,其特征在于包括如下步骤步骤一、嵌入式系统的内存管理模块,从内存中划分出一个区域作为内存池;步骤二、当用户申请的内存大于设定的阈值时,则为大内存申请,执行步骤三;否则,为小内存申请,执行步骤四;步骤三、用户申请的是大内存,内存管理模块就向系统申请为用户在内存池以外的区域分配一块内存,用完后,释放该内存;步骤四、用户申请的是小内存,内存管理模块就在内存池中为用户分配一块内存,用完后,归还内存池。
2.根据权利要求
1所述的嵌入式系统内存管理的方法,其特征在于阈值的大小根据嵌入式系统的不同和应用的场合不同而可以有不同的设定,取值范围一般为32--256字节间。
3.根据权利要求
1所述的嵌入式系统内存管理的方法,其特征在于所述的内存池的大小为2--16K字节。
4.根据权利要求
3所述的嵌入式系统内存管理的方法,其特征在于所述的所有的内存池大小相同。
5.根据权利要求
1所述的嵌入式系统内存管理的方法,其特征在于所述的内存池通过一个内存管理链表来管理,在内存池中,每一段已分配的内存或空闲内存的前8个字节作为内存管理链表的一个节点,该节点的信息至少包括该段内存的状态STATE、大小SIZE和下一节点的地址信息。
6.根据权利要求
5所述的嵌入式系统内存管理的方法,其特征在于所述的步骤四,包括如下步骤步骤40、内存管理模块将从第一个内存池开始;步骤41、判断该内存池中是否存在空闲内存空间;如果存在,则执行步骤42;否则执行步骤43;步骤42、在该内存池中搜索内存管理链表,根据链表判断是否存在满足需求的内存空间,如果存在,则将内存分配给用户,将剩余的内存添加到链表中,结束分配过程;否则执行步骤43;步骤43、判断该内存池是否为最后一个内存池,如果不是,则检查下一个内存池,执行步骤41;如果是,则执行步骤44;步骤44、向系统申请,增加一个新的内存池;如果成功,则在新的内存池中,将内存分配给用户,将剩余的内存添加到链表中,结束分配过程;否则,提示用户内存分配失败,结束分配过程。
7.根据权利要求
6所述的嵌入式系统内存管理的方法,其特征在于所述的步骤42中,如果空闲的内存空间比用户请求的空间大16个字节以内,则直接将该段内存分配给用户使用。
8.根据权利要求
5所述的嵌入式系统内存管理的方法,其特征在于所述的步骤四中,回收内存包括步骤45、内存管理模块根据用户释放的内存空间地址,在内存管理链表中找到相应的节点;步骤46、判断与待回收的内存空间相邻的内存空间是否为空闲空间;如果是,则执行步骤47;否则,修改该节点的记录信息,将这段内存标记为空闲,执行步骤48;步骤47、将待回收的内存空间与相邻的空闲内存空间合并,重新建立新的链表单元,状态为空闲,大小为合并后的空闲空间,下一节点的地址为整个空闲空间接下来的内存地址;步骤48、判断是否内存池中所有的内存空间均为空闲,如果是,则释放该内存池;否则结束释放过程。
专利摘要
本发明公开了一种嵌入式系统内存管理的方法,包括如下步骤嵌入式系统的内存管理模块,从内存中划分出一个区域作为内存池;当用户申请的内存大于设定的阈值时,则为大内存申请,则内存管理模块就向系统申请为用户在内存池以外的区域分配一块内存,用完后,释放该内存;否则,为小内存申请,内存管理模块就在内存池中为用户分配一块内存,用完后,归还内存池。本发明所述的针对嵌入式系统的内存管理方法,通过将小内存集中于内存池中分配,大内存单独申请,有效减少由于大量小内存分配而产生的内存碎片。
文档编号G06F12/02GKCN1276361SQ200310110344
公开日2006年9月20日 申请日期2003年12月29日
发明者王军 申请人:北京中视联数字系统有限公司导出引文BiBTeX, EndNote, RefMan
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1