一种内存池的管理方法与流程

文档序号:14897434发布日期:2018-07-08 08:59阅读:136来源:国知局

本申请涉及计算机领域,尤其涉及一种内存池的管理方法。



背景技术:

在进行服务器开发时,有时会遇到需要频繁申请释放内存的场景,如果每次都直接向操作系统申请,不仅会效率低下,而且会导致内存碎片,对此有不少库都实现了内存池,即向操作系统申请大块内存(block),再分成小块(chunk)进行管理,用户从内存池申请内存,释放时再还给内存池,内存池一直保留着大块内存,减少了和操作系统的交互,提高了动态内存分配的效率。

在实际应用中,内存池为了满足动态内存分配释放高效的特点,往往是用链表方式管理这些chunk,申请释放都从链表头进行操作,以达到o(1)的时间复杂度。但这样也导致一个问题,就是当服务非常繁忙时,可能向内存池申请大量内存,甚至到几g,而后续当服务趋近平缓之后会向内存池归还这些内存,由于内存池中的chunk地址并非连续,因此无法释放整块block,所以内存池往往不会将这些内存归还给操作系统,这会导致内存占用量一直在峰值水平。

因此,现有技术中存在因内存池的chunk地址并非连续而无法释放整块block,导致内存占有量较高的技术问题。



技术实现要素:

本发明了提供了一种内存池的管理方法,以解决现有技术中存在的因内存池的chunk地址并非连续而无法释放整块block导致服务器的内存占有量较高的技术问题。

为解决上述技术问题,本发明实施例第一方面提供了一种内存池的管理方法,所述方法包括:

控制第一内存池提供动态内存分配操作和内存释放操作,并且控制第二内存池不提供动态内存分配操作和内存释放操作;

在所述第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值时,控制所述第一内存池仅提供内存释放操作,并且控制所述第二内存池提供动态内存分配操作和内存释放操作;

在所述第一内存池的内存全部释放之后,清空所述第一内存池,以及控制所述第二内存池提供动态内存分配操作和内存释放操作,并且控制所述第一内存池不提供动态内存分配操作和内存释放操作。

可选地,所述方法还包括:对所述第一内存池和所述第二内存池使用互斥锁。

可选地,所述控制第一内存池提供动态内存分配操作和内存释放操作,具体包括:

接收动态内存分配消息,获取当前负责动态内存分配的内存池为所述第一内存池;

基于所述动态内存分配消息,将所述第一内存池中的内存进行分配,并统计所述第一内存池的已分配内存和已使用内存;以及

接收内存释放消息,获取当前负责内存释放的内存池为所述第一内存池;

基于所述内存释放消息,调用所述第一内存池的内存释放函数释放内存。

可选地,所述在所述第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值时,控制所述第一内存池提供内存释放操作,并且控制所述第二内存池提供动态内存分配操作和内存释放操作,具体包括:

接收内存释放消息,获取所述当前仅负责内存释放的内存池为所述第一内存池;

判断所述内存释放消息对应的待释放内存是否属于所述第一内存池,若是,则调用所述第一内存池的内存释放函数,释放所述待释放内存,若不是,则调用所述第二内存池的内存是否函数,释放所述待释放内存;以及

接收动态内存分配消息,获取当前负责动态内存分配的内存池为所述第二内存池;

基于所述动态内存分配消息,将所述第二内存池中的内存进行分配,并统计所述第二内存池的已分配内存和已使用内存。

可选地,所述在所述第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值时,控制所述第一内存池提供内存释放操作,并且控制所述第二内存池提供动态内存分配操作和内存释放操作,具体包括:

接收内存释放消息,判断所述内存释放消息对应的待释放内存属于所述第一内存池或所述第二内存池;

若所述待释放内存属于所述第一内存池,调用所述第一内存池的内存释放函数,释放所述待释放内存;或者

若所述待释放内存属于所述第一内存池,调用所述第二内存池的内存释放函数,释放所述待释放内存;以及

接收动态内存分配消息,获取当前负责动态内存分配的内存池为所述第二内存池;

基于所述动态内存分配消息,将所述第二内存池中的内存进行分配,并统计所述第二内存池的已分配内存和已使用内存。

可选地,所述在所述第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值时,所述控制所述第一内存池提供内存释放操作,并且控制所述第二内存池提供动态内存分配操作和内存释放操作之前,所述方法还包括:

监测所述第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值的持续时间;

若所述持续时间大于第三阈值,才执行步骤:控制所述第一内存池提供内存释放操作,并且控制所述第二内存池提供动态内存分配操作和内存释放操作。

可选地,在所述监测所述第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值的持续时间之后,所述方法还包括:在任意时刻,若监测到所述已分配内存小于所述第一阈值或所述已使用内存大于所述第二阈值时,将所述持续时间清零。

本发明实施例第二方面提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如第一方面所介绍方法的步骤。

本发明实施例第三方面提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第一方面所介绍方法的步骤

通过本发明的一个或者多个技术方案,本发明具有以下有益效果或者优点:

由于本发明实施例提供的管理方法采用了两个内存池,并且在第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值时,控制第一内存池仅提供内存释放操作,并且控制第二内存池提供动态内存分配操作和内存释放操作,这样第一内存池即能够一直处于内存释放的状态而不会再进行动态内存分配,便于第一内存池的内存被全部释放,在第一内存池的内存全部释放之后,清空第一内存池,以及控制第二内存池提供动态内存分配操作和内存释放操作,并且控制第一内存池不提供动态内存分配操作和内存释放操作,这样即能够将第一内存池完全归还给操作系统,解决了现有技术中存在的因内存池的chunk地址并非连续而无法释放整块block,导致内存占有量较高的技术问题,降低了内存占有量,实现了将空闲内存自动回收的技术效果。

附图说明

图1本发明实施例提供的内存池的管理方法的流程图;

图2a-图2d为本发明实施例提供的内存池的迁移示意图。

具体实施方式

为了使本申请所属技术领域中的技术人员更清楚地理解本申请,下面结合附图,通过具体实施例对本申请技术方案作详细描述。

本发明了提供了一种内存池的管理方法,以解决现有技术中存在的因内存池的chunk地址并非连续而无法释放整块block导致服务器的内存占有量较高的技术问题。

请参考图1,图1为本发明实施例提供的内存池的管理方法的流程图,该管理方法包括:

s1:控制第一内存池提供动态内存分配操作和内存释放操作,并且控制第二内存池不提供动态内存分配操作和内存释放操作;

s2:在第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值时,控制第一内存池仅提供内存释放操作,并且控制第二内存池提供动态内存分配操作和内存释放操作;

s3:在第一内存池的内存全部释放之后,清空第一内存池,以及控制第二内存池提供动态内存分配操作和内存释放操作,并且控制第一内存池不提供动态内存分配操作和内存释放操作。

可以看出,由于本发明实施例提供的管理方法采用了两个内存池,并且在第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值时,控制第一内存池仅提供内存释放操作,并且控制第二内存池提供动态内存分配操作和内存释放操作,这样第一内存池即能够一直处于内存释放的状态而不会再进行动态内存分配,便于第一内存池的内存被全部释放,在第一内存池的内存全部释放之后,清空第一内存池,以及控制第二内存池提供动态内存分配操作和内存释放操作,并且控制第一内存池不提供动态内存分配操作和内存释放操作,这样即能够将第一内存池完全归还给操作系统,解决了现有技术中存在的因内存池的chunk地址并非连续而无法释放整块block,导致内存占有量较高的技术问题,降低了内存占有量,实现了将空闲内存自动回收的技术效果。

在具体介绍本发明实施例提供的内存池的管理方法之前,先介绍一下内存池的使用具有如下两个特点:(1)用户每次申请的内存都是固定大小;(2)用户不会一直持有内存,即向内存池申请的内存在一定时间之后一定会释放。这也是本发明实施例提供的内存池的管理方法的两个前提,针对第一点,操作系统已经提供了可以分配任意内存的内存管理器,内存池不是要替代操作系统,而是针对特定场景进行优化,所以它只解决固定大小内存的申请问题;针对第二点,如果用户持有内存不释放,这违背了内存池解决频繁申请释放内存的场景,这时根本无需使用内存池,直接向操作系统申请即可。

在介绍完本发明实施例提供的内存管理方法的前提之后,在接下来的部分中,将结合具体附图,来详细介绍本发明实施例中的技术方案。

在具体实施过程中,由于使用了第一内存池和第二内存池,所以为了避免进行动态内存分配操作或内存释放操作时出现混乱,需要对两个内存池使用互斥锁。

具体可以通过如下代码实现:

请继续参考图2a-图2d,图2a-图2d为本发明实施例提供的内存池的迁移示意图,需要说明的是,如图2a-图2d所示,第一内存池为storage【0】、第二内存池为storage【1】,第一阈值为migratingsize,第二阈值为migratingusedsize,动态内存分配操作为malloc,内存释放操作为free,current_used_size为已使用内存,max_used_size为已分配内存,另外,由第一内存池提供动态内存分配操作和内存释放操作,逐步变化为由第二内存池提供动态内存分配操作和内存释放操作,这一过程被称为迁移(migrate)。

在s1中,具体来讲,请参考图2a,此时第一内存池和第二内存池处于初始状态,控制第一内存池提供动态内存分配操作和内存释放操作,并且控制第二内存池不提供动态内存分配操作和内存释放操作。

在具体实施过程中,控制第一内存池提供动态内存分配操作和内存释放操作具体可以是接收动态内存分配消息,获取当前负责动态内存分配的内存池为第一内存池;基于动态内存分配消息,将第一内存池中的内存进行分配,并统计第一内存池的已分配内存和已使用内存;以及接收内存释放消息,获取当前负责内存释放的内存池为第一内存池;基于内存释放消息,调用第一内存池的内存释放函数释放内存。其中,动态内存分配消息可以由实际需要的服务或者应用程序发送,内存释放消息可以是由这些服务或者应用程序无需在使用内存之后发送,在此就不再赘述。

请继续参考图2b,随着第一内存池根据内存分配消息不断分配内存,这时,current_used_size超过了migratingsize,也即已分配内存和已使用内存均大于第一阈值,此时仍然是控制第一内存池提供动态内存分配操作和内存释放操作,并且控制第二内存池不提供动态内存分配操作和内存释放操作。

在s2中,请继续参考图2c,随着第一内存池的内存不断被归还,current_used_size会逐渐降低直到低于migratingusedsize,也即已使用内存小于第二阈值,同时由于max_used_size大于migratingsize,也即已分配内存大于第一值,这样,在第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值的时候,即能够控制第一内存池仅提供内存释放操作,并且控制第二内存池提供动态内存分配操作和内存释放操作,此时,也即第一内存池处于迁移状态。

在具体实施过程中,在接收到内存释放消息后,可以通过如下两种方式来释放该内存释放消息对应的内存:

第一种:接收内存释放消息,获取当前仅负责内存释放的内存池为第一内存池,具体可以通过get_free_only_pool这一方法来获取当前仅负责释放内存的内存池,当然,在本实施例中,当前仅负责释放内存的内存池为第一内存池,然后判断该内存释放消息对应的待释放内存是否属于第一内存池,若是,则调用第一内存池的内存释放函数来释放该待释放内存,若不是,则表明该内存释放消息对应的内存属于第二内存池,此时即可以调用第二内存池的内存释放函数来释放该待释放内存;

第二种:接收内存释放消息,判断该内存释放消息对应的待释放内存属于第一内存池还是第二内存池,若该待释放内存属于第一内存池,则调用第一内存池的内存释放函数,来释放该待释放内存,若该待释放内存属于第二内存池,则调用第二内存池释放的内存释放函数,来释放该待释放内存。

在实际应用中,可以通过如下的方式来释放内存:

当然了,根据内存分配消息将第二内存池中的内存进行分配的具体过程,与前述部分介绍的根据内存分配消息将第一内存池中的内存进行分配的过程一致,在此就不再赘述了。

在具体实施过程中,为了避免内存池申请大量内存又立马全部释放导致迁移操作过于频繁而影响内存池的性能,本发明实施例提供的内存池的管理方法第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值时,控制第一内存池提供内存释放操作,并且控制第二内存池提供动态内存分配操作和内存释放操作之前,还包括:

监测第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值的持续时间;若持续时间大于第三阈值,才执行步骤:控制第一内存池提供内存释放操作,并且控制第二内存池提供动态内存分配操作和内存释放操作。

在监测第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值的持续时间之后,本发明实施例提供的内存池的管理方法还包括:在任意时刻,若监测到已分配内存小于第一阈值或已使用内存大于第二阈值时,将持续时间清零。这样,保证在频繁申请释放大量内存的场景下,最大程度复用现有pool,只有当系统不再繁忙时才真正释放底层pool,因此也不会阻塞业务层操作。

请继续参考图2d,由于第一内存池的内存会被继续归还,并且不会再将第一内存池中的内存进行分配,所以第一内存池中的内存会在某一时刻被全部归还,这样,在第一内存池中的内存被全部归还后,即可以清空第一内存池,这样,storage【0】中的内存能够重新被操作系统重新进行分配,相当于实现了自动回收storage【0】中的内存的目的。

在具体实施过程中,为了增加内存池的易用性和对用户保持透明,内存池接口设计如下:

其中模板参数含义如下

tag:内存池对象唯一标识,通过不同的tag可以实例化不同对象

requestedsize:每次请求的内存大小

nextsize:初次申请block时包含的chunk数量,后续每次新申请数量会乘2

maxsize:申请新block时包含的最大chunk数量,为0则代表无上限

以上参数均和boost::singleton_pool相同,另外还有三个参数

migratingsize:用户申请的内存峰值超过该值触发内存池迁移条件1

migratingusedsize:用户当前使用内存小于该值触发内存迁移条件2

migratingdelaysec:同时满足条件1和条件2,并持续该时间(单位秒),才真正触发内存迁移

基于同一发明构思,本发明实施例第二方面还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面所介绍方法的步骤。

基于同一发明构思,本发明实施例第三方面还提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行程序时实现第一方面所介绍方法的步骤。

通过本发明的一个或者多个实施例,本发明具有以下有益效果或者优点:

由于本发明实施例提供的管理方法采用了两个内存池,并且在第一内存池的已分配内存大于第一阈值且已使用内存小于第二阈值时,控制第一内存池仅提供内存释放操作,并且控制第二内存池提供动态内存分配操作和内存释放操作,这样第一内存池即能够一直处于内存释放的状态而不会再进行动态内存分配,便于第一内存池的内存被全部释放,在第一内存池的内存全部释放之后,清空第一内存池,以及控制第二内存池提供动态内存分配操作和内存释放操作,并且控制第一内存池不提供动态内存分配操作和内存释放操作,这样即能够将第一内存池完全归还给操作系统,解决了现有技术中存在的因内存池的chunk地址并非连续而无法释放整块block,导致内存占有量较高的技术问题,降低了内存占有量,实现了将空闲内存自动回收的技术效果。

尽管已描述了本申请的优选实施例,但本领域内的普通技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1