CN1996258A - 一种动态内存池的实现方法 - Google Patents
一种动态内存池的实现方法 Download PDFInfo
- Publication number
- CN1996258A CN1996258A CNA2006101665258A CN200610166525A CN1996258A CN 1996258 A CN1996258 A CN 1996258A CN A2006101665258 A CNA2006101665258 A CN A2006101665258A CN 200610166525 A CN200610166525 A CN 200610166525A CN 1996258 A CN1996258 A CN 1996258A
- Authority
- CN
- China
- Prior art keywords
- memory
- pool
- page
- pages
- memory pool
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Memory System Of A Hierarchy Structure (AREA)
Abstract
一种动态内存池的实现方法,其特征在于可配置多个由固定大小内存页面构成的内存缓冲池,内存页面的大小和数量可由应用指定;对于特定页面大小的内存缓冲池,在系统允许的范围内,页面的数量可由系统动态扩充或回收,并对应用透明;本发明还支持可配置的检测内存越界、内存泄露的功能。本发明应用于一般的实时系统的开发,实现灵活、高效的内存管理,提高系统的运行效率和健壮性。
Description
技术领域
本发明涉及计算机内存管理技术,提供了一种实现动态内存池的方法,并支持可配置的检测内存越界、内存泄露的功能。
背景技术
在通信领域中,为了提高系统的实时性,需要减少线程切换、系统调用、中断响应以及内存操作的开销,而内存管理的效率是影响系统开销的重要因素。成熟的通信产品中一般都有专门的内存管理子系统。
操作系统一般都提供的是基于堆的内存分配策略,可以分酸变长的内存块。它的优点是消除了内存块内部的碎片,但是系统长时间运行后,内存块间会引入外部分片,导致大量的内存浪费。另外一个重要缺点是内存的分配、释放的时间存在不确定性,因此实时系统中一般不直接使用这种策略。
实时系统中通常使用静态的内存分配方式,并采用固定长度的内存分配策略。按照内存块的大小,组织若干个内存缓冲池,构成一个内存区域。如果内存的大小是按照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,因此采用本方法后内存分配与释放的性能显著提高,最终提高了整个系统的处理能力。另外,内存泄漏、内存越界检查功能增强了系统的可调试性,加快了产品开发的进度。
虽然已经详细的公开和说明了本发明,但是本领域的技术人员会理解:无需脱离本发明的精神和保护范围,就可以做出过各种形式上和细节上的改变。
Claims (3)
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检查该哈希表,显示没有释放的内存块以及上下文信息;开发人员结合上下文信息确认是否为内存泄漏。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNA2006101665258A CN1996258A (zh) | 2006-12-28 | 2006-12-28 | 一种动态内存池的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNA2006101665258A CN1996258A (zh) | 2006-12-28 | 2006-12-28 | 一种动态内存池的实现方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1996258A true CN1996258A (zh) | 2007-07-11 |
Family
ID=38251356
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNA2006101665258A Pending CN1996258A (zh) | 2006-12-28 | 2006-12-28 | 一种动态内存池的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1996258A (zh) |
Cited By (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100557571C (zh) * | 2007-12-13 | 2009-11-04 | 中国科学院计算技术研究所 | 一种资源分配方法和系统 |
CN101847127A (zh) * | 2010-06-18 | 2010-09-29 | 福建星网锐捷网络有限公司 | 一种内存管理方法及装置 |
CN101847157A (zh) * | 2010-04-27 | 2010-09-29 | 北京神州泰岳软件股份有限公司 | 一种基于ussd的手机浏览器数据缓存及初始化方法 |
CN101984417A (zh) * | 2010-11-01 | 2011-03-09 | 中兴通讯股份有限公司 | 内存管理方法及装置 |
CN101286878B (zh) * | 2008-04-22 | 2012-02-29 | 中兴通讯股份有限公司 | 一种终端的内存池的管理方法 |
WO2012034322A1 (zh) * | 2010-09-14 | 2012-03-22 | 中兴通讯股份有限公司 | 嵌入式系统内存池配置方法及装置 |
CN102455974A (zh) * | 2010-10-21 | 2012-05-16 | 上海宝信软件股份有限公司 | 一种内存消耗可控的高速内存申请释放管理系统及方法 |
CN102650959A (zh) * | 2012-03-31 | 2012-08-29 | 华为技术有限公司 | 一种检测内存单元的方法及设备 |
CN102799471A (zh) * | 2012-05-25 | 2012-11-28 | 上海斐讯数据通信技术有限公司 | 操作系统的进程回收方法及系统 |
CN102053868B (zh) * | 2009-11-04 | 2016-08-10 | 突触计算机系统(上海)有限公司 | 一种内存泄露检测方法和装置 |
CN106598736A (zh) * | 2016-12-13 | 2017-04-26 | 深圳中科讯联科技股份有限公司 | 一种内存池的内存块调用方法和释放方法及服务器 |
WO2017167120A1 (zh) * | 2016-03-31 | 2017-10-05 | 阿里巴巴集团控股有限公司 | 一种管理应用程序的方法及装置 |
CN107861887A (zh) * | 2017-11-30 | 2018-03-30 | 科大智能电气技术有限公司 | 一种串行易失性存储器的控制方法 |
CN109254850A (zh) * | 2018-09-30 | 2019-01-22 | 深圳市万普拉斯科技有限公司 | 存储器资源管理方法及系统 |
CN109492018A (zh) * | 2018-09-12 | 2019-03-19 | 武汉达梦数据库有限公司 | 一种数据同步系统自适应动态调整方法和装置 |
CN109753361A (zh) * | 2019-01-04 | 2019-05-14 | 合肥杰发科技有限公司 | 一种内存管理方法、电子设备及存储装置 |
CN109874027A (zh) * | 2019-03-11 | 2019-06-11 | 宸瑞普惠(广州)科技有限公司 | 一种低延时手术示教直播方法及其系统 |
CN109992402A (zh) * | 2017-12-29 | 2019-07-09 | 广东欧珀移动通信有限公司 | 内存处理方法和装置、电子设备、计算机可读存储介质 |
CN110943936A (zh) * | 2019-11-08 | 2020-03-31 | 中国科学院信息工程研究所 | 一种高效的基于动态数组的网络流量处理方法及系统 |
CN111638956A (zh) * | 2020-05-28 | 2020-09-08 | 腾讯科技(深圳)有限公司 | 一种应用的运行方法、设备及存储介质 |
CN112269665A (zh) * | 2020-12-22 | 2021-01-26 | 北京金山云网络技术有限公司 | 内存的处理方法和装置、电子设备和存储介质 |
-
2006
- 2006-12-28 CN CNA2006101665258A patent/CN1996258A/zh active Pending
Cited By (27)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100557571C (zh) * | 2007-12-13 | 2009-11-04 | 中国科学院计算技术研究所 | 一种资源分配方法和系统 |
CN101286878B (zh) * | 2008-04-22 | 2012-02-29 | 中兴通讯股份有限公司 | 一种终端的内存池的管理方法 |
CN102053868B (zh) * | 2009-11-04 | 2016-08-10 | 突触计算机系统(上海)有限公司 | 一种内存泄露检测方法和装置 |
CN101847157B (zh) * | 2010-04-27 | 2012-09-05 | 北京神州泰岳软件股份有限公司 | 一种基于ussd的手机浏览器初始化方法 |
CN101847157A (zh) * | 2010-04-27 | 2010-09-29 | 北京神州泰岳软件股份有限公司 | 一种基于ussd的手机浏览器数据缓存及初始化方法 |
CN101847127A (zh) * | 2010-06-18 | 2010-09-29 | 福建星网锐捷网络有限公司 | 一种内存管理方法及装置 |
CN101847127B (zh) * | 2010-06-18 | 2012-01-25 | 福建星网锐捷网络有限公司 | 一种内存管理方法及装置 |
WO2012034322A1 (zh) * | 2010-09-14 | 2012-03-22 | 中兴通讯股份有限公司 | 嵌入式系统内存池配置方法及装置 |
CN102455974A (zh) * | 2010-10-21 | 2012-05-16 | 上海宝信软件股份有限公司 | 一种内存消耗可控的高速内存申请释放管理系统及方法 |
CN101984417A (zh) * | 2010-11-01 | 2011-03-09 | 中兴通讯股份有限公司 | 内存管理方法及装置 |
CN102650959A (zh) * | 2012-03-31 | 2012-08-29 | 华为技术有限公司 | 一种检测内存单元的方法及设备 |
CN102799471A (zh) * | 2012-05-25 | 2012-11-28 | 上海斐讯数据通信技术有限公司 | 操作系统的进程回收方法及系统 |
CN102799471B (zh) * | 2012-05-25 | 2014-11-05 | 上海斐讯数据通信技术有限公司 | 操作系统的进程回收方法及系统 |
WO2017167120A1 (zh) * | 2016-03-31 | 2017-10-05 | 阿里巴巴集团控股有限公司 | 一种管理应用程序的方法及装置 |
US11182213B2 (en) | 2016-03-31 | 2021-11-23 | Banma Zhixing Network (Hongkong) Co., Limited | Application program management method and device |
CN106598736A (zh) * | 2016-12-13 | 2017-04-26 | 深圳中科讯联科技股份有限公司 | 一种内存池的内存块调用方法和释放方法及服务器 |
CN107861887A (zh) * | 2017-11-30 | 2018-03-30 | 科大智能电气技术有限公司 | 一种串行易失性存储器的控制方法 |
CN109992402A (zh) * | 2017-12-29 | 2019-07-09 | 广东欧珀移动通信有限公司 | 内存处理方法和装置、电子设备、计算机可读存储介质 |
CN109492018A (zh) * | 2018-09-12 | 2019-03-19 | 武汉达梦数据库有限公司 | 一种数据同步系统自适应动态调整方法和装置 |
CN109492018B (zh) * | 2018-09-12 | 2020-12-22 | 武汉达梦数据库股份有限公司 | 一种数据同步系统自适应动态调整方法和装置 |
CN109254850A (zh) * | 2018-09-30 | 2019-01-22 | 深圳市万普拉斯科技有限公司 | 存储器资源管理方法及系统 |
CN109753361A (zh) * | 2019-01-04 | 2019-05-14 | 合肥杰发科技有限公司 | 一种内存管理方法、电子设备及存储装置 |
CN109874027A (zh) * | 2019-03-11 | 2019-06-11 | 宸瑞普惠(广州)科技有限公司 | 一种低延时手术示教直播方法及其系统 |
CN110943936A (zh) * | 2019-11-08 | 2020-03-31 | 中国科学院信息工程研究所 | 一种高效的基于动态数组的网络流量处理方法及系统 |
CN111638956A (zh) * | 2020-05-28 | 2020-09-08 | 腾讯科技(深圳)有限公司 | 一种应用的运行方法、设备及存储介质 |
CN111638956B (zh) * | 2020-05-28 | 2024-08-27 | 腾讯科技(深圳)有限公司 | 一种应用的运行方法、设备及存储介质 |
CN112269665A (zh) * | 2020-12-22 | 2021-01-26 | 北京金山云网络技术有限公司 | 内存的处理方法和装置、电子设备和存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1996258A (zh) | 一种动态内存池的实现方法 | |
CN108038002B (zh) | 一种嵌入式软件内存管理方法 | |
CN108132842B (zh) | 一种嵌入式软件内存管理系统 | |
CN101971146B (zh) | 改进作为管理程序来宾而运行的虚拟机中内存使用情况的系统和方法 | |
CN105224478B (zh) | 一种映射表的形成、更新和恢复方法及电子设备 | |
US7181585B2 (en) | Defensive heap memory management | |
US10949342B2 (en) | Persistent memory garbage collection | |
CN101432702B (zh) | 在事务处理码内对存储器分配和解除分配的系统和方法 | |
CN101493787B (zh) | 一种内存操作的管理方法及系统 | |
CN100487658C (zh) | 一种检测内存访问越界的方法 | |
US7587566B2 (en) | Realtime memory management via locking realtime threads and related data structures | |
US20070136385A1 (en) | Defensive Heap Memory Management | |
US8612493B2 (en) | Allocation cache premarking for snap-shot-at-the-beginning concurrent mark-and-sweep collector | |
CN101968772B (zh) | 嵌入式系统高效内存池的实现方法 | |
CN103677884B (zh) | flash分区表文件生成及其数据升级方法、装置 | |
CN101859279B (zh) | 一种内存分配、释放方法及装置 | |
CN104412241A (zh) | 用于主存储器数据库的存储器紧缩机制 | |
CN106547612A (zh) | 一种多任务处理方法及装置 | |
CN1963788A (zh) | 一种内存管理方法 | |
US20020099918A1 (en) | Methods and systems for managing heap creation and allocation | |
CN107256196A (zh) | 基于闪存阵列的支持零拷贝的缓存系统及方法 | |
CN105718319B (zh) | 一种内存池版图解析方法和内存池装置 | |
CN101702138A (zh) | 一种内存管理方法、系统及服务器 | |
US5963982A (en) | Defragmentation of stored data without pointer indirection | |
KR101835604B1 (ko) | 메모리를 위한 스케줄러 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |