一种动态内存分配器架构及其内存分配及释放方法

文档序号:35701948发布日期:2023-10-12 01:28阅读:52来源:国知局
一种动态内存分配器架构及其内存分配及释放方法

本发明属于动态内存分配器,具体涉及一种应用在linux用户态下的动态内存分配器架构及其内存分配及释放方法。


背景技术:

1、动态内存管理又被称为堆内存管理,是指计算机程序在运行期中分配使用内存,它可以当成是一种分配有限内存资源所有权的方法。动态内存管理在程序设计中具有重要的作用,因为系统的物理内存是有限的,而对内存的需求是变化的,程序的动态性越强,内存管理就越重要。如果没有动态内存,几乎现有的所有应用软件都无法运行。在动态内存频繁分配和释放的场合,例如,大型游戏,编译器,解释器,开发工具,浏览器等等,动态管理内存问题显得更加突出。

2、动态内存分配器就是一种动态内存的管理方法,它维护着一个进程的虚拟内存区域,称为堆,分配器将堆视为一组不同大小的块的集合来维护,每个块就是一个连续的虚拟内存碎片,这些块要么是已分配的,要么是未分配的。

3、评价动态内存分配器的一个指标就是它是否能够快速地分配释放内存。linux用户态下默认的内存分配器是ptmalloc,ptmalloc的架构存在着一个问题,它的内部存在着大量的锁操作,导致这个问题的原因是该架构设计了一个主分配区和一系列的非主分配区,线程每次申请释放时都需要对这些分配区进行锁操作,而这些锁操作是十分耗时的,严重影响内存分配释放的速度。


技术实现思路

1、基于现有技术中由于linux默认的内存分配器ptmalloc所采用的架构存在大量锁操作,降低了内存分配释放的速度;因此,本发明的目的是提供一种应用在linux用户态下的动态内存分配器架构及其内存分配及释放方法,即一种新的动态内存分配器架构memmalloc,该架构设计的一个原则就是尽可能加快对小内存块分配释放的速度,因为相较于大内存块来说,小内存分配释放的频率更高。

2、为了实现上述发明目的,本发明采用如下技术方案:

3、一种动态内存分配器架构,应用于linux用户态,内存块分为小内存块、大内存块和超大内存块,所述动态内存分配器架构由一个全局堆、多个小内存堆和每个线程特有的线程缓存组成,小内存块由小内存堆管理,大内存块由全局堆管理,超大内存块由内存分配器调用mmap或unmmap系统调用向操作系统进行申请分配或释放。

4、作为优选方案,所述小内存块的大小为(0,4024b],大内存块的大小为(4024b,1mb],超大内存块的大小大于1mb。

5、作为优选方案,所述大内存块分为256个大小类,分别是4kb、8kb直到1mb,每一个大小类中的大内存块都由一个个span组成。

6、作为优选方案,所述小内存块划分成252个大小类,分别是8b、24b、40b直到4024b,每一个大小类链表下都挂着一个个span,对应大小类的span切分成对应大小类的小内存块。

7、作为优选方案,所述线程缓存用于缓存小内存块,当线程申请小内存块时,会先从线程缓存中去找;若线程缓存中找不到则向小内存堆申请,线程缓存维护了一个小内存块大小类的数组链表,一共252个大小类,分别是8b、24b、40b直到4024b,每一个大小类链表下都挂着一个个相对应大小的小内存块。

8、本发明还提供如上任一项方案所述的动态内存分配器架构的内存分配方法,所述小内存块的分配方法,包括以下步骤:

9、s1、线程发起小内存块申请请求;

10、s2、线程首先查找线程缓存,检查线程缓存中是否有对应大小的小内存块,如果有则直接分配,没有的话转到步骤s3;

11、s3、线程向小内存堆进行申请,检查小内存堆是否有满足要求的初始内存;若是,则从初始内存中切割出一个span,然后再将该span切割成一块块对应大小的小内存块,将这些小内存块挂到相应大小类的数组链表下,然后转到步骤s6;若否,则转至步骤s4;

12、s4、检查对应大小类的数组链表下是否有可用小内存块;若是,则转到步骤s6;若否,则转至步骤s5;

13、s5、由小内存堆向全局堆申请一个span大小的内存块,之后小内存堆再将申请到的span切分成对应大小的小内存块,挂到对应大小的数组链表下;

14、s6、小内存堆分配一定数量的小内存块给线程缓存,然后再从线程缓存中取出一个小内存块进行分配。

15、本发明还提供如上任一项方案所述的动态内存分配器架构的内存释放方法,所述小内存块的释放方法,包括以下步骤:

16、s01、线程发起小内存块释放请求。

17、s02、检查线程缓存中的相应大小的小内存块数量是否超过阀值;若否,则将小内存块放入线程缓存中,结束释放流程;若是,则转至步骤s03;

18、s03、将小内存返回给小内存堆,并检查小内存块所属的span是否处于完全空闲状态;若否,则结束释放流程;若是,则转至步骤s04;

19、s04、将处于完全空闲状态下的span返还给全局堆,结束释放流程。

20、本发明还提供如上任一项方案所述的动态内存分配器架构的内存分配方法,所述大内存块的分配方法,包括以下步骤:

21、s10、线程发起大内存块申请请求;

22、s20、检查全局堆是否有满足要求的初始内存;若是,则从初始内存中切割出所需的大内存块分配给线程,结束分配流程;若无,则转至步骤s30;

23、s30、检查全局堆中对应大小的数组链表下是否有可用的大内存块;若是,则将大内存块分配给线程,结束分配流程;若否,则转至步骤s40;

24、s40、从当前大小类后一个类别开始检查,检查数组链表下是否有可用的大内存块;若是,则从该大内存块中切割出所需部分分配给线程,剩余部分挂到对应大小类数组链表下,结束分配流程;若否,则转至步骤s50;

25、s50、向操作系统再申请1gb的虚拟内存,再从申请的内存中切割出所需大小的内存块分配给线程,结束分配流程。

26、本发明还提供如上任一项方案所述的动态内存分配器架构的内存释放方法,所述大内存块的释放方法,包括:线程发起大内存块释放请求,将所释放的大内存块返还给全局堆,结束释放流程。

27、与现有技术相比,本发明的有益效果在于:

28、本发明设计了一个应用于linux用户态下的内存分配器架构memmalloc,其通过设计线程缓存和可扩展小内存堆的方式,减少了当线程申请小内存块时对小内存堆的争用,减少了线程的等待时间以及锁操作发生的次数,从而加快了小内存块的分配释放速度。相对于linux的默认分配器ptmalloc,memmalloc对小内存块的分配释放速度更快。

29、本发明将内存块分为三种,分别是小内存块、大内存块和超大内存块,大内存块由单独的一个全局堆进行管理,小内存块由多个小内存堆进行管理,并且小内存堆可支持扩展操作,而超大内存块则由内存分配器调用mmap、unmmap系统调用向操作系统进行申请分配、释放。除此之外,memmalloc还为每个线程设计了一个线程缓存专门用来缓存小内存块。通过可扩展小内存堆和线程缓存的方式,减少了当线程申请小内存块时对小内存堆的争用,减少了线程的等待时间以及锁操作发生的次数,从而加快了小内存块的分配释放速度。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1