一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

内存管理方法、装置及内存分配器与流程

2021-11-03 14:35:00 来源:中国专利 TAG:


1.本技术属于计算机技术领域,尤其涉及一种内存管理方法、装置及内存分配器。


背景技术:

2.内存管理从下往上可以分为三个层次:操作系统内核、开发语言运行时、应用层。操作系统内核负责管理物理内存,向上一层的运行时提供内存申请和释放的系统调用;开发语言运行时封装操作系统的系统调用,向再上一层的应用层提供内存申请和释放的库函数malloc和free等。
3.其中,操作系统内核管理内存的算法主要是以伙伴算法(buddy算法)为主的技术方案,其把内存按页(page)为单位,组织成不同的可用内存链表,每个链表包含相同大小的可用内存块,每个内存块包含1个或多个页。内核对内存的管理需要稳定可靠,同时能适用于各式各样的上层需要,因此内核的内存管理算法一般是以最简单的方案满足最抽象的内存存取需要。开发语言运行时封装内核的内存申请/释放的系统调用,给应用层提供内存操作库函数,运行时的内存管理算法加入了更为复杂、细致的技术方案来提高内存申请/释放的性能和效率,相比于内核,运行时可以为应用层提供更高效的内存申请和释放方案。
4.内存分配器是开发语言运行时的内存管理算法的具体实现,内存分配器最基本的任务是在用户层构建一个内存缓存池,避免频繁的通过系统调用申请或者释放内存。大多数的应用层直接使用开发语言运行时的库函数完成内存的申请和释放,即,对于绝大多数普通的应用系统而言,直接使用开发语言运行时的内存分配器,已经足够满足其业务需要。然而,申请人发现,在一些重度内存访问相关的系统或者对性能要求高的应用系统研发过程中,运行时的内存管理方案还不够最优,其内存分配器在内存利用率、分配性能/申请释放性能等方面已经不能满足需要。


技术实现要素:

5.有鉴于此,本技术提供一种内存管理方法、装置及内存分配器,用于针对重度内存访问相关的系统或高性能要求的业务系统,通过引入更高效的内存管理算法和数据结构,来至少提升内存分配器的内存分配性能。
6.具体技术方案如下:
7.一种内存管理方法,包括:
8.获取应用层的内存申请请求,所述内存申请请求中携带有应用层所需申请的内存空间的大小信息;
9.从预定的内存块列表集中确定出所维护内存块的块大小与所述大小信息相匹配的目标内存块列表;其中,每一内存块列表通过对应的位图数据结构维护一串相同大小的内存块,位图数据结构为最高层包括一个位块的单层或多层层级结构,位图数据结构低层的每个位块对应所邻接的高层的一位,最低层的每一位对应一个内存块,且最低层每一位的不同取值表示该位所对应内存块的不同状态,非最低层中每一位的不同取值表示该位在
下一层所对应的位块是否表征存在可用内存块;一个位块包括不超出预定长度阈值的位;
10.对所述目标内存块列表对应的目标位图数据结构执行位查找操作,以确定出所述目标内存块列表维护的一个可用内存块,得到目标内存块;
11.将所述目标内存块分配给应用层,并对所述目标内存块在所述目标位图数据结构中对应的相关位执行置位处理,以使所述相关位的取值与所述目标内存块被分配后所处的占用状态相匹配。
12.可选的,不同内存块列表分别维护不同类别的内存块,不同类别内存块的块大小不同,且,不同类别内存块的块大小间的步长满足预定的步长规则,每一类别内存块用于满足一个对应区间内存大小的内存申请与释放需求;
13.所述从预定的内存块列表集中确定出所维护内存块的块大小与所述大小信息相匹配的目标内存块列表,包括:
14.从所述内存块列表集中确定出所维护内存块的块大小与所述大小信息最接近且不小于所述大小信息的内存块列表,得到所述目标内存块列表。
15.可选的,所述步长规则为:不同类别内存块的块大小升序排序后,每两个相邻块大小间的步长为2的幂次,且升序排序后各个相邻块大小间的步长逐步加大。
16.可选的,内存块的状态为可用状态或占用状态;一个内存块列表对应的位图数据结构的层数为其中,n表示内存块列表维护的内存块的个数,l表示所述长度阈值;
17.位图数据结构最低层中每一位的取值为:用于表示该位所对应内存块处于可用状态的第一位值,或用于表示该位所对应内存块处于占用状态的第二位值;位图数据结构非最低层中每一位的取值为:用于表示该位在下一层所对应的位块表征存在可用内存块的第一位值,或用于表示该位在下一层所对应的位块表征不存在可用内存块的第二位值;
18.所述对所述目标内存块列表对应的目标位图数据结构执行位查找操作,以确定出所述目标内存块列表维护的一个可用内存块,得到目标内存块,包括:
19.若所述目标位图数据结构为一层,在所述目标位图数据结构的单一层中执行位查找操作,直至查找出取值为第一位值的目标位时,将该目标位对应的内存块确定为所述目标内存块;
20.若所述目标位图数据结构为多层,从所述目标位图数据结构的最高层开始执行位查找操作,在查找出取值为第一位值的位时,跳转并定位至该位在下一层对应的位块继续执行位查找操作,直至跳转并定位至所述目标位图数据结构的最低层相应位块,并从所述最低层相应位块查找出取值为第一位值的目标位时,将该目标位对应的内存块确定为所述目标内存块。
21.可选的,所述长度阈值为128;所述对所述目标内存块列表对应的目标位图数据结构执行位查找操作,包括:
22.利用单指令多数据流simd指令,对所述目标内存块列表对应的目标位图数据结构执行位查找操作;
23.其中,预先通过对simd指令的封装,形成面向预设开发语言接口的多个位图数据结构操作类。
24.可选的,所述对所述目标内存块在所述目标位图数据结构中对应的相关位执行置
位处理,包括:
25.将所述目标内存块在所述目标位图数据结构的最低层对应的位置位为第二位值;
26.将所述目标内存块在所述目标位图数据结构的最低层对应的位所属的位块作为目标位块,并确定所述目标位块中是否存在取值为第一位值的位;
27.若存在,结束当前的置位处理;
28.若不存在,将所述目标位块在当前所处层的上一层中对应的位置位为第二位值,并将所述目标位块在所述上一层中对应的位所属的位块重置为目标位块,以及触发上述对目标位块的处理,直至目标位块中存在取值为第一位值的位或所述目标位图数据结构的所有层处理完毕时结束。
29.可选的,上述方法,还包括:
30.获取应用层的内存释放请求,所述内存释放请求用于指示待释放内存块;
31.将待释放内存块归还至对应的内存块列表维护的内存块串,并对所释放的内存块在相应位图数据结构中对应的相关位执行复位处理,以使执行复位处理后相关位的取值与所释放的内存块的可用状态相匹配。
32.可选的,所述对释放的内存块在相应位图数据结构中对应的相关位执行复位处理,包括:
33.将释放的内存块在相应位图数据结构的最低层对应的位复位为第一位值;
34.将执行了复位操作的位所属的位块作为目标位块,并确定目标位块在当前所处层的上一层中对应的位的取值是否为第一位值;
35.若是,结束当前的复位处理;
36.若否,将目标位块在当前所处层的上一层中对应的位的取值复位为第一位值,并将所述目标位块在所述上一层中对应的位所属的位块重置为目标位块,以及触发上述对目标位块的处理,直至目标位块在当前所处层的上一层中对应的位的取值为第一位值或所述相应位图数据结构的所有层处理完毕时结束。
37.一种内存管理装置,包括:
38.获取模块,用于获取应用层的内存申请请求,所述内存申请请求中携带有应用层所需申请的内存空间的大小信息;
39.确定模块,用于从预定的内存块列表集中确定出所维护内存块的块大小与所述大小信息相匹配的目标内存块列表;其中,每一内存块列表通过对应的位图数据结构维护一串相同大小的内存块,位图数据结构为最高层包括一个位块的单层或多层层级结构,位图数据结构低层的每个位块对应所邻接的高层的一位,最低层的每一位对应一个内存块,且最低层每一位的不同取值表示该位所对应内存块的不同状态,非最低层中每一位的不同取值表示该位在下一层所对应的位块是否表征存在可用内存块;一个位块包括不超出预定长度阈值的位;
40.查找模块,用于对所述目标内存块列表对应的目标位图数据结构执行位查找操作,以确定出所述目标内存块列表维护的一个可用内存块,得到目标内存块;
41.分配处理模块,用于将所述目标内存块分配给应用层,并对所述目标内存块在所述目标位图数据结构中对应的相关位执行置位处理,以使所述相关位的取值与所述目标内存块被分配后所处的占用状态相匹配。
42.一种内存分配器,所述内存分配器中实现有计算机指令集,所述计算机指令集在运行时用于执行如上任一项所述的内存管理方法。
43.根据以上方案可知,本技术提供的内存管理方法、装置及内存分配器,在内存管理中,内存块列表集中的每一内存块列表通过对应的位图数据结构维护一串相同大小的内存块,即,每个内存块列表用一个位图数据结构管理,基于本技术为内存块列表设计并构建的包括单层或多层层级结构的位图数据结构,在内存分配中进行位查找时,每次查找只需从高层到低层,逐层查找表征存在可用内存块的有效位,即可完成查找操作、确定出可用内存块,从而,可支持应用层申请和释放内存时,高效率获取一块可用内存或者释放一块内存,进一步提升了内存分配器的内存分配性能。
附图说明
44.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
45.图1是本技术提供的内存管理方法的一种流程示意图;
46.图2是本技术提供的图谱数据结构的多层层级结构示例;
47.图3是本技术提供的内存管理方法的另一种流程示意图;
48.图4是本技术提供的内存管理方法的又一种流程示意图;
49.图5是本技术提供的内存管理装置的结构示意图。
具体实施方式
50.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
51.内存分配器对应用系统而言是最基础的组件,现有的内存分配器在实现过程中,将稳定性和普适性作为一个最重要的目标,在这个目标的约束下,内存分配器的算法和数据结构一般选择在各种场合和应用场景都有比较均衡表现的技术方案,同时在算法实现上,也需要采用覆盖绝大多数硬件平台的技术。相应对于绝大多数普通的应用系统而言,直接使用开发语言运行时的现有内存分配器的内存管理方案,已经足够满足业务需要。但是在一些重度内存访问相关的系统或者对性能要求高的应用系统研发过程中,现有内存分配器的内存管理方案还不够最优。
52.为解决该问题,本技术实施例公开一种内存管理方法、装置及内存分配器,本技术方案主要用于内存数据库,应用场景通常是对性能有很高要求的业务系统或重度内存访问相关的系统,应用平台可以是主流的服务器平台。即,针对应用系统的业务场景和应用平台明确可控的场景,提出本技术方案,以更好的满足业务和平台的要求,同时大大提高内存分配的性能。
53.实际应用中,可将本技术方法的处理流程实现为内存分配器的形式。
54.内存分配器最基本的任务是在用户层构建一个内存缓存池,避免频繁的通过系统调用申请或者释放内存。一般来说,内存缓存池首先要维护多个可用内存块列表,每个列表包含相同大小的内存块。应用层申请内存时,匹配到相应的列表,取得一个可用内存块;释放内存时,内存块释放到对应的可用内存块列表。内存块列表的长度按一定策略管理,扩充时就意味着向操作系统申请内存,收缩时则意味着向操作系统释放内存。不同的内存块列表对应于不同大小的内存块,列表的数量就是可用内存块按大小分类后所得的类别数量。
55.本技术实施例提供的内存管理方法的处理流程如图1所示,至少包括:
56.步骤101、获取应用层的内存申请请求,内存申请请求中携带有应用层所需申请的内存空间的大小信息。
57.当应用层基于业务需求需使用一块相应大小的内存时,会向内存分配器发起内存申请请求,所发起的请求中携带有所需申请的内存空间的大小信息,如1bye、15byte或1k的大小值等。
58.步骤102、从预定的内存块列表集中确定出所维护内存块的块大小与所述大小信息相匹配的目标内存块列表。
59.本技术实施例中,内存块列表集中的每一内存块列表均为可支持内存块申请与释放的可用内存块列表。
60.内存分配器获取应用层的内存申请请求,并从内存块列表集中确定出所维护内存块的块大小与所申请内存的大小信息相匹配的目标内存块列表。
61.现代的内存分配器面临的课题主要有两方面,一个课题是多核多线程场景的内存申请/释放的并发冲突,该问题主要通过引入线程本地缓存池来解决。
62.另一课题是可用内存块列表的维护。如果为每个大小的内存块都提供一个列表,该列表包含一串相同大小的可用内存块,且在内存分配时,以点值匹配方式进行内存申请(如,应用层申请1byte的内存,那么就从维护的块大小为1byte的内存块列表取得一个1byte的可用内存块),那么列表的数量将过于庞大,性能和利用率都不会很理想。因此一个可行的方案是把可用内存块按大小分类(size class),每个类别的内存块用于满足一个区间的内存申请需要。比如,提供一个列表,该列表包含一串8byte可用内存块,如果应用层申请1byte到8byte的内存,都从该列表取得一个8byte的内存块,返回给应用层。
63.申请人经研究发现,在将内存块按大小分类的过程中,如果分类比较粗,会造成比较大的内部碎片,内存空间利用率低,如果分类比较细,则会影响内存分配的性能。因此,较优的一种做法是,通过研究应用层内存申请时所申请内存大小的分布信息,并综合考虑内存空间利用率和内存分配性能对内存块进行分类。
64.申请人经研究发现,应用层申请内存的大小可能是任意值,主要以小块内存为主,基于该分布特征,并通过综合考虑内存空间利用率和内存分配性能,本实施例提出按如下的步长规则来对内存块按大小进行分类:不同类别内存块的块大小升序排序后每两个相邻块大小间的步长为2的幂次,且升序排序后各个相邻块大小间的步长逐步加大。
65.以下提供按上述步长规则设计的内存分类的一个示例,具体如表1所示:
66.表1
67.分类序号步长内存块大小1
‑‑
28[8,16]
3
‑‑
916[32,48,64,80,96,112,128]10
‑‑
1332[160,192,224,256]14
‑‑
1764[320,384,448,512]18
‑‑
21128[640,768,896,1024]22

25256[1280,1536,1792,2048]26
‑‑
29512[2560,3072,3584,4096]30

331k[5kib,6kib,7kib,8kib]
[0068]
并且,分类后的每个类别满足一个所对应区间内存大小的内存申请与释放需求。比如,表1中的第一个类别维护一串8byte的内存块,则针对应用层申请1byte至8byte内存的请求,内存分配器均是从该类别取得一个8byte的可用内存块返回给应用层。
[0069]
鉴于此,本步骤102中,在从内存块列表集中确定所维护内存块的块大小与所申请大小值相匹配的目标内存块列表时,具体可从内存块列表集中确定出所维护内存块的块大小与所申请大小值最接近且不小于所申请大小值的内存块列表,将其作为目标内存块列表。也就是说,应用层申请内存时,按所申请的内存空间大小值向上取整,对齐到内存块分类中与所申请的内存大小最为接近的内存块大小类别,后续从该类别对应的内存块列表(即,目标内存块列表)中进一步确定出一可用内存块,并返回给应用层。
[0070]
为了支持应用层对内存块的申请和释放,管理内存块列表需要设计实现专门的数据结构和算法。目前常用的算法有基于链表的sequential fit算法、基于链表数组的buddy system算法、基于二叉树的indexed fit算法等。然而这些算法的性能不够优化。为此,本技术引入位图数据结构(bitmap),来管理维护内存块列表,以进行高性能的内存块管理。
[0071]
具体地,本技术在将内存块按大小分成不同的类别(size class),使每个类别包含大小相同的一串内存块,形成不同类别的内存块列表后,将每个内存块列表用一个位图数据结构来管理,以支持应用层申请和释放内存时,高效率获取一块可用内存或者释放一块内存,在应用系统的业务场景和应用平台明确可控的条件下,大大提高内存块申请和释放性能。
[0072]
在内存块集合的管理维护过程中,主要操作包括查找可用内存块、置位为占用、复位为可用。基于本技术提出的位图数据结构管理方式,可有效管理与维护数据规模大、只有两种元素状态的内存块集合,但由于常用的遍历算法的时间复杂度是o(n),随着内存块集合的规模增长,在位图数据结构上做查找会面临很大挑战,导致性能表现不够理想。针对该情况,本实施例进一步提出,针对内存块列表长度较长的情况,为其设计多层位图数据结构,以支持超长内存块列表的处理操作。
[0073]
其中,内存块列表长度,指内存块列表维护的一串内存块的内存块个数。
[0074]
实际应用中,可设置一长度阈值,如128或256等,对于未超出该长度阈值的内存块列表,为其构建单层的位图数据结构(bitmap),对于超出该长度阈值的内存块列表,相应根据内存块列表的实际长度,为其构建包括多层层级结构的多层位图数据结构(kbitmap),使得每一内存块列表通过对应的位图数据结构维护一串相同大小的内存块。
[0075]
每一内存块列表对应的位图数据结构为单层或多层层级结构,位图数据结构的每层包括一系列的位(bit),且每层以位块形式对包括的各个位进行组织,一个位块包括不超出上述长度阈值(如,128)的位,一个内存块列表对应的位图数据结构的层数为
其中,n表示内存块列表维护的内存块的个数,l表示上述的长度阈值,且位图数据结构的第一层(即,顶层)包括一个位块。
[0076]
进一步,内存块列表的位图数据结构最低层(即,底层)中的每一位对应该内存块列表的一个内存块,且最低层每一位的不同取值表示该位所对应内存块的不同状态,内存块列表中每个内存块的状态有两种:可用和占用,最低层中每一位的取值相应包括两种:用于表示该位所对应内存块处于可用状态的第一位值,及用于表示该位所对应内存块处于占用状态的第二位值。
[0077]
低层的每个位块(如,由低层128bit构成的位块)对应所邻接的高层的一位,且非最低层(非底层)中每一位的不同取值表示该位在下一层所对应的位块是否表征存在可用内存块,具体的,非最低层中每一位的取值为:用于表示该位在下一层所对应的位块表征存在可用内存块的第一位值,或用于表示该位在下一层所对应的位块表征不存在可用内存块的第二位值。
[0078]
其中,第一取值与第二取值不同,例如,第一取值与第二取值可以分别为1、0,或者,也可分别为0、1,在此不作限制。容易理解,本技术实施例中,位图数据结构中相同的位值,如第一位值“1”,在不同层分别表示不同含义。
[0079]
以下以一示例举例说明。
[0080]
该示例中,某内存块列表mblist的列表长度(即该列表包括的内存块个数)n=16385,上述的长度阈值l=128,第一位值为“1”,第二位值为“0”。
[0081]
参见图2,图2提供了该内存块列表mblist对应的多层bitmap的示意图。
[0082]
在mblist的多层bitmap数据结构体系中,最低层(即,底层level 0)共有16385个位(bit),每一位对应mblist的一个内存块,低层的每个位块(如,包含128个bit的位块)对应于高层的1位,层次高度为
[0083]
初始状态下,位图数据结构的每个位都被置位为第一位值即“1”,表示内存块可用,应用层申请内存时,内存分配器通过查找多层bitmap,定位到一个可用内存块返回给应用层,并将该内存块对应的位置位为0,表示该内存块已经被占用。
[0084]
步骤103、对上述目标内存块列表对应的目标位图数据结构执行位查找操作,以确定出目标内存块列表维护的一个可用内存块,得到目标内存块。
[0085]
在从内存块列表集中确定出所维护内存块的块大小与所申请大小值相匹配的目标内存块列表之后,可进一步通过在目标内存块列表对应的位图数据结构中执行位查找操作,来最终确定出目标内存块列表中的一可用内存块,供应用层使用。
[0086]
其中,若目标位图数据结构为一层,直接在目标位图数据结构的单一层中执行位查找操作,直至查找出取值为第一位值的目标位时,如查找到取值为“1”的位时,表明查找到处于可用状态的内存块,相应将该第一位值的目标位对应的内存块确定为待分配至应用层的目标内存块。
[0087]
若目标位图数据结构为多层,则从目标位图数据结构的最高层开始执行位查找操作,在查找出取值为第一位值的位时,表明该位在下一层对应的位块指示存在可用内存块,相应跳转并定位至该位在下一层对应的位块继续执行位查找操作,直至跳转并定位至目标位图数据结构的最低层相应位块,并从最低层相应位块查找出取值为第一位值的目标位
时,将该目标位对应的内存块确定为待分配至应用层的目标内存块。
[0088]
以图2的示例为例,在针对应用层的内存申请,查找可用内存块时,首先从多层bitmap的最高层(即,level 2)开始查找,一旦查找到最高层取值是“1”的位,就说明该位对应的下一层位块指示存在可用内存块,此时跳转到下一层的相应位块继续查找,按此方式逐层查找,最后定位到最低层的取值为“1”的位,即可得到用于分配给应用层的可用内存块(目标内存块)。
[0089]
步骤104、将目标内存块分配给应用层,并对目标内存块在目标位图数据结构中对应的相关位执行置位处理,以使相关位的取值与目标内存块被分配后所处的占用状态相匹配。
[0090]
在通过对目标位图数据结构执行位查找操作,确定出待分配给应用层的目标内存块后,将目标内存块返回给应用层,实现目标内存块的分配。
[0091]
完成分配后,目标内存块即从原有的可用状态转变为占用状态,此时,需对目标内存块在目标位图数据结构中对应的相关位执行置位处理,以维护目标位图数据结构的数据与内存块实际状态的同步。
[0092]
上述置位处理的处理过程具体包括:
[0093]
11)将目标内存块在目标位图数据结构的最低层对应的位置位为第二位值;
[0094]
如,将目标内存块在目标位图数据结构的最低层对应的位,从原有取值“1”置位为“0”,以表示该目标内存块当前已被占用。
[0095]
12)将目标内存块在目标位图数据结构的最低层对应的位所属的位块作为目标位块,并确定目标位块中是否存在取值为第一位值的位;
[0096]
13)若存在,结束当前的置位处理;
[0097]
14)若不存在,将目标位块在当前所处层的上一层中对应的位置位为第二位值,并将目标位块在所述上一层中对应的位所属的位块重置为目标位块,以及触发上述对目标位块的处理,直至目标位块中存在取值为第一位值的位或目标位图数据结构的所有层处理完毕时结束。
[0098]
通过步骤11)

14),确保目标内存块的bit位所属位块,在整个位图数据结构中从顶层至底层对应的位块路径上的各个相关位的取值,与目标内存块被占用后的占用状态相同步。
[0099]
根据以上方案可知,本技术实施例提供的内存管理方法,在内存管理中,内存块列表集中的每一内存块列表通过对应的位图数据结构维护一串相同大小的内存块,即,每个内存块列表用一个位图数据结构管理,基于本技术为内存块列表设计并构建的包括单层或多层层级结构的位图数据结构,在内存分配中进行位查找时,每次查找只需从高层到低层,逐层查找表征存在可用内存块的有效位,即可完成查找操作、确定出可用内存块,从而,可支持应用层申请和释放内存时,高效率获取一块可用内存或者释放一块内存,进一步提升了内存分配器的内存分配性能。
[0100]
在对位图数据结构执行位操作时,比较常见的是c语言的位操作算法,c语言的位操作算法在查找有效位(即,表示内存块可用的位)时,需要依次遍历各个位,效率不高。
[0101]
现代cpu实现了simd(single instruction multiple data,单指令多数据流)指令,能在一个指令周期完成多个数据操作。本技术将simd指令结合应用在对位图数据结构
的操作中,且当下绝大多数主流平台都支持simd,因此在应用系统的使用环境明确可控的条件下,系统开发过程中可以引入simd指令处理位图数据结构的数据,来有效提高可用内存块管理维护的性能。
[0102]
在此基础上,结合参见图3提供的内存管理方法的流程图,图1所示内存管理方法中的步骤103,可进一步实现为:
[0103]
步骤103’、利用单指令多数据流simd指令,对目标内存块列表对应的目标位图数据结构执行位查找操作。
[0104]
具体的,基于simd指令,从位图数据结构的最高层到底层逐层检索第一个有效位,直至定位至底层的第一有效位,即可得到一个可用内存块,每次检索就是一个simd指令,例如,对于2层bitmap,只需要2个simd指令,就可以找到可用内存块,以此避免遍历操作。
[0105]
simd指令有多种用法,比如汇编指令、intel函数库、内置函数(intrinsics)库等。可选的,本技术实施例采用内置函数(intrinsics)库的方式,直接引用相关头文件后调用内置函数实现相关算法。
[0106]
主要用到的simd指令相关函数包括:
[0107]
__m128i_mm_setone_si128():初始化128bit的bit set,所有位都置1。
[0108]
__m128i_mm_lzcnt_epi32(__m128i a):统计参数a的前导0的个数。
[0109]
__m128i_mm_set1_epi64x(__int64a):把目标缓存置位为a。
[0110]
simd指令的操作对象以寄存器为主,操作数长度通常是128位,本技术实施例相应选取128位的simd指令操作数位数,来处理bitmap数据,这一方面可以满足大多数业务需求,另一方面可以更方便的使用simd指令相关函数。
[0111]
结合引入的simd指令,相应将上述的长度阈值设置为128,即,l=128。该情况下,2层bitmap就可以支持16384位(对应16384个内存块),已经可以满足绝大多数场合中内存块列表的管理维护。对于2层bitmap,相应只需要2个simd指令,即可找到可用内存块,相比于普通的c语言位运算性能有了大幅提高,同时,相比于基于链表或者树的数据结构的查找算法而言,性能也得到几个数量级的提升。
[0112]
c/c 语言的变量长度一般是32位或者64位,而simd指令的操作数长度通常是128位,为了方便使用,本技术进一步对simd指令进行封装,形成面向c 语言接口的一系列bitmap操作类,主要的类包括vector128b、vector4ui等。其中,vector128b封装了simd底层的__m128i数据类型和基础的simd位操作指令,vector4i提供了面向应用层的32位整形操作接口。应用层可以像使用常见的整型变量一样来利用simd指令处理128位bitmap,利用simd指令在一个指令周期完成对128位的查找操作,大大提高了位操作的处理性能,并降低了开发负担。
[0113]
在一实施例中,参见图4,本技术的内存管理方法,还可以包括:
[0114]
步骤105、获取应用层的内存释放请求,内存释放请求用于指示待释放内存块。
[0115]
步骤106、将待释放内存块归还至对应的内存块列表维护的内存块串,并对所释放的内存块在相应位图数据结构中对应的相关位执行复位处理,以使执行复位处理后相关位的取值与所释放的内存块的可用状态相匹配。
[0116]
应用层释放一个内存块时,内存分配器将该内存块归还至其所对应的内存块列表维护的内存块串,同时,需对所释放内存块在所对应的位图数据结构中的相关位执行复位
处理,以维护位图数据结构的数据与内存块实际状态的同步。
[0117]
该复位处理的处理过程具体包括:
[0118]
21)将释放的内存块在相应位图数据结构的最低层对应的位复位为第一位值;
[0119]
如,将释放的内存块在相应位图数据结构的最低层对应的位,从之前的取值“0”复位为“1”,以表示该内存块恢复为可用状态。
[0120]
22)将执行了复位操作的位所属的位块作为目标位块,并确定目标位块在当前所处层的上一层中对应的位的取值是否为第一位值;
[0121]
23)若是,结束当前的复位处理;
[0122]
24)若否,将目标位块在当前所处层的上一层中对应的位的取值复位为第一位值,并将所述目标位块在所述上一层中对应的位所属的位块重置为目标位块,以及触发上述对目标位块的处理,直至目标位块在当前所处层的上一层中对应的位的取值为第一位值或所述相应位图数据结构的所有层处理完毕时结束。
[0123]
通过步骤21)

24),确保所释放内存块的bit位所属位块,在整个位图数据结构中从顶层至底层对应的位块路径上的各个相关位的取值,与该内存块被释放后恢复为可用状态的情况相同步。
[0124]
对应于上述的方法,本技术实施例还公开一种内存管理装置,如图5所示,该装置包括:
[0125]
获取模块501,用于获取应用层的内存申请请求,所述内存申请请求中携带有应用层所需申请的内存空间的大小信息;
[0126]
确定模块502,用于从预定的内存块列表集中确定出所维护内存块的块大小与所述大小信息相匹配的目标内存块列表;其中,每一内存块列表通过对应的位图数据结构维护一串相同大小的内存块,位图数据结构为最高层包括一个位块的单层或多层层级结构,位图数据结构低层的每个位块对应所邻接的高层的一位,最低层的每一位对应一个内存块,且最低层每一位的不同取值表示该位所对应内存块的不同状态,非最低层中每一位的不同取值表示该位在下一层所对应的位块是否表征存在可用内存块;一个位块包括不超出预定长度阈值的位;
[0127]
查找模块503,用于对所述目标内存块列表对应的目标位图数据结构执行位查找操作,以确定出所述目标内存块列表维护的一个可用内存块,得到目标内存块;
[0128]
分配处理模块504,用于将所述目标内存块分配给应用层,并对所述目标内存块在所述目标位图数据结构中对应的相关位执行置位处理,以使所述相关位的取值与所述目标内存块被分配后所处的占用状态相匹配。
[0129]
在一实施例中,不同内存块列表分别维护不同类别的内存块,不同类别内存块的块大小不同,且,不同类别内存块的块大小间的步长满足预定的步长规则,每一类别内存块用于满足一个对应区间内存大小的内存申请与释放需求;
[0130]
确定模块502,具体用于:从内存块列表集中确定出所维护内存块的块大小与所申请内存的大小信息最接近且不小于该大小信息的内存块列表,得到目标内存块列表。
[0131]
在一实施例中,上述步长规则为:不同类别内存块的块大小升序排序后,每两个相邻块大小间的步长为2的幂次,且升序排序后各个相邻块大小间的步长逐步加大。
[0132]
在一实施例中,内存块的状态为可用状态或占用状态;一个内存块列表对应的位
图数据结构的层数为其中,n表示内存块列表维护的内存块的个数,l表示所述长度阈值;
[0133]
位图数据结构最低层中每一位的取值为:用于表示该位所对应内存块处于可用状态的第一位值,或用于表示该位所对应内存块处于占用状态的第二位值;位图数据结构非最低层中每一位的取值为:用于表示该位在下一层所对应的位块表征存在可用内存块的第一位值,或用于表示该位在下一层所对应的位块表征不存在可用内存块的第二位值;
[0134]
查找模块503,具体用于:
[0135]
若目标位图数据结构为一层,在所述目标位图数据结构的单一层中执行位查找操作,直至查找出取值为第一位值的目标位时,将该目标位对应的内存块确定为所述目标内存块;
[0136]
若目标位图数据结构为多层,从所述目标位图数据结构的最高层开始执行位查找操作,在查找出取值为第一位值的位时,跳转并定位至该位在下一层对应的位块继续执行位查找操作,直至跳转并定位至所述目标位图数据结构的最低层相应位块,并从所述最低层相应位块查找出取值为第一位值的目标位时,将该目标位对应的内存块确定为所述目标内存块。
[0137]
在一实施例中,上述长度阈值为128。
[0138]
查找模块503,具体用于:
[0139]
利用单指令多数据流simd指令,对所述目标内存块列表对应的目标位图数据结构执行位查找操作;
[0140]
其中,预先通过对simd指令的封装,形成面向预设开发语言接口的多个位图数据结构操作类。
[0141]
在一实施例中,分配处理模块504,在对目标内存块在目标位图数据结构中对应的相关位执行置位处理时,具体用于:
[0142]
将所述目标内存块在所述目标位图数据结构的最低层对应的位置位为第二位值;
[0143]
将所述目标内存块在所述目标位图数据结构的最低层对应的位所属的位块作为目标位块,并确定所述目标位块中是否存在取值为第一位值的位;
[0144]
若存在,结束当前的置位处理;
[0145]
若不存在,将所述目标位块在当前所处层的上一层中对应的位置位为第二位值,并将所述目标位块在所述上一层中对应的位所属的位块重置为目标位块,以及触发上述对目标位块的处理,直至目标位块中存在取值为第一位值的位或所述目标位图数据结构的所有层处理完毕时结束。
[0146]
在一实施例中,获取模块501,还用于:获取应用层的内存释放请求,所述内存释放请求用于指示待释放内存块;
[0147]
上述装置还包括:释放处理模块,用于:
[0148]
获取应用层的内存释放请求,所述内存释放请求用于指示待释放内存块;
[0149]
将待释放内存块归还至对应的内存块列表维护的内存块串,并对所释放的内存块在相应位图数据结构中对应的相关位执行复位处理,以使执行复位处理后相关位的取值与所释放的内存块的可用状态相匹配。
[0150]
在一实施例中,释放处理模块,在对释放的内存块在相应位图数据结构中对应的
相关位执行复位处理时,具体用于:
[0151]
将释放的内存块在相应位图数据结构的最低层对应的位复位为第一位值;
[0152]
将执行了复位操作的位所属的位块作为目标位块,并确定目标位块在当前所处层的上一层中对应的位的取值是否为第一位值;
[0153]
若是,结束当前的复位处理;
[0154]
若否,将目标位块在当前所处层的上一层中对应的位的取值复位为第一位值,并将所述目标位块在所述上一层中对应的位所处的位块重置为目标位块,以及触发上述对目标位块的处理,直至目标位块在当前所处层的上一层中对应的位的取值为第一位值或所述相应位图数据结构的所有层处理完毕时结束。
[0155]
对于本技术实施例公开的内存管理装置而言,由于其与上文各方法实施例公开的内存管理方法相对应,所以描述的比较简单,相关相似之处请参见上文相应方法实施例的说明即可,此处不再详述。
[0156]
另外,本技术实施例还公开一种内存分配器,该内存分配器中实现有计算机指令集,该计算机指令集具体可以采用计算机程序的形式实现,所实现的计算机指令集在运行时,用于执行如上文任一方法实施例公开的内存管理方法。
[0157]
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
[0158]
为了描述的方便,描述以上系统或装置时以功能分为各种模块或单元分别描述。当然,在实施本技术时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
[0159]
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本技术可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本技术各个实施例或者实施例的某些部分所述的方法。
[0160]
最后,还需要说明的是,在本文中,诸如第一、第二、第三和第四等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0161]
以上所述仅是本技术的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本技术原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本技术的保护范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献