一种动态内存池的实现方法

文档序号:6564265阅读:204来源:国知局
专利名称:一种动态内存池的实现方法
技术领域
本发明涉及计算机内存管理技术,提供了一种实现动态内存池的方法,并支持可配置的检测内存越界、内存泄露的功能。
背景技术
在通信领域中,为了提高系统的实时性,需要减少线程切换、系统调用、中断响应以及内存操作的开销,而内存管理的效率是影响系统开销的重要因素。成熟的通信产品中一般都有专门的内存管理子系统。
操作系统一般都提供的是基于堆的内存分配策略,可以分酸变长的内存块。它的优点是消除了内存块内部的碎片,但是系统长时间运行后,内存块间会引入外部分片,导致大量的内存浪费。另外一个重要缺点是内存的分配、释放的时间存在不确定性,因此实时系统中一般不直接使用这种策略。
实时系统中通常使用静态的内存分配方式,并采用固定长度的内存分配策略。按照内存块的大小,组织若干个内存缓冲池,构成一个内存区域。如果内存的大小是按照2的倍数递增,那么可以通过专门的汇编指令加速内存缓冲池的定位(通常只需要若干条指令),否则也可以通过查找算法,如二分法加速内存缓冲池的定位。内存块的分配和释放通常是基于链表的操作,因此其开销主要在于用于互斥的P、V操作。这种内存管理策略引入了内存块内部的碎片,但是消除了内存块之间的碎片,且内存分配、释放的时间相对确定。
中国专利文献00108090.3列出了一种实时系统中快速分配与释放的方法。它假定内存块存在2的倍数关系,利用汇编中存在计算前导零个数的位串操作相关的机器指令,加速内存缓冲池的定位。如果内存块不是这种倍数关系,则需要使用其它搜索算法,进行内存池定位。
中国专利文献01118873.1公开了一种自适应动态内存管理方法,当页面簇中的所有分片均处于空闲时,该页面簇可以被转换成所需类型的页面簇以供申请,实现了内存空间的动态管理,使内存资源得以充分利用。
如果针对不同的内存缓冲池,能够配置合理数量的内存页面,系统可以正常运行了。但由于业务的复杂性、多模块耦合等因素,开发人员难以预期系统运行中所需内存页面的准确数量。当系统运行在较轻负载情况或内存页面大小的分布发生变化时,应用指定的内存页面的数量可能不合理。此外,系统静态分配的内存页面可能不能适应突发的内存请求,虽然系统中还有可用的物理或虚拟内存。
中国专利文献01118873.1也是一种动态调整内存池配置的方法,但没有考虑突发的内存请求的处理。
此外,内存池的管理需要综合考虑基本的内存泄漏检测、内存越界检测的功能,尤其是在系统调试的时候。

发明内容
本发明的目的是为了提高系统的内存管理效率和灵活性,提供一种动态内存池的实现方法,内存池可以在系统允许的范围内动态扩展,适应突发的情况。本发明允许系统在较轻负载情况或内存页面大小的分布发生变化时,释放空闲的内存缓冲池,减少系统开销。本发明还实现可配置的检测内存越界、内存泄露的功能。
本发明的技术方案是一种动态内存池的实现方法,其特征在于采用固定大小的内存分配方式,而且每一类型的内存缓冲池是可以扩展或回收的;如果应用申请的内存超出了当前可用内存页面的数量,触发内存缓冲池扩展申请,在系统配置允许的范围内则向操作系统申请新的内存缓冲池,并向应用返回可用的内存页面地址;如果系统处于较轻的负载或内存块大小的分布情况发生了较大的变化时,触发内存池回收的请求,若在系统配置允许的范围内,则向操作系统释放空闲的内存缓冲池。
如上所述的动态内存池的实现方法,其特征在于内存页面上的应用数据区前后配置不可写的区域,使用特定的字符填充,并使用哈西表记录内存分配、释放等操作的上下文信息。这是实现内存越界、内存泄露的检测功能的技术要点。
如上所述的动态内存池的实现方法,其特征在于采用下列特征首先是内存池初始化,包括以下步骤步骤1初始化内存池配置数据,并缓冲池链表、空闲页面链表,如果是多任务或多线程访问内存池,还需要初始化互斥信号量;步骤2分配内存缓冲池的初始化配置指定的内存空间,并分配空闲页面;其次是内存池的扩展技术,包括以下步骤步骤1内存缓冲池的页面没有空闲,触发内存缓冲池的扩展请求;步骤2检察当前已分配的内存页面总量是否小于允许的最大总量,否则返回扩展失败;步骤3计算内存池扩充的内存大小,是否在操作系统允许的范围内,否则返回扩展失败;步骤4向操作系统申请新的内存池空间,并缀到内存缓冲池的队列末尾,并更新内存缓冲池的数量;步骤5将新的内存缓冲池的所有内存页面添加到空闲页面链表的尾部,并更新当前可用的页面数量以及内存页面的总量;再次是内存池的回收技术,包括以下步骤步骤1启动独立的线程或任务,定期执行内存池的回收检查;当体眠时间到,则执行步骤2;步骤2当内存缓冲池的大小没有超出阀值,则任务再次体眠,否则执行步骤3,触发内存池回收的操作;步骤3如果内存池的页面总数不大于内存池的保留的页面数量,则执行步骤4,否则跳出对该内存池的检查;步骤4检查内存池上是否存在已经分配出去的页面,存在则跳出对该内存池的检查,否则释放内存上空间的内存页面以及该内存缓冲池;步骤5如果还有未检查的内存缓冲池,跳转到步骤3,否则内存回收过程结束,再次休眠并等待体眠时间到重复步骤2~5;最后是可配置的内存越界、内存泄漏的检测功能,其中内存越界的检测包含以下步骤步骤1在内存池初始化时,将内存页面以及前后的保留内存均填充为0xdb;步骤2内存分配时,将内存页面内的碎片也填充为0xdb;步骤3启动独立的线程或任务,或在内存的分配、释放时,检查可能的内存越界;如果是在独立的线程或任务中执行,则检查所有的内存页面的页面内部碎片以及前后保留内存是否被改写,否则检查单个内存页面的内部碎片以及前后保留内存是否被改写;如果发生了越界改写,就报告内存越界以及相关的上下文信息,为调试提供线索;内存泄露的检测包含以下步骤步骤1初始化记录内存页面上下文信息的哈希表,记录的关键字为内存块指针;步骤2内存分配、释放操作时,记录上下文信息,包括内存页面的类型、大小、创建时间、位置、最近的历史操作列表和计数信息;步骤3检查该哈希表,显示没有释放的内存块以及上下文信息;开发人员结合上下文信息确认是否为内存泄漏。
本发明的优点如下①保持了内存静态分配的高效率的优点,同时在可控的范围内允许内存池动态扩展和回收,简化了内存池的配置管理以及增强了系统处理突发内存请求的健壮性。
②提供了基本的内存越界、内存泄漏检查的功能,提高了系统的可调试性。
③方法具有通用性,使用于各种类型的操作系统。


图1,本发明实施例的内存池结构示意图。
具体实施例方式
下面用实施例对本发明作进一步的详细描述。
图1描述了本发明实施例的内存池结构示意图。101是不同类型的内存缓冲池的数组单元,它记录了缓冲池的链表头指针、个数和扩展信息以及空闲内存页面的个数、链表头指针。102描述了一个缓冲池的结构,它由兄弟成员链指针、缓冲池头信息和数据页面构成。103描述了内存页面的结构,并通过空闲页面指针链接为空闲页面链表。103指向的内存空间已经分配在了102所示的结构中。
本发明已经在通信网络数据安全产品上得到应用性的实验,达到了预期的目的。在PIII 1G的单板上,采用本发明所述的方法,内存分配释放的平均效率为0.6us,而现有的技术中内存分配释放的平均效率为3.7us,因此采用本方法后内存分配与释放的性能显著提高,最终提高了整个系统的处理能力。另外,内存泄漏、内存越界检查功能增强了系统的可调试性,加快了产品开发的进度。
虽然已经详细的公开和说明了本发明,但是本领域的技术人员会理解无需脱离本发明的精神和保护范围,就可以做出过各种形式上和细节上的改变。
权利要求
1.一种动态内存池的实现方法,其特征在于采用固定大小的内存分配方式,而且每一类型的内存缓冲池是可以扩展或回收的;如果应用申请的内存超出了当前可用内存页面的数量,触发内存缓冲池扩展申请,在系统配置允许的范围内则向操作系统申请新的内存缓冲池,并向应用返回可用的内存页面地址;如果系统处于较轻的负载或内存块大小的分布情况发生了较大的变化时,触发内存池回收的请求,若在系统配置允许的范围内,则向操作系统释放空闲的内存缓冲池。
2.如权利要求1所述的动态内存池的实现方法,其特征在于内存页面上的应用数据区前后配置不可写的区域,使用特定的字符填充,并使用哈西表记录内存分配、释放等操作的上下文信息。
3.如权利要求2所述的动态内存池的实现方法,其特征在于采用下列特征首先是内存池初始化,包括以下步骤步骤1初始化内存池配置数据,并缓冲池链表、空闲页面链表,如果是多任务或多线程访问内存池,还需要初始化互斥信号量;步骤2分配内存缓冲池的初始化配置指定的内存空间,并分配空闲页面;其次是内存池的扩展技术,包括以下步骤步骤1内存缓冲池的页面没有空闲,触发内存缓冲池的扩展请求;步骤2检察当前已分配的内存页面总量是否小于允许的最大总量,否则返回扩展失败;步骤3计算内存池扩充的内存大小,是否在操作系统允许的范围内,否则返回扩展失败;步骤4向操作系统申请新的内存池空间,并缀到内存缓冲池的队列末尾,并更新内存缓冲池的数量;步骤5将新的内存缓冲池的所有内存页面添加到空闲页面链表的尾部,并更新当前可用的页面数量以及内存页面的总量;再次是内存池的回收技术,包括以下步骤步骤1启动独立的线程或任务,定期执行内存池的回收检查;当休眠时间到,则执行步骤2;步骤2当内存缓冲池的大小没有超出阀值,则任务再次休眠,否则执行步骤3,触发内存池回收的操作;步骤3如果内存池的页面总数不大于内存池的保留的页面数量,则执行步骤4,否则跳出对该内存池的检查;步骤4检查内存池上是否存在已经分配出去的页面,存在则跳出对该内存池的检查,否则释放内存上空间的内存页面以及该内存缓冲池;步骤5如果还有未检查的内存缓冲池,跳转到步骤3,否则内存回收过程结束,再次休眠并等待休眠时间到重复步骤2~5;最后是可配置的内存越界、内存泄漏的检测功能,其中内存越界的检测包含以下步骤步骤1在内存池初始化时,将内存页面以及前后的保留内存均填充为0xdb;步骤2内存分配时,将内存页面内的碎片也填充为0xdb;步骤3启动独立的线程或任务,或在内存的分配、释放时,检查可能的内存越界;如果是在独立的线程或任务中执行,则检查所有的内存页面的页面内部碎片以及前后保留内存是否被改写,否则检查单个内存页面的内部碎片以及前后保留内存是否被改写;如果发生了越界改写,就报告内存越界以及相关的上下文信息,为调试提供线索;内存泄露的检测包含以下步骤步骤1初始化记录内存页面上下文信息的哈希表,记录的关键字为内存块指针;步骤2内存分配、释放操作时,记录上下文信息,包括内存页面的类型、大小、创建时间、位置、最近的历史操作列表和计数信息;步骤3检查该哈希表,显示没有释放的内存块以及上下文信息;开发人员结合上下文信息确认是否为内存泄漏。
全文摘要
一种动态内存池的实现方法,其特征在于可配置多个由固定大小内存页面构成的内存缓冲池,内存页面的大小和数量可由应用指定;对于特定页面大小的内存缓冲池,在系统允许的范围内,页面的数量可由系统动态扩充或回收,并对应用透明;本发明还支持可配置的检测内存越界、内存泄露的功能。本发明应用于一般的实时系统的开发,实现灵活、高效的内存管理,提高系统的运行效率和健壮性。
文档编号G06F9/46GK1996258SQ20061016652
公开日2007年7月11日 申请日期2006年12月28日 优先权日2006年12月28日
发明者涂小明 申请人:武汉虹旭信息技术有限责任公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1