一种避免内存碎片化的内存分配方法

文档序号:6560222阅读:308来源:国知局
专利名称:一种避免内存碎片化的内存分配方法
技术领域
本发明涉及一种软件开发中使用的避免内存碎片化的内存分配方法, 属于内存管理技术领域。
背景技术
在一个电信通讯系统中,系统能否稳定可靠的运行直接影响到业务的 准确性和实时性。系统在运行中需要频繁的申请和释放内存,在长期的运行过程中系统 会产生大量的内存碎片,这个问题严重的影响了系统的稳定运行。对于内 存碎片化问题,现有的各种系统都有自己的内存管理机制。该内存管理机 制 一般的方法是根据操作系统所能提供内存的大小预先把系统的内存划 分为大小不同的内存池,再将每一个内存池中的内存划分为固定大小一致的内存快。 一般情况下,内存池的大小是2的幂字节数。并且一个内存池 的大小是他左边邻居大小的2倍。由于内存池的个数,每个内存池中内 存块的大小和个数等参数是在系统初始化时确定的,并且在系统运行过程 中不再改变。为了高效的利用内存,必须事先统计各种不同内存的使用情况。现有内存分配机制的缺陷在于每种内存池的数目和每种内存块的数 目是在系统刚开始运行时就已经确定下来的。如果在系统允许过程中某种 大小的内存块使用申请完毕,这时或者是因为申请不到内存而形成系统异 常,或者从较大的内存池中分配一块内存给申请者,这样造成了内存资源 的浪费。如果需要申请的内存超过了所能提供的最大的内存块的大小,系 统会因为申请不到内存而产生异常情况。对于传统的内存分配方法,每种内存池中内存块的多少采用动态控制
的方法。系统初始化时首先申请一定量的内存块,在系统运行过程中,当 某种大小的内存块消耗完后,向操作系统动态的申请,并置上已经使用的 标记。当申请的内存的大小超过了当前所分配的最大的内存块的大小时, 直接向搡作系统动态的申请,使用完后,把内存释放给操作系统。这种内 存管理的方法虽然解决了内存资源的浪费的问题但是并不能解决内存碎 片的问题,在一个需要频繁申请和释放内存的系统中,当频繁申请的内存 块的大小超过了已经分配的内存池中最大内存块大小的时候,需要频繁的 向操作系统申请内存。运行一段时间后系统中同样会出现大量的内存碎 片。所以这种方法也不能很好的解决内存碎片和减少内存资源浪费之间的 相互问题。发明内容本发明所要解决的技术问题在于提供一种避免内存碎片化的内存分 配方法,以很好的解决内存碎片和减少内存资源的浪费之间的问题。为了解决上述问题,本发明提供了 一种避免内存碎片化的内存分配方法,其包括如下步骤(1)创建至少一个普通内存池,为每一个普通内存池向操作系统申 请一定数量的内存块,所述每一个内存块由一个以上的大小相同的内存存 储块组成;(2 )创建一个大内存池,由操作系统中可提供申请的剩余内存组成, 并在其中创建两个队列, 一个是已分配内存队列,记录大内存池中已经分 配的内存块的情况,另一个是未分配内存队列,记录大内存池中未分配内 存的信息;(3)当应用申请内存时,判断当前申请的内存大小是否在普通内存 池所能提供的内存块大小范围内,如果是,则在普通内存池中分配相应大 小的空闲内存存储块给该应用,并将已经分配的内存存储块标记为已经占 用;如果否,则查询所述未分配内存队列的记录,从大内存池中分配相应 大小的内存块给该应用,并将该已分配信息记录入所述已分配内存队列; (4)当应用释放内存时,判断当前欲释放的内存块是从普通内存池, 还是从大内存池中申请得到的,如果是从普通内存池中申请得到的,则取消对应内存存储块的占用标记;如果是从大内存池中分配得到的,则在未分配内存队列中查询该当前欲释放的内存块的前后相邻内存是否是未分 为一个空闲的内存块,同时修改所述已分配内存队列的信息。进一步地,本发明所述的方法,其所述步骤(2)中,所述两个队列 在初始创建时,所述已分配内存队列为空,所述未分配内存队列中只有一 个节点,记录整个大内存池的内存情况。进一步地,本发明所述的方法,其所述步骤(3)中,所述判断当前 申请的内存大小是否在普通内存池所能提供的内存块大小范围内的步骤, 是判断该内存存储块的大小与当前申请的内存大小相匹配的普通内存池 中是否存在相应的空闲内存存储块;当判断到当前申请的内存大小未在普通内存池所能提供的内存块大 小范围内时,进一步包括判断当前申请内存的大小是否大于所述大内存 池所能提供内存的最大申请大小,如果是,则拒绝该申请;如果当前申请 的内存大小不超过大内存池所能提供内存申请的最大申请大小,则从所述 未分配内存的队列中查找一个适用的内存块,并判断该找到的内存块的大 小是否不小于普通内存池中最大的内存存储块的大小和当前申请内存大 小之和,如果是,则从该内存块中分割出一个与当前申请内存块大小匹配 的内存块并分配给所述应用,并将分割后剩余的内存信息更新到未分配内 存队列中;如果否,则将该找到的内存块完全分配给所述应用,并根据分 配情况更新未分配内存队列与已分配内存队列中的信息。本发明所述的方法,进一步包括所述为普通内存池申请的内存块的 大小不同。应用本发明所述的方法,通过内存分配管理模块,使内存申请者随时 都可以申请到合适大小的内存块;在某种大小的内存存储块消耗完后,可 以到大内存池中去申请,解决了申请不到内存而产生系统异常的问题;当
申请大块内存时,内存分配管理模块可以在大的内存池中直接的分配,解 决了传统方法的内存浪费以及内存碎片的问题。


图l是本发明所述的基本内存池示意图; 图2是本发明所述的大内存池示意图;示意图;图4是本发明实施例所述的应用申请内存的流程图;图5是本发明实施例所述的应用释放内存的流程图;图6是本发明实施例所述的基本内存池示意图;图7是本发明实施例所述的大内存池示意图;图8是本发明实施例所述的大内存池管理队列变化示意图。
具体实施例方式
为了使本发明所述的技术特点和方案的更加的清楚明白,通过下面具 体的使用的实施例来进一步的说明。如附图l所示,为本发明所述的内存管理示意图,内存分配管理模块 设置一定数量的基本内存池(Base POOL) 101, —般创建普通内存池101 的数量与系统的CPU数量一致,每个基本内存池又划分成一定数量的内 存存储块队列(chunk list) 102,为每个内存存储块队列向操作系统申请 一定数量的大小相同的内存存储块。在同一个基本内存池中,不同的内存 存储块队列中的内存存储块的大小不同。
如附图2所示,当基本内存池需要的内存申请完成后,剩下的系统可 提供申请的内存都申请为大内存池(Large pool Memory) 103所使用,一 般创建大内存池103的大小不超过系统可申请内存的50% ,大内存池103 的大'J、一般占系统可申请内存的10%至20%。首先从大内存池103中分 配一定数量的内存,如附图3所示,创建已分配内存队列104和未分配内 存队列105,并初始化这两个队列。初始时,已分配内存节点队列104为 空,未分配内存节点队列105只有一个节点(NODE),在这个节点中存 储当前大内存池中的未分配内存信息。如附图4所示,步骤106在内存申请者申请内存时,内存分配管理模 块按照下面的流程来执行步骤107、内存分配管理模块首先判断申请的内存大小是否超过了基 本内存池所能提供的内存的内存存储块的大小,如果不是,执行步骤108; 否则执行步骤109。步骤108、找到一个合适的基本内存池,查找是否有合适的内存存储 块可提供分配,如果有,执行步骤110取得一个大小相宜的内存存储块分 配给内存申请者,并置这个内存存储块为已经占用,返回;如果基本内存 池中没有合适的内存存储块可以提供分配,那么就执行步骤109,到大内 存池中去申请。步骤109、内存分配管理模块判断内存申请者申请的内存大小是否大 于大内存池所能提供内存申请的的最大值,如果是,执行步骤lll申请内 存失败返回错误;否则执行步骤112大内存池内存申请分配流程,首先查 找大内存池未分配内存队列,从中查找一个大小合适的内存块,判断这个 内存块的大小是否大于等于普通内存池中最大的内存存储块的大小和申 请内存大小之和,如果是,执行步骤113则分割这个内存块为两部分,一 部分提供给内存申请者使用,剩余那部分内存块仍然为未使用状态,把当 前分配给使用者的内存块信息加入到已分配内存信息队列中,并把分割后 剩余的内存块信息更新到原来的节点信息中去;否则,执行步骤114不进 行分割,把内存分配给内存申请者,把当前分配给使用者的内存块信息加 入到已分配内存信息队列中。步骤115,当内存申请者释放使用的内存时,内存分配管理模块按照 下面的流程来处理步骤116、内存分配管理模块判断该内存块是从大内存池中申请得到 的,还是从普通内存池中申请得到的,如果是从普通内存池中申请得到的,执行步骤117,否则执行步骤118。步骤in、如果是从基本内存池ioi中申请得到的时,取消内存存储 块的占用标i己,返回。步骤118、如果是从大内存池中分配得到的,那么从大内存池的已分 配内存队列中删除该内存块的占用标记,执行步骤119查找未分配内存队 列,察看该内存块的前后相邻内存块是否有未分配状态的空闲内存块,如 果有未分配状态的内存块,执行步骤120那么将它们合并为一个空闲的大 的内存块,相应未分配内存信息队列也要进行相应节点的合并处理;如果 该内存块的前后相邻内存块都为占用状态,执行步骤121那么向未分配内 存信息队列加入当前释^t内存块的相应信息。如图6和图7所示,为本发明的实施例的内存管理示意图。在这个例 子中假设只有一个基本内存池(Base POOL) 201和大内存池202。在基 本内存池201中,内存存储块的大小字符上有方框的内存存储块表示已经 被占用了。如果现在有一个内存申请者申请7K内存,则内存管理模块根 据申请内存存储块的大小,定位到大小为8K的内存存储块队列,并判断 是否有空闲的内存存储块,如果有空闲的内存块,那么就分配一个8K的 内存存储块给调用者,并设置这个内存存储块为占用。如果8K的内存存 储块队列中没有未使用的内存存储块,那么内存管理模块就到大内存池 202中为调用者申请内存。当调用者释放从基本内存池中申请的内存存储 块时,取消该内存存储块的占用标记。如图8所示,为本发明实施例所述的大内存池管理队列变化示意图。 描述了在大池中申请和释放内存块时,已分配内存信息队列和未分配内存 信息队列的变化情况的一个例子。大池的大小为10000K,调用者先后申 请内存的大小为20k,15K 300K ,接着调用者顺序释i文了内存大小为 15K,300K的内存块。步骤A到步骤E描述了已分配内存信息队列和未分 配内存信息队列的变化情况。在图8中,步骤301中描述了调用者在大池中申请了 20K内存后,
已分配内存信息队列和未分配内存信息队列的变化情况。已分配内存信息队列中第一个节点中纪录了分配的20K的信息如该内存块的位置、大小等各种情况;未分配内存信息队列中记录了当前的未分配内存的相关信 自步骤302中描述了内存管理模块从大池中又分配了 15K内存后的情 况,已分配内存信息队列包括2个有效的信息节点,记录了20K和15K 两个已分配内存块的信息,未分配内存信息队列中包含一个大的未分配内 存块信息。步骤303中描述了内存管理模块从大池中分配了 300K内存后的情 况,已分配内存信息队列包括3个已经分配给调用者使用的内存块的信 息,未分配内存信息队列中包含剩余的一个大的未分配内存块信息。步骤304中描述了调用者释放了从大内存池中申请的大小为15K的 内存块后已分配内存信息队列和未分配内存信息队列的变化情况。这时由 于这个15K内存块的前后的内存块都为已使用状态,所以没有内存块合 并的过程,从已分配内存信息队列中去除这个15K内存块的信息,并加 入到未分配内存信息队列中去。在步骤305中描述了调用者释放了从大内存池中申请的大小为300K 的内存块后已分配内存信息队列和未分配内存信息队列的变化情况。这时 由于这个300K内存块的前后的内存块都为未使用状态,所以这里需要进 行内存块合并的过程,合并完成后大内存池中只有一^^一个已经分配的内 存块和一个未分配的内存块。以上实施例中的描述仅为本发明的较佳的实施例而已,并不是用来限 制本发明,凡是在本发明所述方法的思想和原则之内,所做的任何的修改, 等同的替换以及改进等,都应包含在本发明的保护范围内。
权利要求
1、 一种避免内存碎片化的内存分配方法,其特征在于,包括如下步骤(1)创建至少一个普通内存池,为每一个普通内存池向操作系统申 请一定数量的内存块,所述每一个内存块由一个以上的大小相同的内存存 储块组成;(2 )创建 一 个大内存池,由操作系统中可提供申请的剩余内存组成, 并在其中创建两个队列, 一个是已分配内存队列,记录大内存池中已经分 配的内存块的情况,另一个是未分配内存队列,记录大内存池中未分配内 存的信息;(3) 当应用申请内存时,判断当前申请的内存大小是否在普通内存 池所能提供的内存块大小范围内,如果是,则在普通内存池中分配相应大 小的空闲内存存储块给该应用,并将已经分配的内存存储块标记为已经占 用;如果否,则查询所述未分配内存队列的记录,从大内存池中分配相应 大小的内存块给该应用,并将该已分配信息记录入所述已分配内存队列;(4) 当应用释放内存时,判断当前欲释放的内存块是从普通内存池, 还是从大内存池中申请得到的,如果是从普通内存池中申请得到的,则取 消对应内存存储块的占用标记;如果是从大内存池中分配得到的,则在未 分配内存队列中查询该当前欲释放的内存块的前后相邻内存是否是未分 配状态,并将其中处于未分配状态的相邻内存块与该欲释放的内存块合并 为 一个空闲的内存块,同时修改所述已分配内存队列的信息。
2、 如权利要求l所述的方法,其特征在于,所述步骤(2)中,所述 两个队列在初始创建时,所述已分配内存队列为空,所述未分配内存队列 中只有一个节点,记录整个大内存池的内存情况。
3、 如权利要求l所述的方法,其特征在于,所述步骤(3)中,所述 判断当前申请的内存大小是否在普通内存池所能提供的内存块大小范围 内的步骤,是判断该内存存储块的大小与当前申请的内存大小相匹配的普通内存池中是否存在相应的空闲内存存储块。
4、 如权利要求3所述的方法,其特征在于,所述步骤(3)中,当判 断到当前申请的内存大小未在普通内存池所能提供的内存块大小范围内 时,进一步包括判断当前申请内存的大小是否大于所述大内存池所能提 供内存的最大申请大小,如果是,则拒绝该申请。
5、 如权利要求3所述的方法,其特征在于,所述步骤(3)中,当判 断到当前申请的内存大小未在普通内存池所能提供的内存块大小范围内 时,包括如果当前申请的内存大小不超过大内存池所能提供内存申请的 最大申请大小,则从所述未分配内存的队列中查找一个适用的内存块,并 判断该找到的内存块的大小是否不小于普通内存池中最大的内存存储块 的大小和当前申请内存大小之和,如果是,则从该内存块中分割出一个与 当前申请内存块大小匹配的内存块并分配给所述应用,并将分割后剩余的 内存信息更新到未分配内存队列中;如果否,则将该找到的内存块完全分 配给所述应用,并才艮据分配情况更新未分配内存队列与已分配内存队列中 的信息。
6、 如权利要求1所述的方法,其特征在于,所述创建普通内存池的 数量与系统的CPU数量一致。
7、 如权利要求1所述的方法,其特征在于,所述创建大内存池的大 小不超过系统可申请内存的50%。
8、 如权利要求1所述的方法,其特征在于,所述创建大内存池的大 小占系统可申请内存的10%至20%。
9、 如权利要求1所述的方法,其特征在于,所述为普通内存池申请 的内存块的大小不同。
全文摘要
本发明公开了一种避免内存碎片化的内存分配方法,使内存申请者随时都可以申请到合适大小的内存块;在某种大小的内存存储块消耗完后,可以到大内存池中去申请,解决了申请不到内存而产生系统异常的问题;当申请大块内存时,可以在大的内存池中直接的分配,解决了传统方法的内存资源的浪费以及内存碎片的问题。
文档编号G06F12/02GK101122883SQ20061010429
公开日2008年2月13日 申请日期2006年8月9日 优先权日2006年8月9日
发明者徐其龙 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1