CN106095693A - 一种面向非固定包长的无锁化多链内存管理方法 - Google Patents

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

Info

Publication number
CN106095693A
CN106095693A CN201610377594.7A CN201610377594A CN106095693A CN 106095693 A CN106095693 A CN 106095693A CN 201610377594 A CN201610377594 A CN 201610377594A CN 106095693 A CN106095693 A CN 106095693A
Authority
CN
China
Prior art keywords
chain
memory
section
internal memory
memory block
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
Application number
CN201610377594.7A
Other languages
English (en)
Inventor
王啸
贺龙涛
玄世昌
张慧
杨武
曹首峰
苘大鹏
周立
于贺威
王大伟
李城龙
王秀文
卫冰洁
李晓倩
贺欣
袁媛
刘培朋
朱佳伟
刘阳
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
National Computer Network and Information Security Management Center
Original Assignee
National Computer Network and Information Security Management Center
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by National Computer Network and Information Security Management Center filed Critical National Computer Network and Information Security Management Center
Priority to CN201610377594.7A priority Critical patent/CN106095693A/zh
Publication of CN106095693A publication Critical patent/CN106095693A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management

Abstract

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

Description

一种面向非固定包长的无锁化多链内存管理方法
技术领域
本发明属于内存管理领域,涉及一种面向非固定包长的无锁化多链内存管理方法。
背景技术
现在通用的内存管理模型,一般分为两类:一类是定长内存池;另一类是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个不同大小的内存块,每次申请100块,总共申请20轮次,然后记录所有轮次申请和释放内存消耗的系统时间,并进行对比。
(2)实验结果和分析
在本发明中,作者使用DS-MP算法来管理内存,使得程序在分配、释放内存时的时间消耗减小。主要从两个方面对比了DS-MP算法的高效性,一方面着重对比了使用定长内存池和DS-MP算法的内存池进行内存分配时的内存使用率情况,从数据上我们可以看到使用DS-MP算法的内存池内存使用率比使用定长内存池内存使用率高20%左右。另一方面着重对比了程序程序使用Malloc、PTMalloc、DS-MP算法申请相同大小的内存块时的时间消耗。其中当我们申请的内存块小于26字节时,PTMalloc的时间消耗最少。通过数据对比我们可以看到,当申请260字节、2600字节时,使用DS-MP算法的内存池管理内存消耗的时间远远小于其他两种方法消耗的时间。而且随着申请内存块的大小变大时,除了第一次消耗的时间增加的较大外,以后消耗的时间增加成本较为理想。

Claims (3)

1.一种面向非固定包长的无锁化多链内存管理方法,其特征在于:首先初始化动态可伸缩内存池,即程序初始化两个内存池管理数组,一个为快链的管理数组,另一个为满链和非满链的管理数组;然后初始化三个数组中指向可分配内存的指针为NULL;其次向申请内存的线程或进程提供相应的内存;最后回收线程或进程使用完的内存。
2.如权利要求1所述的一种面向非固定包长的无锁化多链内存管理方法,其特征在于:所述向申请内存的线程或进程提供相应的内存,具体采用下列步骤:
步骤21:当用户申请内存时,比较用户申请的内存是否大于4k,如果是则执行步骤29,否则执行步骤22;
步骤22:计算出用户申请的内存相应的级数,定位到第一层中管理数组相应位置,查看该位置处未满链是否为空,如果为空执行步骤25,否则执行步骤23;
步骤23:从该未满链中的第一个区段的空闲链中拿出空闲内存块分配给用户使用,并把该内存块的头部字段标志位由空闲改为等差,并且修改区段中空闲链表,把该区段中的占用计数TEAM结构体中的单元占用加1;
步骤24:查看步骤23中分配区段的空闲链是否为空,如果为空,则把该区段以尾插法链入到相应级别的满链中,否者结束;
步骤25:如果未满链为空,则需要扩充区段;首先申请加锁,然后查看快链的管理数组中相应级数的快链是否为空,如果不为空则执行步骤26;如果为空,则执行步骤27;
步骤26:从该快链中取出一个区段放入到第一层数组中,然后枚举单元,并把该区段进行挂接,然后解锁,累加该区段所在链表头部字段;
步骤27:计算实际分配长度,然后进行申请并判断是否成功,如果成功,则执行步骤28,否者返回-1;
步骤28:按照对应级数相应的区段大小申请一块内存,并把该内存划分为小的内存块,标注内存块头部字段为空闲,整理空闲链,最后把该区段链入到第一层的未满链中,然后分配给用户需要使用的内存;
步骤29:直接malloc从系统中申请,申请成功后,标记内存块头部字段为系统,并返回给用户使用,否则,返回-1。
3.如权利要求1或2所述的一种面向非固定包长的无锁化多链内存管理方法,其特征在于:所述回收线程或进程使用完的内存,具体采用下列步骤:
步骤31:当用户释放其使用的内存时,首先根据需要释放的内存找到内存块的首地址;
步骤32:根据内存块头部中类型标记是否为0x02,如果不是从内存池中申请得到的,则执行步骤33,否者执行步骤38;
步骤33:根据内存块头部结构体中的区号计算该区段的首地址,然后修改该区段的空闲链和占用计数;判断该区段的空闲链是否为空,若为空则执行步骤34,否者执行步骤35;
步骤34:如果该区段的空闲链为空,则把该区段从满链中摘除并把该区段从尾部链入到非满链中;
步骤35:如果该区段的空闲链非空,则归还内存块,并修改内存块类型字段及区段和总结构体中变量,然后是Held减1;最后判断区段占用计数是否为0,若为0,则执行步骤36,否则表示释放内存完成;
步骤36:如果占用计数为0,则说明该区段所有内存块全部未使用,这时需要把该区段从未满链中摘除掉,然后执行步骤37;
步骤37:从未满链摘除以后,与衰减因子进行比较,如果满足衰减因子,则把该区段是返还给操作系统,如果不满足衰减因子,则直接把该区段放入到快链管理数组相对应级别中的快链中;
步骤38:该内存块的内存标签为系统,直接把该内存块返还给操作系统。
CN201610377594.7A 2016-05-31 2016-05-31 一种面向非固定包长的无锁化多链内存管理方法 Pending CN106095693A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610377594.7A CN106095693A (zh) 2016-05-31 2016-05-31 一种面向非固定包长的无锁化多链内存管理方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610377594.7A CN106095693A (zh) 2016-05-31 2016-05-31 一种面向非固定包长的无锁化多链内存管理方法

Publications (1)

Publication Number Publication Date
CN106095693A true CN106095693A (zh) 2016-11-09

Family

ID=57230501

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610377594.7A Pending CN106095693A (zh) 2016-05-31 2016-05-31 一种面向非固定包长的无锁化多链内存管理方法

Country Status (1)

Country Link
CN (1) CN106095693A (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111352863A (zh) * 2020-03-10 2020-06-30 腾讯科技(深圳)有限公司 内存管理方法、装置、设备及存储介质
CN112231101A (zh) * 2020-10-16 2021-01-15 北京中科网威信息技术有限公司 内存分配方法、装置及可读存储介质
CN112965822A (zh) * 2021-03-18 2021-06-15 上海交通大学 利用数组池优化javaScript/typeScript程序内存性能的方法
CN113504994A (zh) * 2021-07-26 2021-10-15 上海遁一信息科技有限公司 一种内存池性能弹性伸缩的实现方法及系统

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111352863A (zh) * 2020-03-10 2020-06-30 腾讯科技(深圳)有限公司 内存管理方法、装置、设备及存储介质
CN111352863B (zh) * 2020-03-10 2023-09-01 腾讯科技(深圳)有限公司 内存管理方法、装置、设备及存储介质
CN112231101A (zh) * 2020-10-16 2021-01-15 北京中科网威信息技术有限公司 内存分配方法、装置及可读存储介质
CN112231101B (zh) * 2020-10-16 2024-03-01 北京中科网威信息技术有限公司 内存分配方法、装置及可读存储介质
CN112965822A (zh) * 2021-03-18 2021-06-15 上海交通大学 利用数组池优化javaScript/typeScript程序内存性能的方法
CN113504994A (zh) * 2021-07-26 2021-10-15 上海遁一信息科技有限公司 一种内存池性能弹性伸缩的实现方法及系统
CN113504994B (zh) * 2021-07-26 2022-05-10 上海遁一信息科技有限公司 一种内存池性能弹性伸缩的实现方法及系统

Similar Documents

Publication Publication Date Title
CN106095693A (zh) 一种面向非固定包长的无锁化多链内存管理方法
US20130125133A1 (en) System and Method for Load Balancing of Fully Strict Thread-Level Parallel Programs
DE102013208423B4 (de) Virtuelle Speicherstruktur für Coprozessoren, die Speicherallokationsbegrenzungen haben
CN103885751A (zh) 将区别属性的存储器分配给共享数据对象的系统和方法
US20130055279A1 (en) Resource allocation tree
CN101432702A (zh) 在事务处理码内对存储器分配和解除分配的系统和方法
RU2639944C2 (ru) Системы и способы для разделения однонаправленных списков для выделения элементов памяти
CN1996258A (zh) 一种动态内存池的实现方法
US10929035B2 (en) Memory management via dynamic tiering pools
FR2899353A1 (fr) Systeme de gestion memoire pour la reduction de la fragmentation memoire
CN107533435A (zh) 存储空间的分配方法及存储设备
CN101968772A (zh) 嵌入式系统高效内存池的实现方法
US20140351550A1 (en) Memory management apparatus and method for threads of data distribution service middleware
CN103984639B (zh) 一种动态内存分配方法
US20170068465A1 (en) Hybrid Heap Memory Management
CN103703449B (zh) 存储器合并的计算机实现方法、系统以及装置
Winter et al. Ouroboros: virtualized queues for dynamic memory management on GPUs
US8560805B1 (en) Efficient allocation of address space resources to bus devices
US20130117522A1 (en) Inter-Process Memory Management
Gidron et al. SALSA: scalable and low synchronization NUMA-aware algorithm for producer-consumer pools
JP6283376B2 (ja) クラスタにおけるワークシェアリング多重化をサポートするためのシステムおよび方法
CN106502729B (zh) 一种Flash播放器的资源加载方法及系统
CN104050189B (zh) 页面共享处理方法及装置
CN105740170A (zh) 一种缓存脏页刷写方法及装置
CN106201727A (zh) 一种操作系统的内存管理方法及装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20161109