一种面向非固定包长的无锁化多链内存管理方法技术

技术编号:13965878 阅读:104 留言:0更新日期:2016-11-09 12:00
本发明专利技术针对定长内存池中内存使用率偏低、不能动态调整内存池大小及其他内存管理方案不能很好的预防突发流量造成的内存抖动的问题,提出了一种面向非固定包长的无锁化多链内存管理方法。首先初始化动态可伸缩内存池,即程序初始化两个内存池管理数组,一个为快链的管理数组,另一个为满链和非满链的管理数组;然后初始化三个数组中指向可分配内存的指针为NULL;其次向申请内存的线程或进程提供相应的内存;最后回收线程或进程使用完的内存。

【技术实现步骤摘要】

本专利技术属于内存管理领域,涉及一种面向非固定包长的无锁化多链内存管理方法
技术介绍
现在通用的内存管理模型,一般分为两类:一类是定长内存池;另一类是Linux常用的内存管理模型DLMalloc、PTMalloc等。现实项目中,开发人员为了节省程序大量Malloc/free的时间消耗,通常采用定长内存池,即在程序初始化时,直接向操作系统申请一大块内存,并把该内存按照程序要求的固定长度划分为更小的内存块,然后把这些内存块用链表进行管理。这样程序进行申请和释放内存操作时,实际上是从该内存池的空闲链中申请和释放内存块,其时间复杂度可以达到O(1)。虽然在时间效率上有很好的表现,但是定长内存池有两个明显的缺陷。一个是因为初始化时已经定义好了固定长度的内存块,所以不论用户申请多大的内存块,该内存池总是分配给它一个固定块大小的内存,有时这样的内存分配会使得内存池中内存的平均使用率偏低;另一个是,一般程序在初始化时会申请多个空闲内存链,每个内存链中挂在了相同大小的内存块,不同内存链中内存块大小不同,所有内存链集中用数组进行管理。由于开发人员不能预估到哪个大小的内存块常用,哪个不常用。所以为了系统的健壮性,通常会让每条空闲内存链中的空闲块数量相同。这样也会造成内存的浪费。另一方面对于Linux系统常用的内存管理模型DLMalloc、PTMalloc、TCMalloc来说,由于它们是操作系统的一种内存管理方案,开发者在进行开发时,为了考虑到系统的健壮性,其相对的管理方案会设计的比较复杂,不能直接用到一些应用层设备上。并且此类模型中,当遇到突发流量内存管理模型无法满足用户需求时,通常会向操作系统申请内存然后再分配给用户,而当用户使用完成后,在交还给操作系统。下次再有突发流量时,仍然按照上述步骤操作,这样做容易照成内存抖动恶化。
技术实现思路
本专利技术针对定长内存池中内存使用率偏低、不能动态调整内存池大小及其他内存管理方案不能很好的预防突发流量造成的内存抖动的问题,提出了一种面向非固定包长的无锁化多链内存管理方法。本专利技术通过以下技术方案解决上述技术问题。一种面向非固定包长的无锁化多链内存管理方法,首先初始化动态可伸缩内存池,即程序初始化两个内存池管理数组,一个为快链的管理数组,另一个为满链和非满链的管理数组;然后初始化三个数组中指向可分配内存的指针为NULL;其次向申请内存的线程或进程提供相应的内存;最后回收线程或进程使用完的内存。所述向申请内存的线程或进程提供相应的内存,具体采用下列步骤:步骤21:当用户申请内存时,比较用户申请的内存是否大于4k,如果是则执行步骤29,否则执行步骤22;步骤22:计算出用户申请的内存相应的级数,定位到第一层中管理数组相应位置,查看该位置处未满链是否为空,如果为空执行步骤25,否则执行步骤23;步骤23:从该未满链中的第一个区段的空闲链中拿出空闲内存块分配给用户使用,并把该内存块的头部字段标志位由空闲改为等差,并且修改区段中空闲链表,把该区段中的占用计数TEAM结构体中的单元占用加1;步骤24:查看步骤23中分配区段的空闲链是否为空,如果为空,则把该区段以尾插法链入到相应级别的满链中,否者结束;步骤25:如果未满链为空,则需要扩充区段;首先申请加锁,然后查看快链的管理数组中相应级数的快链是否为空,如果不为空则执行步骤26;如果为空,则执行步骤27;步骤26:从该快链中取出一个区段放入到第一层数组中,然后枚举单元,并把该区段进行挂接,然后解锁,累加该区段所在链表头部字段;步骤27:计算实际分配长度,然后进行申请并判断是否成功,如果成功,则执行步骤28,否者返回-1;步骤28:按照对应级数相应的区段大小申请一块内存,并把该内存划分为小的内存块,标注内存块头部字段为空闲,整理空闲链,最后把该区段链入到第一层的未满链中,然后分配给用户需要使用的内存;步骤29:直接malloc从系统中申请,申请成功后,标记内存块头部字段为系统,并返回给用户使用,否则,返回-1。所述回收线程或进程使用完的内存,具体采用下列步骤:步骤31:当用户释放其使用的内存时,首先根据需要释放的内存找到内存块的首地址;步骤32:根据内存块头部中类型标记是否为0x02,如果不是从内存池中申请得到的,则执行步骤33,否者执行步骤38;步骤33:根据内存块头部结构体中的区号计算该区段的首地址,然后修改该区段的空闲链和占用计数;判断该区段的空闲链是否为空,若为空则执行步骤34,否者执行步骤35;步骤34:如果该区段的空闲链为空,则把该区段从满链中摘除并把该区段从尾部链入到非满链中;步骤35:如果该区段的空闲链非空,则归还内存块,并修改内存块类型字段及区段和总结构体中变量,然后是Held减1;最后判断区段占用计数是否为0,若为0,则执行步骤36,否则表示释放内存完成;步骤36:如果占用计数为0,则说明该区段所有内存块全部未使用,这时需要把该区段从未满链中摘除掉,然后执行步骤37;步骤37:从未满链摘除以后,与衰减因子进行比较,如果满足衰减因子,则把该区段是返还给操作系统,如果不满足衰减因子,则直接把该区段放入到快链管理数组相对应级别中的快链中;步骤38:该内存块的内存标签为系统,直接把该内存块返还给操作系统。本专利技术的有益效果:1、本专利技术可以根据程序申请内存情况动态调整内存池相应内存块的数量;其次,内存池分为第一层、第二层,可以大大减少加、解锁造成的系统资源浪费;最后,第二层中的快链作为操作系统和第一层之间的缓冲区,可以有效解决突发流量造成的内存抖动情况。2、本专利技术中一方面提高了内存使用率,并可以动态调整内存池中不同级别内存块对应的区块的数量。另一方面随着申请内存块的大小变大时,使用DS-MP算法内存池管理内存,除了第一次消耗的时间增加的较大外,以后消耗的时间增加成本较为理想。附图说明图1为本专利技术面向非固定包长的无锁化多链内存管理方法流程图;图2为本专利技术DS-MP算法中分配算法流程图;图3为本专利技术DS-MP算法中回收算法流程图。具体实施方式下面结合具体实施例对本专利技术作更详细的描述:(1)实验环境本实验是在linux 64位操作系统,2.6.32内核版本,24核CPU数,频率为1200MHz,16G内存,gcc版本为4.4.5的服务器上进行。本专利技术进行了两个模拟实验,第一个实验主要对比DS-MP算法的内存池和定长内存池的内存使用率;第二个实验主要对比Malloc/free、PTMalloc、DS-MP算法内存池中分配和回收内存的时间效率。第一个模拟实验,首先初始化128字节、512字节、1024字节三个固定长度的内存池,然后使用程序随机申请不大于1024字节的内存1000次,统计每次申请内存后内存使用率,最后计算使用三个固定长度的内存池和DS-MP算法的内存池之间的内存平均使用率。在DS-MP算法中,由于第一层中数组索引为等差数列,且等差值为32字节。所以,当程序随机申请内存时,内存最大浪费值为31字节。而在固定内存池中,对于系统随机申请的内存,内存池一般把最靠近该内存大小并且大于等于该内存的内存块分配给系统。比如申请129字节,则浪费383字节。第二个模拟实验,首先使用malloc、tcmalloc、DS-MP算法三种算法去申请3本文档来自技高网
...

【技术保护点】
一种面向非固定包长的无锁化多链内存管理方法,其特征在于:首先初始化动态可伸缩内存池,即程序初始化两个内存池管理数组,一个为快链的管理数组,另一个为满链和非满链的管理数组;然后初始化三个数组中指向可分配内存的指针为NULL;其次向申请内存的线程或进程提供相应的内存;最后回收线程或进程使用完的内存。

【技术特征摘要】
1.一种面向非固定包长的无锁化多链内存管理方法,其特征在于:首先初始化动态可伸缩内存池,即程序初始化两个内存池管理数组,一个为快链的管理数组,另一个为满链和非满链的管理数组;然后初始化三个数组中指向可分配内存的指针为NULL;其次向申请内存的线程或进程提供相应的内存;最后回收线程或进程使用完的内存。2.如权利要求1所述的一种面向非固定包长的无锁化多链内存管理方法,其特征在于:所述向申请内存的线程或进程提供相应的内存,具体采用下列步骤:步骤21:当用户申请内存时,比较用户申请的内存是否大于4k,如果是则执行步骤29,否则执行步骤22;步骤22:计算出用户申请的内存相应的级数,定位到第一层中管理数组相应位置,查看该位置处未满链是否为空,如果为空执行步骤25,否则执行步骤23;步骤23:从该未满链中的第一个区段的空闲链中拿出空闲内存块分配给用户使用,并把该内存块的头部字段标志位由空闲改为等差,并且修改区段中空闲链表,把该区段中的占用计数TEAM结构体中的单元占用加1;步骤24:查看步骤23中分配区段的空闲链是否为空,如果为空,则把该区段以尾插法链入到相应级别的满链中,否者结束;步骤25:如果未满链为空,则需要扩充区段;首先申请加锁,然后查看快链的管理数组中相应级数的快链是否为空,如果不为空则执行步骤26;如果为空,则执行步骤27;步骤26:从该快链中取出一个区段放入到第一层数组中,然后枚举单元,并把该区段进行挂接,然后解锁,累加该区段所在链表头部字段;步骤27:计算实际分配长度,然后进行申请并判断是否成功,如果成功,则执行步骤28,否者返回-1;步骤28:按照对应级...

【专利技术属性】
技术研发人员:王啸贺龙涛玄世昌张慧杨武曹首峰苘大鹏周立于贺威王大伟李城龙王秀文卫冰洁李晓倩贺欣袁媛刘培朋朱佳伟刘阳
申请(专利权)人:国家计算机网络与信息安全管理中心
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1