一种避免内存碎片化的内存分配方法组成比例

技术编号:2833811 阅读:1309 留言:0更新日期:2012-04-11 18:40
本发明专利技术公开了一种避免内存碎片化的内存分配方法,使内存申请者随时都可以申请到合适大小的内存块;在某种大小的内存存储块消耗完后,可以到大内存池中去申请,解决了申请不到内存而产生系统异常的问题;当申请大块内存时,可以在大的内存池中直接的分配,解决了传统方法的内存资源的浪费以及内存碎片的问题。

【技术实现步骤摘要】

本专利技术涉及一种软件开发中使用的避免内存碎片化的内存分配方法, 属于内存管理

技术介绍
在一个电信通讯系统中,系统能否稳定可靠的运行直接影响到业务的 准确性和实时性。系统在运行中需要频繁的申请和释放内存,在长期的运行过程中系统 会产生大量的内存碎片,这个问题严重的影响了系统的稳定运行。对于内 存碎片化问题,现有的各种系统都有自己的内存管理机制。该内存管理机 制 一般的方法是根据操作系统所能提供内存的大小预先把系统的内存划 分为大小不同的内存池,再将每一个内存池中的内存划分为固定大小一致的内存快。 一般情况下,内存池的大小是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、找到一个合适的基本内存池,查找是否有合适的内存存本文档来自技高网
...

【技术保护点】
一种避免内存碎片化的内存分配方法,其特征在于,包括如下步骤:(1)创建至少一个普通内存池,为每一个普通内存池向操作系统申请一定数量的内存块,所述每一个内存块由一个以上的大小相同的内存存储块组成;(2)创建一个大内存池,由操作 系统中可提供申请的剩余内存组成,并在其中创建两个队列,一个是已分配内存队列,记录大内存池中已经分配的内存块的情况,另一个是未分配内存队列,记录大内存池中未分配内存的信息;(3)当应用申请内存时,判断当前申请的内存大小是否在普通内存池 所能提供的内存块大小范围内,如果是,则在普通内存池中分配相应大小的空闲内存存储块给该应用,并将已经分配的内存存储块标记为已经占用;如果否,则查询所述未分配内存队列的记录,从大内存池中分配相应大小的内存块给该应用,并将该已分配信息记录入所述已分配内存队列;(4)当应用释放内存时,判断当前欲释放的内存块是从普通内存池,还是从大内存池中申请得到的,如果是从普通内存池中申请得到的,则取消对应内存存储块的占用标记;如果是从大内存池中分配得到的,则在未分配内存队列中查询该当前欲释 放的内存块的前后相邻内存是否是未分配状态,并将其中处于未分配状态的相邻内存块与该欲释放的内存块合并为一个空闲的内存块,同时修改所述已分配内存队列的信息。...

【技术特征摘要】

【专利技术属性】
技术研发人员:徐其龙
申请(专利权)人:中兴通讯股份有限公司
类型:发明
国别省市:94[中国|深圳]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1