集群细粒度内存管理方法

文档序号:6543305阅读:174来源:国知局
集群细粒度内存管理方法
【专利摘要】本发明提供一种集群细粒度内存管理方法,包括下述步骤:步骤一.将内存分成两大类区域:第一类是全局共享区,负责尺寸大于等于尺寸阈值的大对象的分配和回收,第二类是每个线程独自的线程本地缓存,用于尺寸小于尺寸阈值的小对象的分配;线程本地缓存由多个块组组成,每个块组是一个内存对象的空闲链表,且一个块组内的块尺寸全部相等;不同块组之间,块组内的块尺寸关系采用阶梯式的等差关系;全局共享区包括小对象分配区和全局页缓存;步骤二.针对应用程序申请的内存进行内存分配,区分大小对象后分别进行对应的分配方式;步骤三.内存的释放;本方法兼顾大对象与小对象的分配与释放,特别适合多线程下的应用,内存利用率高。
【专利说明】集群细粒度内存管理方法
【技术领域】
[0001]本发明涉及计算机领域中分布式集群内的一种细粒度的内存管理方法,该方法主要针对分布式集群中申请的内存大小差异比较大的多线程的应用场景。
【背景技术】
[0002]随着互联网特别是移动互联网的快速普及,信息化程度不断提高,各式各样的交互式、个性化应用造成了互联网中数据的爆炸式增长。在此形势之下,有关海量数据存储的研究随之发展迅猛。应用系统的业务访问量与日俱增,大量频繁快速的数据访问请求对应用服务器和数据管理系统的要求越来越高。如何利用有限资源合理提高数据访问效率,成为提升系统性能的关键。在众多数据管理系统和缓存管理系统中,内存资源的高效利用和管理无疑是备受关注的焦点。内存的合理利用能够大幅减少对磁盘的IO请求,从而快速提升系统性能。当前市场上有多种比较流行的基于内存的数据管理或缓存管理系统,如国外开源的Redis、Memcached等,以及国内的Tair等非持久化存储层。这些系统均在内存的利用和优化方面大下功夫,但是仍然存在不少不足之处,比如利用率仍然不高、删除策略非最优、管理自治度不高、无法适用多种应用场景等。
[0003]内存管理方面,频繁使用默认的malloc和free函数,不但分配效率低下而且会产生大量的内存碎片。所以当下主流的数据管理系统和缓存管理系统都没有采用原生方式,而是提供了预分配内存的方案。该方案的基本原理借鉴于内存池,首先按照预先规定的大小,将预先分配的内存分割成指定长度的块组,每个组中包括若干相同长度的块,不同块组的块大小按照一个预先设定的增长因子构成等比关系。初始时,所有块组中的块均为空闲内存。在进行内存分配时,该方案会根据需求的内存大小,从空闲的块组中选择大小最接近的且大于所需内存的块来使用。如果该方案用于内存分配,则在用户释放内存的时候会将相应的块重新添加到空闲块组中;如果该方案用于缓存管理,则根据LRU (Least RecentlyUsed,最近最少使用)算法进行缓存的过期淘汰和重复利用。一些系统在应用该方案时将增长因子设置成为2,即后一个块组的块大小为前一个块组的块大小的2倍。但这样块大小增长会很快,后面的块的差距会很大,容易造成空间浪费。此外,该方案在多线程的情况下必须采用加锁机制,影响内存的分配和回收效率。
[0004]综上,当前的内存管理方案主要存在以下问题
(I)内存的分配和回收速度。
[0005](2)多线程下的性能表现。
[0006](3)同时适用小对象与大对象的问题。

【发明内容】

[0007]本发明的目的在于克服现有技术中存在的不足,提供一种集群细粒度内存管理方法,提升内存的分配和回收效率,减少内存碎片的产生,提高内存利用率。本发明采用的技术方案是: 一种集群细粒度内存管理方法,包括下述步骤:
步骤一.将内存分成两大类区域:第一类是全局共享区,负责尺寸大于等于尺寸阈值的大对象的分配和回收;第二类是每个线程独自的线程本地缓存,用于尺寸小于尺寸阈值的小对象的分配;
线程本地缓存由多个块组组成,每个块组是一个内存对象的空闲链表,且一个块组内的块尺寸全部相等;不同块组之间,块组内的块尺寸关系采用阶梯式的等差关系;
全局共享区包括小对象分配区和全局页缓存;小对象分配区的结构与线程本地缓存相同,且有锁保护;全局页缓存用于处理大对象,且有锁保护;
全局页缓存由多个空闲链表组成,全局页缓存的空闲链表称作页面组;每个空闲链表包含多个元素,全局页缓存的空闲链表的元素是相同尺寸的连续的内存页;第I个页面组的元素的尺寸是I个内存页,第2个页面组的元素的尺寸是2个内存页,以此类推,第255个页面组的元素的尺寸是255个内存页,但第256个页面组的元素的尺寸是大于等于256个内存页。
[0008]进一步地,线程本地缓存中不同块组之间,块组内的块尺寸阶梯式的等差关系具体为:对较小的尺寸相差8个字节,略大一点的尺寸相差16个字节,然后相差32个字节,直至最大的尺寸相差间隔为256个字节。
[0009]进一步地,区分大对象和小对象的尺寸阈值为32KB。
[0010]步骤二.针对应用程序申请的内存进行内存分配,包括:
首先判断所申请的内存大小是否大于等于尺寸阈值;
若大于等于尺寸阈值,则进行步骤a ;否则,进行步骤b ;
a.大对象的分配:
a-Ι.将所需分配的尺寸,按4K的粒度向上圆整,设圆整后的大对象尺寸size=m*4K ;m为正整数;
a-2.对全局共享区的全局页缓存加锁;
a-3.记p=max{2*m, 256},判断页面组m的空闲链表是否为空;
若不空,则直接删除该链表的第一个元素并将其返回;
若为空,判断页面组P的空闲链表是否为空;
若不空,则删除该链表的第一个元素得到连续的P个内存页,将该连续的P个内存页拆分成连续的m个页面和(p-m)个页面,分别插入到页面组m和页面组(ρ-m)中,重复步骤a_3 ;
若为空,则直接向操作系统申请连续的m个内存页,将该连续的m个内存页添加到页面组m后,重复步骤a-3 ;
a-4.释放全局共享区的全局页缓存的锁;
b.小对象的分配,对应线程本地缓存;
b-1.将所需分配的尺寸向上圆整到最接近的块组内块的尺寸,设尺寸为size',且相对应的块组为块组k ;
b-2.判断块组k的空闲链表是否为空;
若不空,则删除该空闲链表的第一个元素并将其返回;
若为空,则需要对全局共享区进行操作;对全局共享区的小对象分配区申请加锁;
判断全局共享区中小对象分配区的块组k是否为空;
若不空,则从该块组中转移若干元素到线程本地缓存的块组k中,释放全局共享区的小对象分配区的锁,重复步骤b-2 ;
若为空,则向全局页缓存申请new+sizezmaxisize' *2,尺寸阈值}大小的大对象;申请成功后将该大对象拆分成若干个大小为Siz^的小对象,添加到全局共享区的小对象分配区的块组k中,释放全局共享区的小对象分配区的锁,重复步骤b-2。
[0011]步骤三.内存的释放;
首先判断释放的内存是否大于等于尺寸阈值;
若大于等于尺寸阈值,则进行步骤a';否则,进行步骤b';.大对象的释放; a' -1.申请对全局共享区中的全局页缓存加锁;
a' -2.判断全局页缓存的总空间是否超过设定空间阈值,若超过,直接将大对象释放给操作系统;否则,将待释放的内存添加回相对应的全局页缓存的页面组;a' -3.对全局页缓存解锁;h'.小对象的释放;
b' -1.判断线程本地缓存的空间占用是否超过设定的空间阈值;b/ -2.若未超过 ,则直接将小对象添加回相对应的块组中,结束释放流程;否则,继续下一步;
b/ -3.超过阈值时,需要将小对象释放到全局共享区,具体如下所述:
申请对全局共享区的小对象分配区加锁;
将小对象添加到全局共享区中小对象分配区的对应块组中;
判断小对象分配区的总大小是否超过设定的阈值,若未超过,则直接释放锁,并结束释放流程;
超过阈值时,扫描小对象分配区的所有小对象并排序;
将所有能合并成一个大对象的小对象,从小对象分配区中删除,并合并成一个大对
象;
将该大对象释放到全局页缓存当中;
释放小对象分配区的锁,结束释放流程。
[0012]本发明的优点在于:本方法兼顾大对象与小对象的分配与释放,特别适合多线程下的应用,内存利用率高。
【专利附图】

【附图说明】
[0013]图1为本发明的全局共享区和线程本地缓存示意图。
[0014]图2为本发明的线程本地缓存结构示意图。
[0015]图3为本发明的全局共享区的全局页缓存结构示意图。
[0016]图4为本发明的流程图。
【具体实施方式】[0017]下面结合具体附图和实施例对本发明作进一步说明。
[0018]本发明主要将内存分成两大类区域:第一类是全局共享区,主要负责大对象(尺寸大于等于32KB)的分配和回收;第二类是每个线程独自的线程本地缓存,对于小对象(尺寸小于32KB)的分配可以直接由线程本地缓存来满足。需要的话会将内存从全局共享区迁移到线程本地缓存中,同时定期的垃圾收集用于将内存从线程本地缓存迁移回全局共享区。两者关系如图1所不。
[0019]下面重点介绍一下:线程本地缓存的结构、全局共享区的结构以及对象的分配和释放流程。
[0020]1.线程本地缓存的结构,如图2所示。
[0021]尽管应用程序可以申请任意尺寸的小对象,但为便于管理,本发明采用预分配方式且只提供固定尺寸的空间。所提供的尺寸包括:32B,40B,48B, 56B, 64B, 80B, 96B, 112B,128B,160B等。尺寸大小的关系采用阶梯式的等差关系,较小的尺寸间相差8个字节,略大一点的尺寸相差16个字节,然后相差32个字节,但最大的尺寸相差间隔限定为256个字节。这种方式可以有效避免固定增长因子带来的空间浪费问题。线程本地缓存由多个块组组成,每个块组是一个内存对象的空闲链表,且一个块组内的块尺寸全部相等。
[0022]2.全局共享区有两部分构成:一部分是类似线程本地缓存的小对象分配区,结构与线程本地缓存相同,但是有锁保护;另一部分是处理大对象分配的全局页缓存,同样有锁保护。
[0023]跟线程本地缓存一样,全局页缓存同样由一堆空闲链表组成,不过它的空闲链表的元素是相同尺寸的连续的内存页,且该空闲链表称作页面组。页面组I的元素的尺寸是I个内存页,页面组2的元素的尺寸是2个内存页,以此类推,页面组255的元素的尺寸是255个内存页,但页面组256的元素的尺寸则是大于等于256个内存页。具体结构如图3。
[0024]3.内存的分配。
[0025]应用程序的内存分配流程如下:
1)首先判断所申请的内存大小是否大于等于32K;
2)若大于等于32K,则认定分配的是大对象,进行步骤a;否则,认为是小对象的分配,进行步骤b;
a.大对象的分配:
a-Ι.将所需分配的尺寸,按4K的粒度向上圆整,设圆整后的大对象尺寸size=m*4K ;m为正整数;
a-2.对全局共享区的全局页缓存加锁;
a-3.记p=max{2*m, 256},判断页面组m的空闲链表是否为空;
若不空,则直接删除该链表的第一个元素并将其返回;
若为空,判断页面组P的空闲链表是否为空;
若不空,则删除该链表的第一个元素得到连续的P个内存页,将该连续的P个内存页拆分成连续的m个页面和(p-m)个页面,分别插入到页面组m和页面组(p-m)中,重复步骤a_3 ;
若为空,则直接向操作系统申请连续的m个内存页,将该连续的m个内存页添加到页面组m后,重复步骤a-3 ;a-4.释放全局共享区的全局页缓存的锁;
b.小对象的分配,对应线程本地缓存;
b-1.将所需分配的尺寸向上圆整到最接近的块组内块的尺寸,设尺寸为size',且相对应的块组为块组k ;
b-2.判断块组k的空闲链表是否为空;
若不空,则删除该空闲链表的第一个元素并将其返回;
若为空,则需要对全局共享区进行操作;
对全局共享区的小对象分配区申请加锁;
判断全局共享区中小对象分配区的块组k是否为空;
若不空,则从该块组中转移若干元素到线程本地缓存的块组k中,释放全局共享区的小对象分配区的锁,重复步骤b-2 ;
若为空,则向全局页缓存申请new+sizezmaxisize' *2,尺寸阈值32K}大小的大对象;申请成功后将该大对象拆分成若干个大小为Siz^的小对象,添加到全局共享区的小对象分配区的块组k中,释放全局共享区的小对象分配区的锁,重复步骤b-2。
[0026]4.内存的释放。
[0027]内存释放的流程如下:
1)首先判断释放的内存是否大于等于32K;
2)若大于等于32K,则认为是大对象的释放,进行步骤a';否则,认为是小对象的释放,走步骤b';.大对象的释放; a' -1.申请对全局共享区中的全局页缓存加锁;
a' -2.判断全局页缓存的总空间是否超过设定空间阈值,若超过,直接将大对象释放给操作系统;否则,将待释放的内存添加回相对应的全局页缓存的页面组;a' -3.对全局页缓存解锁;h'.小对象的释放;
b' -1.判断线程本地缓存的空间占用是否超过设定的空间阈值;b/ -2.若未超过,则直接将小对象添加回相对应的块组中,结束释放流程;否则,继续下一步;
b/ -3.超过阈值时,需要将小对象释放到全局共享区,具体如下所述:
申请对全局共享区的小对象分配区加锁;
将小对象添加到全局共享区中小对象分配区的对应块组中;
判断小对象分配区的总大小是否超过设定的阈值,若未超过,则直接释放锁,并结束释放流程;
超过阈值时,扫描小对象分配区的所有小对象并排序;
将所有能合并成一个大对象(大于等于32K)的小对象,从小对象分配区中删除,并合并成一个大对象;
将该大对象释放到全局页缓存当中;
释放小对象分配区的锁,结束释放流程。
【权利要求】
1.一种集群细粒度内存管理方法,其特征在于,包括下述步骤: 步骤一.将内存分成两大类区域:第一类是全局共享区,负责尺寸大于等于尺寸阈值的大对象的分配和回收;第二类是每个线程独自的线程本地缓存,用于尺寸小于尺寸阈值的小对象的分配; 线程本地缓存由多个块组组成,每个块组是一个内存对象的空闲链表,且一个块组内的块尺寸全部相等;不同块组之间,块组内的块尺寸关系采用阶梯式的等差关系; 全局共享区包括小对象分配区和全局页缓存;小对象分配区的结构与线程本地缓存相同,且有锁保护;全局页缓存用于处理大对象,且有锁保护; 全局页缓存由多个空闲链表组成,全局页缓存的空闲链表称作页面组;每个空闲链表包含多个元素,全局页缓存的空闲链表的元素是相同尺寸的连续的内存页;第I个页面组的元素的尺寸是I个内存页,第2个页面组的元素的尺寸是2个内存页,以此类推,第255个页面组的元素的尺寸是255个内存页,但第256个页面组的元素的尺寸是大于等于256个内存页。
2.如权利要求1所述的集群细粒度内存管理方法,其特征在于: 线程本地缓存中不同块组之间,块组内的块尺寸阶梯式的等差关系具体为:对较小的尺寸相差8个字节,略大一点的尺寸相差16个字节,然后相差32个字节,直至最大的尺寸相差间隔为256个字节。
3.如权利要 求1所述的集群细粒度内存管理方法,其特征在于:区分大对象和小对象的尺寸阈值为32KB。
4.如权利要求1、2或3所述的集群细粒度内存管理方法,其特征在于:步骤一之后,还包括下述步骤: 步骤二.针对应用程序申请的内存进行内存分配,包括: 首先判断所申请的内存大小是否大于等于尺寸阈值; 若大于等于尺寸阈值,则进行步骤a ;否则,进行步骤b ; a.大对象的分配: a-Ι.将所需分配的尺寸,按4K的粒度向上圆整,设圆整后的大对象尺寸size=m*4K ;m为正整数; a-2.对全局共享区的全局页缓存加锁; a-3.记p=max{2*m, 256},判断页面组m的空闲链表是否为空; 若不空,则直接删除该链表的第一个元素并将其返回; 若为空,判断页面组P的空闲链表是否为空; 若不空,则删除该链表的第一个元素得到连续的P个内存页,将该连续的P个内存页拆分成连续的m个页面和(p-m)个页面,分别插入到页面组m和页面组(ρ-m)中,重复步骤a_3 ; 若为空,则直接向操作系统申请连续的m个内存页,将该连续的m个内存页添加到页面组m后,重复步骤a-3 ; a-4.释放全局共享区的全局页缓存的锁; b.小对象的分配,对应线程本地缓存; b-1.将所需分配的尺寸向上圆整到最接近的块组内块的尺寸,设尺寸为size',且相对应的块组为块组k ; b-2. 判断块组k的空闲链表是否为空; 若不空,则删除该空闲链表的第一个元素并将其返回; 若为空,则需要对全局共享区进行操作; 对全局共享区的小对象分配区申请加锁; 判断全局共享区中小对象分配区的块组k是否为空; 若不空,则从该块组中转移若干元素到线程本地缓存的块组k中,释放全局共享区的小对象分配区的锁,重复步骤b-2 ; 若为空,则向全局页缓存申请new+sizezmaxisize' *2,尺寸阈值}大小的大对象;申请成功后将该大对象拆分成若干个大小为Siz^的小对象,添加到全局共享区的小对象分配区的块组k中,释放全局共享区的小对象分配区的锁,重复步骤b-2。
5.如权利要求4所述的集群细粒度内存管理方法,其特征在于:步骤二之后,还包括下述步骤: 步骤三.内存的释放; 首先判断释放的内存是否大于等于尺寸阈值; 若大于等于尺寸阈值,则进行步骤a';否则,进行步骤b';.大对象的释放; a' -1.申请对全局共享区中的全局页缓存加锁; a' -2.判断全局页缓存的总空间是否超过设定空间阈值,若超过,直接将大对象释放给操作系统;否则,将待释放的内存添加回相对应的全局页缓存的页面组;a' -3.对全局页缓存解锁;h'.小对象的释放; b' -1.判断线程本地缓存的空间占用是否超过设定的空间阈值;b/ -2.若未超过,则直接将小对象添加回相对应的块组中,结束释放流程;否则,继续下一步; b/ -3.超过阈值时,需要将小对象释放到全局共享区,具体如下所述: 申请对全局共享区的小对象分配区加锁; 将小对象添加到全局共享区中小对象分配区的对应块组中; 判断小对象分配区的总大小是否超过设定的阈值,若未超过,则直接释放锁,并结束释放流程; 超过阈值时,扫描小对象分配区的所有小对象并排序; 将所有能合并成一个大对象的小对象,从小对象分配区中删除,并合并成一个大对象; 将该大对象释放到全局页缓存当中; 释放小对象分配区的锁,结束释放流程。
【文档编号】G06F9/50GK103914265SQ201410141276
【公开日】2014年7月9日 申请日期:2014年4月9日 优先权日:2014年4月9日
【发明者】安丰春, 台宪青, 王艳军, 赵旦谱, 图博 申请人:江苏物联网研究发展中心
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1