掌桥专利:专业的专利平台
掌桥专利
首页

一种基于松散内存释放的内存管理系统

文献发布时间:2023-06-19 09:57:26


一种基于松散内存释放的内存管理系统

技术领域

本发明涉及计算机内存管理领域,尤其涉及一种基于松散内存释放的内存管理系统。

背景技术

目前的内存池管理方法导致分配和释放内存的周期比较大,因此增加了处理器的负荷,限制了每个基带板能够处理的用户。目前普通式链式内存池管理方法,主要采用如下机制:将空闲块按照尺寸的不同,分别挂接到了不同的空闲队列中。对空闲内存块链表的操作需要用互斥锁保护,以解决在多任务环境下,链表的一致性问题。在内存池管理中,引入了对象互斥锁的概念是为了保证内存资源操作的完整性。在任一时刻,只能有一个任务可以访问内存池,而其它任务则不能进行内存池的分配和释放。使用互斥锁本身是一个很耗时的操作,并且会增加任务间的耦合性。这样大大增加了分配和释放内存块耗时,并且耗时的不确定性大大增加,内存复用效率低。在系统长期运行后容易造成系统内存映像散乱的现象,对短暂内存存取错误的容错率低,内存释放不够严格,同时还极易出现内存泄漏现象。

发明内容

本发明的目的在于克服现有技术的不足,提供一种基于松散内存释放的内存管理系统。

本发明的目的是通过以下技术方案来实现的:

一种基于松散内存释放的内存管理系统,包括接口模块、内存分配模块、线程绑定模块、内存释放模块和内存分隔模块。其中,接口模块用于统一制定接口标准,以及调用内存分配函数;内存分配模块用于创建临时内存分配器,并根据任务执行需求从指定的内存分配器中分配内存;线程绑定模块用于在任务执行前将线程和内存分配器进行绑定,指定内存分配器执行任务;内存释放模块用于在任务执行完成后释放临时的内存分配器,并还原线程的当前内存分配器;内存分隔模块用于分隔不同用途的内存区域,维护系统长期运行。

具体的,所述接口模块包括分配函数接口、重分配函数接口、释放函数接口、初始化分配器的函数接口、清除分配器函数接口。

具体的,所述临时内存分配器包括上级内存分配器、BIN内存分配器、堆叠式内存分配器和串接式内存分配器;其中,上级内存分配器用于表示整个内存管理系统的父类型内存,从操作系统处分配较大的内存区,然后将分配的较大内存区交由其它分配器进行内存分配;BIN内存分配器用于分配较小的内存区;堆叠式内存分配器用于根据用户需求的内存大小来自动选择分配的内存区的位置;串接式内存分配器用于将小内存区融合成大内存区。

具体的,所述内存区域包括字典内存区、会话内存区、锁资源内存区、任务内存区。

本发明的有益效果:

1、本发明的系统具有是否引用、是否自拥有内在块、是否对象、拥有内存大小、数据实有尺度等的自描述功能;

2、具有动态内存扩展能力,允许任务对内存分配与释放进行松散处理,降低了各个并发任务执行过程中的内存申请与释放操作之间的相互干扰;

3、具有内存复用能力,能自适应地动态申请并调整内存用量,大大减少了动态申请内存的开销。

附图说明

图1是本发明的系统功能模块图。

具体实施方式

为了对本发明的技术特征、目的和效果有更加清楚的理解,现对照附图说明本发明的具体实施方式。

本实施例中,如图1所示,一种基于松散内存释放的内存管理系统,包括接口模块、内存分配模块、线程绑定模块、内存释放模块和内存分隔模块。其中,接口模块用于统一制定接口标准,以及调用内存分配函数;内存分配模块用于创建临时内存分配器,并根据任务执行需求从指定的内存分配器中分配内存;线程绑定模块用于在任务执行前将线程和内存分配器进行绑定,指定内存分配器执行任务;内存释放模块用于在任务执行完成后释放临时的内存分配器,并还原线程的当前内存分配器;内存分隔模块用于分隔不同用途的内存区域,维护系统长期运行。

其中,在内存分配器与线程的绑定时,函数:MemContext *get_mem_context();用于从当前线程结构中取出绑定在当前线程结构上的内存分配器。

函数:void set_mem_context(MemContext *);用于将一个内存分配器设置到当前的线程结构中,使之与当前线程相绑定。

绑定内存分配器到线程可以使当前线程在进行局部内存分配时,若不指定从哪个内存分配器分配内存,则从与当前线程相绑定的内在分配器中分配。

具体的,接口模块包括分配函数接口、重分配函数接口、释放函数接口、初始化分配器的函数接口、清除分配器函数接口。

具体的,临时内存分配器包括上级内存分配器、BIN内存分配器、堆叠式内存分配器和串接式内存分配器。其中,上级内存分配器,是用来表示整个内存管理系统的父类型内存,该功能是从操作系统处分配较大的内存区,然后由其它分配器进行分配,从父类型内存分配出去的内存称为子类型。所有的子类型内存的释放,都将归还给父类型内存。

BIN内存分配器,是用来提供分配较小内存区功能的。

堆叠式内存分配器,是用来根据用户需求的内存大小来自动选择分配的内存区的位置。

串接式内存分配器,是用来将小内存区融合成大内存区。

其中,临时内存分配器的部分实现代码如下:

/*上级内存分配器*/

struct MemContext *parent;

}MemContext;

/*BIN内存分配器(使用类型C语句中的堆内存分配算法)*/

typedef struct BinMemContext

{

void *(*__alloc)(struct MemContext *_this,size_t si);

void *(*__realloc)(struct MemContext *_this,void *p_old,size_t si);

void *(*__free)(struct MemContext *_this,void *p);

void *(*__reset)(struct MemContext *_this);

void *(*__clear)(struct MemContext *_this);

struct MemContext *parent;

mutex _mutex;

size_t step;

int max_b_i;

MemHeap table_stub;

MemHeap large_stub;

Chunk bins[127];

}BinMemContext;

typedef struct MemBlk{

struct MemBlk *next;

char mem[4]; /*实际为变长*/

}MemBlk;

/*堆叠式内存分配器(内存分配时向顶部增长,释放时忽略)*/

typedef struct BlkMemContext

{

void *(*__alloc)(struct MemContext *_this,size_t si);

void *(*__realloc)(struct MemContext *_this,void *p_old,size_t si);

void *(*__free)(struct MemContext *_this,void *p);

void *(*__reset)(struct MemContext *_this);

void *(*__clear)(struct MemContext *_this);

struct MemContext *parent;

mutex _mutex;

MemBlk *fir_mem_blk;

MemBlk *last_mem_blk;

int blk_size;

int alloc_count;

}BlkMemContext;

typedef struct MemPice

{

struct MemPice *prev;

struct MemPice *next;

}MemPice;

/*串接式内存分配器(将分配的内存串接在一起,以便统一释放)*/

typedef struct LinkMemContext

{

void *(*__alloc)(struct MemContext *_this,size_t si);

void *(*__realloc)(struct MemContext *_this,void *p_old,size_t si);

void *(*__free)(struct MemContext *_this,void *p);

void *(*__reset)(struct MemContext *_this);

void *(*__clear)(struct MemContext *_this);

struct MemContext *parent。

具体的,内存管理子系统还有一个重要功能就是:分隔不同用途的内存区域,内存区域包括字典内存区、会话内存区、锁资源内存区、任务内存区等等,在这些内存区域中的对象,有的生命期长、有的较短、有的极短,将其分隔有利于系统在经过长期运行后,其内存视图仍保持整洁、有序,同时也防止任务处理过程中某些错误程序对内存的破坏波及到整个系统,从而提高系统的稳定性。这些内存区可表示用户不同的内存使用场景。

本发明中,当一个处理过程的内存使用情况较为复杂时,可以创建一个临时内存分配器,并将其与当前线程相绑定,在过程结束时,释放临时的内存分配器,并还原线程的当前内存分配器。

一些复杂的结构自身也可以拥有自己的内存分配器,以便将其各级成员存贮在一起,同时,在结构释放是时,统一释放成员所占用的内存。

每个任务拥有自己的内存分配器,在任务执行前,线程将与该内存分配器绑定,执行期间,所有的未指定分配器的内存分配皆向该分配器中分配,这样,就允许任务函数对内存的释放操作不必过分仔细,当任务结束时,使用的内存将一并释放。

虽然,使用私有内存分配器可防止内存泄漏,但若在一个循环次数很多的处理过程中使用动态内存仍要注意用后要释放,否则,会使内存分配器的内存占用量大增从而造成无法分配内存。

以上显示和描述了本发明的基本原理和主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护的范围由所附的权利要求书及其等效物界定。

相关技术
  • 一种基于松散内存释放的内存管理系统
  • 一种基于安卓系统图片资源的内存释放方法
技术分类

06120112361594