一种内存池管理的方法

阅读: 评论:0

著录项
  • CN03105052.2
  • 20030303
  • CN1527206
  • 20040908
  • 华为技术有限公司
  • 石兴华
  • G06F12/08(2006.01)
  • G06F12/08(2006.01)

  • 广东省深圳市科技园科发路华为用服大厦
  • 中国,CN,广东(44)
  • 北京德琦知识产权代理有限公司
  • 张颖玲
摘要
本发明提供一种内存池管理的方法,包括以下步骤:设置若干个子内存池,为每个子内存池申请一定数目大小相同的gen内存块,并将同一子内存池的gen进一步划分为若干个大小相同的mem内存块,将未被划分的内存设置为OS内存池;应用模块申请内存时,虚拟操作系统先判断其所申请内存的大小是否大于每个子内存池中mem的大小,如果是则直接从OS内存池中为该应用模块分配内存块,否则根据其申请的大小到相应的子内存池,并判断该子内存池中是否有空闲的mem,如果是则直接将该子内存池中的空闲mem分配给应用模块;否则虚拟操作系统先为该子内存池从OS内存池中动态申请一个gen后,再将该gen中的空闲mem分配给应用模块,并将已分配的mem标为占用。
权利要求

1、一种内存池管理的方法,其特征在于该方法包括以下步骤:

a、设置一个以上子内存池,为每个子内存池从底层操作系统中申请一 定数目大小相同的单位内存块,并将同一子内存池中的每个单位内存块进一 步划分为至少一个以上大小相同的存贮内存块;然后将底层操作系统中未被 划分的内存设置为操作系统内存池;

b、当应用模块申请内存时,虚拟操作系统先判断所申请内存的大小是 否大于每个子内存池所能提供的存贮内存块的大小,如果是,则进入步骤c, 否则,进入步骤d;

c、判断所申请内存的大小是否小于等于当前操作系统内存池所能提供 的内存的大小,如果是,则虚拟操作系统直接从操作系统内存池中为该应用 模块分配内存块,结束本流程,否则拒绝本次申请,结束本流程;

d、虚拟操作系统根据所申请内存的大小到存贮内存块的大小与之相 匹配的子内存池,并判断该子内存池中是否有空闲的存贮内存块,如果是, 则直接将该子内存池中的空闲存贮内存块分配给应用模块后,将已分配的存 贮内存块标记为占用;否则,虚拟操作系统为该子内存池从操作系统内存池 中动态申请一单位内存块后,再将该单位内存块中的空闲存贮内存块分配给 应用模块,并将已分配的存贮内存块标记为占用。

2、根据权利要求1所述的方法,其特征在于:步骤a所述子内存池被 划分为控制块内存和缓冲器内存两种类型。

5、根据权利要求2所述的方法,其特征在于,所述步骤c进一步包括: 当应用模块申请内存时,虚拟操作系统首先判断其申请内存的类型,在相应 类型的子内存池中再根据其申请的大小做相应处理。

3、根据权利要求1所述的方法,其特征在于,步骤a所述的一定数目 是根据每种大小内存池的使用平均值而确定的。

4、根据权利要求1所述的方法,其特征在于,不同子内存池中单位内 存块所划分的存贮内存块大小不同。

6、根据权利要求1所述的方法,其特征在于该方法进一步包括:当应 用模块释放直接从操作系统内存池中申请的超大内存块时,将该超大内存块 直接返回给操作系统内存池。

7、根据权利要求1或5所述的方法,其特征在于,所述步骤c进一步 包括:当应用模块释放内存后,虚拟操作系统取消对该存贮内存块的占用标 记,并判断其相应子内存池中单位内存块的个数是否超过初始化时所设定的 一定数目,如果是,则将超出初始化数目的空闲单位内存块返还给底层操作 系统;否则不做处理。

说明书
技术领域

技术领域

本发明涉及内存管理技术领域,特别是指一种内存池管理的方法。

背景技术

目前,为了避免直接hh使用系统调用分配内存带来的内存碎片化问题,现 有的虚拟操作系统都有一套内存管理机制。该内存管理机制一般是将底层操 作系统的全部内存一次性地划分为大小不同的内存池,再将每一内存池中的 内存划分为固定的大小一致的内存块。通常情况下,内存池的大小是2的幂 字节数,并且一个内存池的大小是它左邻居内存池大小的2倍,例如,一个 虚拟操作系统有N个内存池,一般每个内存池中内存块的大小分别为2、4、 8、16、32、64……1024、2048字节……。由于内存池的个数、每个内存池 中内存块的大小、内存块的数目等参数是在虚拟操作系统初始化时就被固定 下来的,并且这些参数在虚拟操作系统运行过程中不会动态改变,因此为了 高效地利用内存,必须事先统计各种不同内存的使用情况,例如每种内存的 使用平均值、峰值等,根据这些统计数据再将内存进行合理地划分。

内存池的属性是由内存池描述符来描述,在内存池描述符中记录了该内 存池中内存块的大小、类型、总数量、空闲的数量等属性。同时每个内存池 中有两个链表——空闲内存块链表和占用内存块链表。

在应用模块申请内存时,虚拟操作系统从其现有地内存块大小最接近应 用模块所要求的内存池中指定一内存块,将该内存块的指针返给应用模块, 同时将该内存块从其所在内存池的空闲内存块链表中取出,插入到占用内存 块链表中。当应用模块释放内存时,虚拟操作系统再将该内存块从其所在内 存池的占用内存块链表中移到空闲内存块链表中。

现有内存管理机制的缺陷在于:每种内存池的数目及每个内存池中内存 块的数目是在虚拟操作系统运行前预先划分好的,这样在应用模块申请内存 时,如果某种大小的内存块已消耗完毕,则可能因应用模块申请不到内存而 造成系统异常,即使虚拟操作系统能够从较大的内存池中分配一内存块给该 应用模块,也会造成系统内存的浪费;如果应用模块要申请一个所有内存池 都无法提供的超大内存块,则会因应用模块申请不到内存而造成系统异常。

发明内容

有鉴于此,本发明提供一种内存池管理的方法,使应用模块随时都可申 请到与之相匹配的内存块,并且在系统剩余内存空间允许的情况下,应用模 块可随时申请到超大内存块。

为达到上述目的本发明的技术方案是这样实现的:

一种内存池管理的方法,该方法包括以下步骤:

a、设置一个以上子内存池,为每个子内存池从底层操作系统中申请一 定数目大小相同的单位内存块,并将同一子内存池中的每个单位内存块进一 步划分为至少一个以上大小相同的存贮内存块;然后将底层操作系统中未被 划分的内存设置为操作系统内存池;

b、当应用模块申请内存时,虚拟操作系统先判断所申请内存的大小是 否大于每个子内存池所能提供的存贮内存块的大小,如果是,则进入步骤c, 否则,进入步骤d;

c、判断所申请内存的大小是否小于等于当前操作系统内存池所能提供 的内存的大小,如果是,则虚拟操作系统直接从操作系统内存池中为该应用 模块分配内存块,结束本流程,否则拒绝本次申请,结束本流程;

d、虚拟操作系统根据所申请内存的大小到存贮内存块的大小与之相 匹配的子内存池,并判断该子内存池中是否有空闲的存贮内存块,如果是, 则直接将该子内存池中的空闲存贮内存块分配给应用模块后,将已分配的存 贮内存块标记为占用;否则,虚拟操作系统为该子内存池从操作系统内存池 中动态申请一单位内存块后,再将该单位内存块中的空闲存贮内存块分配给 应用模块,并将已分配的存贮内存块标记为占用。

较佳地,步骤a所述子内存池被划分为控制块内存和缓冲器内存两种类 型。

较佳地,步骤a所述的一定数目是根据每种大小内存池的使用平均值而 确定的。

较佳地,不同子内存池中单位内存块所划分的存贮内存块大小不同。

较佳地,所述步骤c进一步包括:当应用模块申请内存时,虚拟操作系 统首先判断其申请内存的类型,在相应类型的子内存池中再根据其申请的大 小做相应处理。

较佳地,当应用模块释放直接从操作系统内存池中申请的超大内存块 时,将该超大内存块直接返回给操作系统内存池。

较佳地,所述步骤c进一步包括:当应用模块释放内存后,虚拟操作系 统取消对该存贮内存块的占用标记,并判断其相应子内存池中单位内存块的 个数是否超过初始化时所设定的一定数目,如果是,则将超出初始化数目的 空闲单位内存块返还给底层操作系统;否则不做处理。

应用本发明,通过动态管理内存块,使应用模块随时都可申请到与之匹 配的内存块,解决了由于某种内存块被耗尽后,应用模块因申请失败而导致 系统异常的问题;同时解决了因应用模块被分配给大于其需求的内存块而导 致系统内存资源使用浪费的问题。另外,只要在虚拟操作系统剩余内存空间 允许的范围内,应用模块可直接从操作系统内存池中申请所有子内存池都不 能提供的超大内存块,当应用模块释放该超大内存块时,该超大内存块将直 接返回给操作系统内存池,应用此方法,解决了应用模块因申请不到超大内 存块而导致系统异常的问题。同时,本发明有效地避免了底层操作系统内存 碎片化的问题。

附图说明

图1为应用本发明内存池管理方法的示意图;

图2为应用本发明一实施例的示意图。

具体实施方式

为使本发明的目的、技术方案及优点更加清楚明白,以下对本发明做进 一步详细说明。

图1所示为应用本发明内存池管理方法的示意图。虚拟操作系统设置若 干个子内存池(Subpool),并从底层操作系统内存中为每个子内存池申请 一定数目的大小一致的单位内存块(gen),并将该gen进一步划分为若干 个大小相同的存贮内存块(mem)。其中,子内存池又分为两种类型:一种 是控制块内存(CB POOL),用于存储应用模块的控制块等较为永久的数据; 另一种是缓冲器内存(BUF POOL),用于存储应用模块之间传递的消息数 据。同时,为实现本发明的管理方法,使用了一些数据结构对底层操作系统 内存进行管理,如图1中CB POOL CB为管理控制内存的数据结构、BUF POOL CB为管理缓冲器内存的数据结构、Subpool CB为子内存池数组,且 该数组中的每一元素对应一子内存池。除去上述底层操作系统中已被划分的 内存,将底层操作系统中未被划分的内存设置为操作系统内存池(OS POOL)。

在虚拟操作系统初始化时,虚拟操作系统从底层操作系统中为每个子内 存池申请若干个大小一致的gen,其申请gen的个数是根据该类内存块的使 用平均值而定。一个gen包含若干个mem内存块,因此,一个gen是一个 较大的内存块,且一个子内存池中gen的数目是动态可变的,即一个子内存 池中单位内存块的个数是可变的。由于每个子内存池最初所申请gen的数目 都是该类内存块的使用平均值而不是峰值,所以,在初始化底层操作系统后, 势必会剩余一大块未被虚拟操作系统“瓜分”的内存,该剩余的内存即为 OS POOL。

在系统运行过程中,当应用模块申请内存时,虚拟操作系统根据申请内 存的类型和大小,从最合适的子内存池中分配以mem为单位的内存块给应 用模块,并同时将这块内存标记为占用,相应地,当应用模块释放内存时, 系统取消对该mem内存块的标记。如果某个子内存池中所有以mem为单位 的内存块都被标记为占用,即该子内存池中所有的gen内存块都已耗净,则 虚拟操作系统将从OS内存池中为该子内存池申请一个gen内存块,然后继 续从该gen中为应用模块分配mem内存块。如果一个子内存池中gen的个 数超过了其初始化时的数目,并且由于应用模块释放内存使得某些gen中的 mem内存块全部空闲,则虚拟操作系统将把超出初始化数目的gen返还给底 层操作系统,即系统总是尽量保持每个子内存池中内存块gen的数目为该子 内存池的初始值。由此可见,一个子内存池中内存块的数目是可动态变化的, 并且虚拟操作系统总是以gen为单位从操作系统内存池中申请或释放内存, gen的容量一般较大,例如可以定为10K,因此可有效地避免底层操作系统 内存碎片化的问题。

当应用模块申请一任何子内存池都不能提供的超大内存块时,系统将直 接从OS内存池中为该应用模块申请内存块,只要OS内存池的剩余空间足 够大,应用模块的要求都会被满足,超大内存块被释放时,也是直接返还到 OS内存池中。

图2为应用本发明一实施例的示意图。假设在BUF POOL中有两个子 内存池,其每个子内存池中mem的大小分别为2.5K和5K。图中mem内存 块的右下角有黑三角标记的,代表该mem内存块已被应用模块占用,而没 有黑三角标记的mem内存块,表示该内存块还处于空闲状态。

如果现有一应用模块需要申请2K的缓冲区内存,则虚拟操作系统首先 根据应用模块所申请内存块大小定位到mem内存块的大小为2.5K的子内存 池中,并判断该子内存池中的mem内存块是否都被标为占用,如果不是, 则直接为其分配一个mem内存块,以满足其需求,并将已分配的men内存 块标为占用,否则,虚拟操作系统先从OS POOL中为该子内存池申请一个 gen,然后再从该gen中为应用模块分配一个2.5K的mem内存块,以满足 其需求,并将已分配的men内存块标为占用;当应用模块释放内存时,取 消对该mem内存块的标记,如果由于应用模块释放内存而出现了一个完全 空闲的gen,并且该子内存池中gen的总数目又大于初始化时gen的数目, 则将该空闲的gen归还给OS POOL。

如果现有一应用模块需要申请100K的超大内存,则虚拟操作系统首先 判断是否有能够提供100K内存块的子内存池,如果有,就直接为其分配 100K大小的mem内存块,并标记该mem内存块为占用,否则,判断当前 OS POOL中的内存是否大于等于100K,如果是,则直接从OS POOL中为 该应用模块提供内存块,否则,拒绝本次应用模块的申请;当该超大内存块 时被释放时,直接返还到OS POOL中。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本 发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在 本发明的保护范围之内。

本文发布于:2023-04-13 13:06:20,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/3/86028.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图