一种基于后备列表的内存管理方法技术

技术编号:24120539 阅读:20 留言:0更新日期:2020-05-13 02:57
一种基于后备列表的内存管理方法,包括至少一个全局共享的后备列表用于存放空闲的内存块,以及多个由可分配的内存块构成的链表。可分配的内存块有多种类型,每种类型对应一种分配粒度,每个可分配的内存块按类型对应的分配粒度分割成多个大小相同的片段,每个链表只包含同一类型的可分配的内存块。该方法具有可实现无锁分配和释放内存,且能在多个系统模块间共用的特点。

【技术实现步骤摘要】
一种基于后备列表的内存管理方法
本专利技术涉及计算机系统软件编程领域,特别是一种基于后备列表的内存管理方法。
技术介绍
在计算机系统软件中经常需要分配小块内存用于各种数据结构,对于一些频繁分配和释放内存的应用场景,经常需要分配大量相同大小的内存。后备列表(LookasideList)是一种常用的分配大量相同大小内存的方法,其核心思想是将大量相同大小的内存构成FILO序列的单向链表,分配内存时直接从链表取出一块,释放内存时将其放回链表,整个过程非常简单快速。当后备列表使用CAS原子操作时可以实现在多个处理器或线程之间无锁的分配和释放内存,例如Windows内核就是使用CAS原子操作的后备列表来为驱动程序和系统模块提供轻量级的小块内存分配方案。Linux中的SLAB分配器也使用了类似的方法,不过在Windows中后备列表更侧重于专属用途,一般不会在多个模块间共享。而Linux的SLAB虽然可以在多个模块间共用但实现过于复杂,而且也用到了锁机制。
技术实现思路
本专利技术的目的是提供一种基于后备列表的内存管理方法。该方法具有可实现无锁分配和释放内存,且能在多个系统模块间共用的特点。一种基于后备列表的内存管理方法,该方法包括至少一个全局共享的后备列表用于存放空闲的内存块,以及多个由可分配的内存块构成的链表。内存块通常远远大于分配内存的大小范围,例如64KB大小的内存块。可分配的内存块有多种类型,每种类型对应一种分配粒度,每个可分配的内存块按类型对应的分配粒度分割成多个大小相同的片段,每个链表只包含同一类型的可分配的内存块。根据申请内存的大小计算可分配的内存块的类型,若申请内存的大小为N则将N–1的值右移6个二进制位得到系数F。使用从高位到低位的二进制位扫描操作找到系数F中最高为1的二进制位X,如果F=0则X=0。再将N–1的值右移X+5个二进制位得到基数值B,最后计算出可分配的内存块的类型值T=B+X+X。根据该算法计算出的类型值,从0到9可依次对应下列分配粒度:32、64、96、128、192、256、384、512、768、1024。即当0<N≤32时按32字节粒度分配,当32<N≤64时按64字节粒度分配,当64<N≤96时按96字节粒度分配,以此类推。分配内存时先根据申请内存的大小计算可分配的内存块的类型,再根据类型取对应链表中的第一个可分配的内存块。若链表中没有可分配的内存块则从后备列表中取一个空闲的内存块,若后备列表中也没有空闲的内存块则从系统内存中分配一个新的内存块,然后将内存块按类型对应的分配粒度分割成多个大小相同的片段并将内存块加入该链表成为可分配的内存块。从可分配的内存块中分配一个内存片段,若该内存块中所有片段全部分配完则将内存块从对应链表中移除。释放内存时根据目标地址所在内存块将释放的内存片段标记为已释放。释放内存后,若内存块中只有一个可分配的内存片段,则将内存块添加到对应类型的链表中。若内存块中的所有内存片段已全部释放,则将内存块从链表中移除并作为空闲的内存块加入后备列表。当后备列表中的空闲的内存块积累到预设数量时,将后备列表中的空闲的内存块完全释放。在多处理器系统中为每个处理器配置一组由可分配的内存块构成的链表,使得每个处理器在处理分配内存时仅从自己私有的链表中取可分配的内存块,没有可分配的内存块时再到后备列表中取空闲的内存块或从系统内存中分配一个新的内存块。本专利技术与现有技术相比具有如下特点:使用后备列表提供空闲的内存块,再通过对内存块进行分类和切割实现的小内存分配机制。配合无锁化的链表实现内存的分配和释放过程完全无锁化,且后备列表的存在使得这种内存分配机制能像Linux的SLAB分配器一样在多个模块间使用。附图说明附图1为本专利技术具体实施方案的示意图;附图2为本专利技术具体实施方案中可分配的内存块类型和对应分配粒度以及分割示意图;附图3为本专利技术具体实施方案中分配内存时简化的主要流程示意图。具体实施方式如附图1所示:本专利技术由一个单向链表构成的后备列表101以及多个由可分配的内存块构成的链表组成,处理器CPU0和CPU1各有一组私有的链表。当CPU0从类型为“0”的可分配的内存块分配内存时取私有链表102中的可分配的内存块,当CPU1从类型为“0”的可分配的内存块分配内存时取私有链表103中的可分配的内存块,CPU0和CPU1之间不会互相干扰。只有当链表102和链表103都没有可分配的内存块时,CPU0和CPU1才会同时去后备列表101取空闲的内存块。图1中所示处理器数量和链表数量并非实际应用中的场景,且图1中的双向链表可以是环形链表,该图仅用于在小规模示例中展现本专利技术的意图。如附图2所示:内存块201是类型为“0”的可分配的内存块,分配粒度为32字节。内存块202是类型为“1”的可分配的内存块,分配粒度为64字节。内存块203是类型为“2”的可分配的内存块,分配粒度为96字节。所有内存块均按类型对应的分配粒度分割成多个大小相同的片段,分配内存时每次分配一个片段。如附图3所示:分配内存时执行步骤301根据申请内存的大小计算可分配的内存块的类型,再执行步骤302根据类型判断对应链表中是否有可分配的内存块,若有则执行步骤303从可分配的内存块中分配一个内存片段。若链表中没有可分配的内存块则执行步骤304判断后备列表中是否有空闲的内存块,若有则执行步骤305取一个空闲的内存块,若没有则执行步骤307从系统内存中分配一个新的内存块。然后执行步骤306将内存块按类型对应的分配粒度分割成多个大小相同的片段并将内存块加入该链表成为可分配的内存块,再执行步骤303从可分配的内存块中分配一个内存片段,完成内存分配。执行步骤303时,若该内存块中所有片段全部分配完则将内存块从对应链表中移除。释放内存时根据目标地址所在内存块,将释放的内存片段标记为已释放。释放内存后,若内存块中只有一个可分配的内存片段,则将内存块添加到对应类型的链表中。若内存块中的所有内存片段已全部释放,则将内存块从链表中移除并作为空闲的内存块加入后备列表。当后备列表中的空闲的内存块积累到一定数量时,例如1024个空闲的内存块,将后备列表中的空闲的内存块完全释放。本专利技术涉及到计算机系统中二进制位的运算操作,特别是涉及二进制位扫描的操作,在一些处理器平台上有专门的指令来提供硬件支持以提高性能,例如在Intel的x86平台上可以使用BSR指令来快速获得目标值中最高为“1”的位。对于本专业领域的技术人员,能够熟练的在不同处理器平台上使用该平台的相关机器指令实现该操作。对于没有提供硬件支持的处理器平台,本专业领域的技术人员也能熟练的使用且不限于二分法和查表法来获得目标值中最高为1的位。不能将这些实现上的差异解释为超出本专利技术的范畴。本文档来自技高网...

【技术保护点】
1.一种基于后备列表的内存管理方法,该方法包括至少一个全局共享的后备列表用于存放空闲的内存块,以及多个由可分配的内存块构成的链表;其特征是:可分配的内存块有多种类型,每种类型对应一种分配粒度,每个可分配的内存块按类型对应的分配粒度分割成多个大小相同的片段,每个链表只包含同一类型的可分配的内存块。/n

【技术特征摘要】
1.一种基于后备列表的内存管理方法,该方法包括至少一个全局共享的后备列表用于存放空闲的内存块,以及多个由可分配的内存块构成的链表;其特征是:可分配的内存块有多种类型,每种类型对应一种分配粒度,每个可分配的内存块按类型对应的分配粒度分割成多个大小相同的片段,每个链表只包含同一类型的可分配的内存块。


2.根据权利要求1所述的一种基于后备列表的内存管理方法,该方法还包括根据申请内存的大小计算可分配的内存块类型的方法,其特征是:若申请内存的大小为N则将N–1的值右移6个二进制位得到系数F;使用从高位到低位的二进制位扫描操作找到系数F中最高为1的二进制位X,如果F=0则X=0;再将N–1的值右移X+5个二进制位得到基数值B,最后计算出可分配的内存块的类型值T=B+X+X。


3.根据权利要求1所述的一种基于后备列表的内存管理方法,其特征是:分配内存时先根据申请内存的大小计算可分配的内存块的类型,再根据类型取对应链表中的第一个可分配的内存块。


4.根据权利要求3所述的一种基于后备列表的内存管理方法,其特征是:若链表中没有可分配的内存块则从后备列表中取一个空闲的内存块,若后备列表中也没有空闲的内存块则从系统内存中分配一个新的...

【专利技术属性】
技术研发人员:龙恢管志坚
申请(专利权)人:长沙新弘软件有限公司
类型:发明
国别省市:湖南;43

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

1