一种内存管理方法及系统.pdf

上传人:b*** 文档编号:1304906 上传时间:2018-04-14 格式:PDF 页数:22 大小:1.23MB
返回 下载 相关 举报
摘要
申请专利号:

CN201611135850.8

申请日:

2016.12.09

公开号:

CN106681829A

公开日:

2017.05.17

当前法律状态:

实审

有效性:

审中

法律详情:

实质审查的生效IPC(主分类):G06F 9/50申请日:20161209|||公开

IPC分类号:

G06F9/50

主分类号:

G06F9/50

申请人:

上海斐讯数据通信技术有限公司

发明人:

王成长

地址:

201616 上海市松江区思贤路3666号

优先权:

专利代理机构:

上海硕力知识产权代理事务所 31251

代理人:

郭桂峰

PDF下载: PDF下载
内容摘要

本发明公开了一种内存管理方法,包括:内存申请方法:根据业务信息申请内存的需求,查找相应规格的内存空闲链表中是否存在空闲内存块,若是,则从内存空闲链表中移除一空闲内存块,否则,从内存空闲链表中移除一空闲内存块;向系统申请相应的空闲内存块;将空闲内存块分配给业务存储数据信息,并添加到业务所属的模块号的内存占用链表中;内存释放方法:将待释放的内存块从模块号的内存占用链表中移除;将内存块进行清空处理,还原至空闲内存块状态;根据内存块的大小,将内存块链接在相应规格的内存空闲链表中。此外,本发明还提供一种内存管理系统。通过本发明的方法及系统,避免了内存碎片的问题,提高了内存的申请释放效率。

权利要求书

1.一种内存管理方法,其特征在于,包括:
S10内存申请方法:
S110根据业务信息申请内存的需求,查找相应规格的内存空闲链表中是否存在空闲内
存块,若是,则进入步骤S120;否则,进入步骤S130;
S120从所述内存空闲链表中移除一空闲内存块,进入步骤S140;
S130向系统申请相应的空闲内存块;
S140将所述空闲内存块分配给业务存储数据信息,并添加到所述业务所属的模块号的
内存占用链表中;
S20内存释放方法:
S210将待释放的内存块从所述模块号的内存占用链表中移除;
S220将所述内存块进行清空处理,还原至空闲内存块状态;
S230根据所述内存块的大小,将所述内存块链接在相应规格的内存空闲链表中。
2.根据权利要求1所述的一种内存管理方法,其特征在于,包括:
S010进程启动时,先将内存初始化,并根据所述进程向系统申请一内存池;
S020根据所述进程,将所述内存池划分成不同规格的内存块组;同一内存块组中包含
若干大小相等的空闲内存块;所述内存块包括结构头、可存储区、和诊断尾;所述结构头和
诊断尾用于存储数据的相关信息,且所述结构头上存储有双向指针;
S030将同一内存块组的空闲内存块通过所述双向指针链接起来,形成所述规格的内存
空闲链表;
S040当所述进程中的模块号下的业务占用了内存块时,利用所述双向指针,将所述进
程中同一个模块号下已占用的内存块链接起来构成内存占用链表。
3.根据权利要求2所述的一种内存管理方法,其特征在于,还包括S30诊断方法:
S310查找相应模块号的内存占用链表;
S320遍历所述内存占用链表,判断所述内存占用链表中的内存块的结构头信息是否被
擦写,若是进入步骤S330;
S330判断所述内存块为坏块。
4.根据权利要求2所述的一种内存管理方法,其特征在于,
所述步骤S120包括步骤:
S121从所述内存空闲链表的头部或尾部移除所述空闲内存块;
所述步骤S140包括步骤:
S141根据所述业务信息,填充所述内存块的结构头和诊断尾信息,所述内存块的可存
储区用于给业务存储数据信息;
S142将所述内存块挂载在以所述业务所属的模块号为下标的内存占用链表头部或尾
部;
所述步骤S210包括:
S211根据待释放内存块的双向指针,在所述模块号的内存占用链表中找到所述待释放
内存块的前一内存块及后一内存块;
S212将所述待释放内存块从所述内存占用链表中移除;
S213将所述待释放内存块的前一内存块和后一内存块链接起来;
所述步骤S230包括:
S231根据所述内存块的大小,将所述内存块挂载在相应规格的内存空闲链表头部或尾
部。
5.根据权利要求2所述的一种内存管理方法,其特征在于,所述内存块的结构头,用于
存储双向指针、内存块的总大小、存储的数据标识位、及所属的模块号信息;
所述内存块的诊断尾,用于存储申请所述内存块的文件名、行号信息;
所述内存块的大小为2i,其中i为自然数。
6.一种内存管理系统,其特征在于,包括内存管理模块、查找模块、操作模块,所述内存
管理模块分别与所述查找模块、操作模块相连;其中:
当所述内存管理模块接收到内存申请时,根据业务信息申请内存的需求,通过所述查
找模块查找相应规格的内存空闲链表中是否存在空闲内存块,若是,则所述操作模块在所
述内存管理模块的控制下,从所述内存空闲链表中移除一空闲内存块,否则所述内存管理
模块向系统申请相应的空闲内存块;
所述内存管理模块将所述空闲内存块分配给业务存储数据信息,所述操作模块将所述
存储数据信息的内存块添加到所述业务所属的模块号的内存占用链表中;
当所述内存管理模块接收到内存释放申请时,所述操作模块在所述内存管理模块的控
制下,将待释放的内存块从所述模块号的内存占用链表中移除;并将所述内存块进行清空
处理,还原至空闲内存块状态;再根据所述内存块的大小,将所述内存块链接在相应规格的
内存空闲链表中。
7.根据权利要求6所述的一种内存管理系统,其特征在于,还包括初始化模块,内存空
间申请模块、内存空间划分模块;所述内存空间申请模块分别与所述初始化模块及所述内
存空间划分模块相连,且所述内存管理模块分别与所述内存空间申请模块、内存空间划分
模块相连,其中:
当进程启动时,所述初始模块将内存初始化,所述内存空间申请模块根据所述进程向
系统申请一内存池;
所述内存空间划分模块根据所述进程,将所述内存池划分成不同规格的内存块组;同
一内存块组中包含若干大小相等的空闲内存块;所述内存块包括结构头、可存储区、和诊断
尾;所述结构头和诊断尾用于存储数据的相关信息,且所述结构头上存储有双向指针;
所述内存管理模块将同一内存块组的空闲内存块通过所述双向指针链接起来,形成所
述规格的内存空闲链表;
当所述内存管理模块判断进程中的模块号下的业务占用了内存块时,所述内存管理模
块利用所述双向指针,将所述进程中同一个模块号下已占用的内存块链接起来构成内存占
用链表。
8.根据权利要求7所述的一种内存管理系统,其特征在于,还包括遍历判断模块,所述
遍历判断模块分别与所述查找模块及内存管理模块相连,其中:
所述查找模块查找相应模块号的内存占用链表;
所述遍历判断模块遍历所述内存占用链表,判断所述内存占用链表中的内存块的结构
头信息是否被擦写,若是,则判断所述内存块为坏块。
9.根据权利要求7所述的一种内存管理系统,其特征在于,
内存申请时:
所述操作模块在所述内存管理模块的控制下,从所述内存空闲链表中移除一空闲内存
块是指所述操作模块在所述内存管理模块的控制下,从所述内存空闲链表的头部或尾部移
除一空闲内存块;
所述内存管理模块将所述空闲内存块分配给业务存储数据信息,所述操作模块将所述
存储数据信息的内存块添加到所述业务所属的模块号下的内存占用链表中包括:所述内存
管理模块根据所述业务信息,填充所述内存块的结构头和诊断尾信息,所述内存块的可存
储区用于给业务存储数据信息;所述操作模块在所述内存管理模块的控制下将所述内存块
挂载在以所述业务所属的模块号为下标的内存占用链表头部或尾部;
内存释放时:
所述操作模块在所述内存管理模块的控制下,将待释放的内存块从所述模块号的内存
占用链表中移除包括:所述操作模块在所述内存管理模块的控制下,根据待释放内存块的
双向指针,在所述模块号的内存占用链表中找到所述待释放内存块的前一内存块及后一内
存块;所述操作模块将所述待释放内存块从所述内存占用链表中移除;所述操作模块将所
述待释放内存块的前一内存块和后一内存块链接起来;
所述操作模块根据所述内存块的大小,将所述内存块链接在相应规格的内存空闲链表
中是指所述操作模块根据所述内存块的大小,将所述内存块挂载在相应规格的内存空闲链
表头部或尾部。
10.根据权利要求7所述的一种内存管理系统,其特征在于,所述内存块的结构头,用于
存储双向指针、内存块的总大小、存储的数据标识位、及所属的模块号信息;
所述内存块的诊断尾,用于存储申请所述内存块的文件名、行号信息。
所述内存块的大小为2i,其中i为自然数。

说明书

一种内存管理方法及系统

技术领域

本发明涉及内存领域,尤其涉及一种内存管理方法及系统。

背景技术

在工业控制和嵌入式应用领域,对系统的实时性要求较高,由于系统的内存资源
是有限的,当应用软件占用内存过多时,系统的实时性就会降低,这可能给整个系统带来安
全隐患,因此,为了保证系统的实时性,必须控制应用系统内存的占用量,同时还必须实现
内存的快速申请和释放。

目前常用内存申请接口,是直接从系统堆中分配内存块,具体的,操作系统首先从
管理的内存中查找出大于所需内存大小的内存空间给用户,然后建立索引,并通过索引结
构管理这片分配给用户的内存,而查找合适的内存空间并建立索引是比较耗时的操作,且
由于用户每次申请的内存块大小不规律,并存在频繁的申请和释放,这样就会产生大量的
内存碎片,导致大块内存申请无法满足,从而会更多的占用系统资源。例如,现有的以
openwrt为框架的小型嵌入式系统中,没有单独去划分和管理内存,没有慎重考虑内存碎片
以及内存故障诊断问题。

发明内容

本发明提供一种内存管理方法及系统,用以解决现有技术中存在的内存申请与释
放速率低、内存碎片较多,出现内存故障也不容易定位等问题。

本发明方一种内存管理方法,包括:

S10内存申请方法:

S110根据业务信息申请内存的需求,查找相应规格的内存空闲链表中是否存在空
闲内存块,若是,则进入步骤S120;否则,进入步骤S130;

S120从所述内存空闲链表中移除一空闲内存块,进入步骤S140;

S130向系统申请相应的空闲内存块;

S140将所述空闲内存块分配给业务存储数据信息,并添加到所述业务所属的模块
号的内存占用链表中;

S20内存释放方法:

S210将待释放的内存块从所述模块号的内存占用链表中移除;

S220将所述内存块进行清空处理,还原至空闲内存块状态;

S230根据所述内存块的大小,将所述内存块链接在相应规格的内存空闲链表中。

通过多个空闲链表和内存占用链表,快速实现内存的申请与释放,且每一业务申
请对应分配一个内存块,避免了内存碎片的产生。

进一步的,还包括:

S010进程启动时,先将内存初始化,并根据所述进程向系统申请一内存池;

S020根据所述进程,将所述内存池划分成不同规格的内存块组;同一内存块组中
包含若干大小相等的空闲内存块;所述内存块包括结构头、可存储区、和诊断尾;所述结构
头和诊断尾用于存储数据的相关信息,且所述结构头上存储有双向指针;

S030将同一内存块组的空闲内存块通过所述双向指针链接起来,形成所述规格的
内存空闲链表;

S040当所述进程中的模块号下的业务占用了内存块时,利用所述双向指针,将所
述进程中同一个模块号下已占用的内存块链接起来构成内存占用链表。

根据具体的进程,预估内存的大小,然后申请预估大小的内存池,并根据具体进程
将内存池划分成内存块,相同规格大小的内存块属于同一个内存块组,同一内存块组中的
内存块链接成了一个空闲内存链表,也就是说,有多少种规格的内存块或者说内存块组,也
就有多少种相应的空闲内存链表。一个空闲内存链表中的空闲内存块大小相同,这样非常
便于内存申请时的分配与管理,处理起来高效而快速。

一个进程中有不同的模块号,每个模块号下有若干业务信息。而内存占用链表是
根据模块号来分组。一个进程下有多少个模块号,便对应了有多少个内存占用链表。同一个
模块号下的业务申请的内存块链接在一个内存占用链表中,使得管理起来容易,且出现问
题的话,更容易查找定位。

进一步的,还包括S30诊断方法:

S310查找相应模块号的内存占用链表;

S320遍历所述内存占用链表,判断所述内存占用链表中的内存块的结构头信息是
否被擦写,若是进入步骤S330;

S330判断所述内存块为坏块。

遍历内存占用链表,通过结构头的信息是否被擦写来判断该内存块是否是坏块,
或者通过结构头信息中的标注位是否被更改也可判断该内存块是否是坏块,如此,可快速
找到故障所在。另外,还可根据内存块的诊断尾存储的位置信息,快速索引到对应的申请位
置。

进一步的,所述步骤S120包括步骤:

S121从所述内存空闲链表的头部或尾部移除所述空闲内存块;

所述步骤S140包括步骤:

S141根据所述业务信息,填充所述内存块的结构头和诊断尾信息,所述内存块的
可存储区用于给业务存储数据信息;

S142将所述内存块挂载在以所述业务所属的模块号为下标的内存占用链表头部
或尾部;

所述步骤S210包括:

S211根据待释放内存块的双向指针,在所述模块号的内存占用链表中找到所述待
释放内存块的前一内存块及后一内存块;

S212将所述待释放内存块从所述内存占用链表中移除;

S213将所述待释放内存块的前一内存块和后一内存块链接起来;

所述步骤S230包括:

S231根据所述内存块的大小,将所述内存块挂载在相应规格的内存空闲链表头部
或尾部。

根据预设的规则,在链表中增加内存块时,挂载在该链表的头部或尾部,无需考虑
内存块的地址信息来插入链表,管理简单,快速。

同样的,在内存使用中,从空闲内存链表中移除空闲内存块时,也不需考虑地址问
题,直接从内存空闲链表的头部或尾部移除使用即可。

进一步的,所述内存块的结构头,用于存储双向指针、内存块的总大小、存储的数
据标识位、及所属的模块号信息;

所述内存块的诊断尾,用于存储申请所述内存块的文件名、行号信息。

所述内存块的大小为2i,其中i为自然数。

内存块的结构头和诊断尾存储了数据的相关信息,便于查找、判断和定位。

本发明还提供了一种内存管理系统,包括内存管理模块、查找模块、操作模块,所
述内存管理模块分别与所述查找模块、操作模块相连;其中:

当所述内存管理模块接收到内存申请时,根据业务信息申请内存的需求,通过所
述查找模块查找相应规格的内存空闲链表中是否存在空闲内存块,若是,则所述操作模块
在所述内存管理模块的控制下,从所述内存空闲链表中移除一空闲内存块,否则所述内存
管理模块向系统申请相应的空闲内存块;

所述内存管理模块将所述空闲内存块分配给业务存储数据信息,所述操作模块将
所述存储数据信息的内存块添加到所述业务所属的模块号的内存占用链表中;

当所述内存管理模块接收到内存释放申请时,所述操作模块在所述内存管理模块
的控制下,将待释放的内存块从所述模块号的内存占用链表中移除;并将所述内存块进行
清空处理,还原至空闲内存块状态;再根据所述内存块的大小,将所述内存块链接在相应规
格的内存空闲链表中。

通过本发明的系统,可快速申请内存和释放内存,且不会产生内存碎片。

进一步的,还包括初始化模块,内存空间申请模块、内存空间划分模块;所述内存
空间申请模块分别与所述初始化模块及所述内存空间划分模块相连,且所述内存管理模块
分别与所述内存空间申请模块、内存空间划分模块相连,其中:

当进程启动时,所述初始模块将内存初始化,所述内存空间申请模块根据所述进
程向系统申请一内存池;

所述内存空间划分模块根据所述进程,将所述内存池划分成不同规格的内存块
组;同一内存块组中包含若干大小相等的空闲内存块;所述内存块包括结构头、可存储区、
和诊断尾;所述结构头和诊断尾用于存储数据的相关信息,且所述结构头上存储有双向指
针;

所述内存管理模块将同一内存块组的空闲内存块通过所述双向指针链接起来,形
成所述规格的内存空闲链表;

当所述内存管理模块判断进程中的模块号下的业务占用了内存块时,所述内存管
理模块利用所述双向指针,将所述进程中同一个模块号下已占用的内存块链接起来构成内
存占用链表。

进一步的,还包括遍历判断模块,所述遍历判断模块分别与所述查找模块及内存
管理模块相连,其中:

所述查找模块查找相应模块号的内存占用链表;

所述遍历判断模块遍历所述内存占用链表,判断所述内存占用链表中的内存块的
结构头信息是否被擦写,若是,则判断所述内存块为坏块。

本系统还能够对内存块进行诊断,判断该内存块是否是坏块,根据坏块位置来对
内存故障进行定位。

进一步的,内存申请时:

所述操作模块在所述内存管理模块的控制下,从所述内存空闲链表中移除一空闲
内存块是指所述操作模块在所述内存管理模块的控制下,从所述内存空闲链表的头部或尾
部移除一空闲内存块;

所述内存管理模块将所述空闲内存块分配给业务存储数据信息,所述操作模块将
所述存储数据信息的内存块添加到所述业务所属的模块号下的内存占用链表中包括:所述
内存管理模块根据所述业务信息,填充所述内存块的结构头和诊断尾信息,所述内存块的
可存储区用于给业务存储数据信息;所述操作模块在所述内存管理模块的控制下将所述内
存块挂载在以所述业务所属的模块号为下标的内存占用链表头部或尾部;

内存释放时:

所述操作模块在所述内存管理模块的控制下,将待释放的内存块从所述模块号的
内存占用链表中移除包括:所述操作模块在所述内存管理模块的控制下,根据待释放内存
块的双向指针,在所述模块号的内存占用链表中找到所述待释放内存块的前一内存块及后
一内存块;所述操作模块将所述待释放内存块从所述内存占用链表中移除;所述操作模块
将所述待释放内存块的前一内存块和后一内存块链接起来;

所述操作模块根据所述内存块的大小,将所述内存块链接在相应规格的内存空闲
链表中是指所述操作模块根据所述内存块的大小,将所述内存块挂载在相应规格的内存空
闲链表头部或尾部。

进一步的,所述内存块的结构头,用于存储双向指针、内存块的总大小、存储的数
据标识位、及所属的模块号信息;

所述内存块的诊断尾,用于存储申请所述内存块的文件名、行号信息。

所述内存块的大小为2i,其中i为自然数。

本发明有益效果如下:

本发明提供的内存管理方法及系统,有效提高了内存申请与释放的效率,避免了
内存碎片的产生,增加了系统的稳定性。此外,通过本发明还能对故障进行诊断和定位。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使
用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本
领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其
他的附图。

图1a为本发明内存管理方法第一实施例中的内存申请方法流程图;

图1b为本发明内存管理方法第一实施例中的内存释放方法流程图;

图2为本发明内存管理方法第二实施例中的申请内存池,并进行划分管理方法流
程图;

图3a为本发明内存管理方法第四实施例中的内存申请方法流程图;

图3b为本发明内存管理方法第四实施例中的内存释放方法流程图;

图4为本发明内存管理方法另一实施例中的内存块结构示意图;

图5为本发明内存管理方法另一实施例中的内存桶示意图;

图6a为本发明内存管理方法另一实施例中的内存申请方法流程图;

图6b为本发明内存管理方法另一实施例中的内存释放方法流程图;

图6c为本发明内存管理方法另一实施例中的内存诊断方法流程图;

图7为本发明内存管理系统实施例结构框图。

具体实施方式

为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进
一步地详细描述,显然,所描述的实施例仅仅是本发明一部份实施例,而不是全部的实施
例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的
所有其它实施例,都属于本发明保护的范围。

本发明公开了一种内存管理方法,本方法第一实施例包括了申请方法和释放方
法,具体的:

S10内存申请方法,如图1a所示,包括:

S110根据业务信息申请内存的需求,查找相应规格的内存空闲链表中是否存在空
闲内存块,若是,则进入步骤S120;否则,进入步骤S130;

S120从所述内存空闲链表中移除一空闲内存块,进入步骤S140;

S130向系统申请相应的空闲内存块;

S140将所述空闲内存块分配给业务存储数据信息,并添加到所述业务所属的模块
号的内存占用链表中;

S20内存释放方法,如图1b所示,包括:

S210将待释放的内存块从所述模块号的内存占用链表中移除;

S220将所述内存块进行清空处理,还原至空闲内存块状态;

S230根据所述内存块的大小,将所述内存块链接在相应规格的内存空闲链表中。

通过多个内存空闲链表、进程下的不同模块号的内存占用链表来对内存进行统一
管理,将空闲内存块按照规格大小链接在相应规格的内存空闲链表中,内存申请时,只需根
据业务信息申请内存的大小,快速找到大于或等于该申请内存大小,且最接近该申请内存
大小的内存块组,从内存块组所在的内存空闲链表中将一空闲内存块移除,用于存储该业
务数据信息,该内存块被占用后,再根据存储的业务所属的模块号,将该内存块添加到该模
块号的内存占用链表中。内存释放时,则将待释放的内存块从内存占用链表中移除,清空还
原处理后再添加到相应的内存空闲链表中即可。通过内存空闲链表和内存占用链表来管理
内存块,避免内存碎片问题,提升内存处理的效率和准确性。

本发明方法的第二实施例,在上述内存申请与释放管理之前,系统启动时,需根据
进程申请内存池,并进行划分管理,具体的,如图2所示,包括步骤:

S010进程启动时,先将内存初始化,并根据所述进程向系统申请一内存池;

S020根据所述进程,将所述内存池划分成不同规格的内存块组;同一内存块组中
包含若干大小相等的空闲内存块;所述内存块包括结构头、可存储区、和诊断尾;所述结构
头和诊断尾用于存储数据的相关信息,且所述结构头上存储有双向指针;

S030将同一内存块组的空闲内存块通过所述双向指针链接起来,形成所述规格的
内存空闲链表;

S040当所述进程中的模块号下的业务占用了内存块时,利用所述双向指针,将所
述进程中同一个模块号下已占用的内存块链接起来构成内存占用链表。

以进程为基本单位,每一进程申请一内存池,内存池中地址是连续的,当然内存池
的大小是根据这个进程预估得出的,一般不会出现不够用的情况。获取内存池后再根据进
程进行预估,将内存池划分成不同规格的内存块组,每一个内存块组中有许多大小相同的
内存块。例如,32K的内存块组中所含的内存块均为32K大小;64K的内存块组中所含的内存
块均为64K大小。而每一个内存块中又划分出了结构头、诊断尾和中间部分的可存储区;其
中结构头和诊断尾用于存储业务数据的相关信息,比如存储的文件名、数据大小、标识位、
申请信息所处的行号等等;可存储区用于存储具体的数据信息;结构头中还存储有双向指
针,通过内存块的双向指针链接起来的链表中,内存块中的双向指针分别指向与之相连的
后一内存块和前一内存块。所以,从该链表的任意一个内存块开始,都可以很方便地访问它
的前一内存块和后一内存块。内存占用链表是以模块号来划分的,同一个进程下有许多不
同的模块号,不同的模块号下有许多的的业务请求,每一个业务请求会分配一个空闲内存
块,属于同一个模块下的业务请求获取的内存块会通过双向指针链接在一起,构成该模块
的内存占用链表。

本发明内存管理方法的第三实施例,在上述实施例的基础上,还包括诊断方法,具
体的,包括:

S310查找相应模块号的内存占用链表;

S320遍历所述内存占用链表,判断所述内存占用链表中的内存块的结构头信息是
否被擦写,若是进入步骤S330;

S330判断所述内存块为坏块。

每一个内存块的结构头部分均存储有数据的相关信息,比如申请文件大小、名称、
标识位等,如果占用链表中的某个内存块的结构头信息被擦写了,很可能是前一内存块的
数据溢出了,从而擦写了后一内存块的结构头信息,那么只需要查看内存块的结构头信息
部分,即可判断是否被占用了,如果被占用,那么就判断这个内存块为坏块,同时也可以查
找到相应的数据溢出的内存块所处的位置,便于后续处理。如果结构头中存储有标识位,也
可以查看结构头的标识位是否改变来判断是否为坏块。本实施例提供的内存诊断方法,是
一种内存故障定位的简单有效手段。

本发明的内存管理方法第四实施例,在上述第二实施例的基础上,其内存申请方
法,如图3a所示,包括:

S110根据业务信息申请内存的需求,查找相应规格的内存空闲链表中是否存在空
闲内存块,若是,则进入步骤S120;否则,进入步骤S130

S121从所述内存空闲链表的头部或尾部移除所述空闲内存块;

S130向系统申请相应的空闲内存块;

S141根据所述业务信息,填充所述内存块的结构头和诊断尾信息,所述内存块的
可存储区用于给业务存储数据信息;

S142将所述内存块挂载在以所述业务所属的模块号为下标的内存占用链表头部
或尾部;

内存释放方法,如图3b所示,包括:

所述步骤S210包括:

S211根据待释放内存块的双向指针,在所述模块号的内存占用链表中找到所述待
释放内存块的前一内存块及后一内存块;

S212将所述待释放内存块从所述内存占用链表中移除;

S213将所述待释放内存块的前一内存块和后一内存块链接起来;

S220将所述内存块进行清空处理,还原至空闲内存块状态;

S231根据所述内存块的大小,将所述内存块挂载在相应规格的内存空闲链表头部
或尾部。

空闲内存链表中空闲内存块的移除,可根据预设规则,从空闲内存链表的头部或
尾部移除空闲内存块;而内存块被释放后,也可根据预设规则,挂载在空闲内存链表的头部
或尾部;

同样的,添加在占用内存链表中的内存块,也可根据预设规则,挂载在内存占用链
表的头部或尾部。

如此,操作起来简单而快速,提高了内存管理效率。

较佳的,在上述任一实施例的基础上,所述内存块的结构头,用于存储双向指针、
内存块的总大小、存储的数据标识位、及所属的模块号信息;

所述内存块的诊断尾,用于存储申请所述内存块的文件名、行号信息。

所述内存块的大小为2i,其中i为自然数。

内存块的结构示意图如图4所示,其中结构头A中包括双向指针、当前内存块总大
小,标志位,属于哪个模块等信息;可存储区B用于存储具体的业务数据,大小是以2的幂为
基数大小;诊断尾C中包括申请当前内存块结构的文件名,以及行号等诊断信息。所述诊断
尾中存储的行号信息,是指申请的文件/业务在系统程序中的具体位置信息,因此,可通过
该诊断尾信息快速定位到程序中的具体申请位置,便于后续的诊断查找和修复。

本发明方法的另一实施例,以openwrt为框架的小型嵌入式系统中,在进程启动
时,申请大块内存池进行重划分与管理,把内存切分成固定大小的块结构,具体大小以2的
幂为基数,增加内存结构头,诊断尾;增加内存分配链表以及空闲链表,申请与释放内存时
只需移动指针位置。既避免了内存碎片的问题,又提高了内存的申请释放效率,同时增加了
调试诊断的接口。

进程启动时,先内存初始化,预先从系统堆中申请大块内存池,然后把该池切分成
内存块结构,相同大小的内存块属于同一个内存桶,如图5所示;通过内存头结构中的双向
指针把所有内存块连接起来,形成内存空闲链表。每个固定大小的内存桶有一个内存空闲
链表结构。

在申请内存时,从空闲链表移除内存块给用户,并增加该内存块到内存占用链表,
然后更新想统计和诊断信息,具体的,如图6a所示。

释放内存时,把该内存块从占用链表中移除,并还回到空闲链表,然后更新想统计
和诊断信息,具体的,如图6b所示。

此外,还提供接口,供内存诊断使用,诊断流程如图6c所示。

本实施例采用预分配内存桶的方法,增加内存头和诊断尾,利用空闲链表和占用
链表对内存块进行统一管理。该方法可以很好的避免内存碎片问题,提升内存处理的效率
和准确性,增加了内存故障定位的简单有效手段。

基于相同的技术构思,本发明实施例还提供一种内存管理系统,该系统可执行上
述方法实施例。本发明实施例提供的系统如图7所示。包括内存管理模块10、查找模块20、操
作模块30,所述内存管理模块10分别与所述查找模块20、操作模块30相连;其中:

当所述内存管理模块10接收到内存申请时,根据业务信息申请内存的需求,通过
所述查找模块20查找相应规格的内存空闲链表中是否存在空闲内存块,若是,则所述操作
模块30在所述内存管理模块10的控制下,从所述内存空闲链表中移除一空闲内存块,否则
所述内存管理模块10向系统申请相应的空闲内存块;

所述内存管理模块10将所述空闲内存块分配给业务存储数据信息,所述操作模块
30将所述存储数据信息的内存块添加到所述业务所属的模块号的内存占用链表中;

当所述内存管理模块10接收到内存释放申请时,所述操作模块30在所述内存管理
模块10的控制下,将待释放的内存块从所述模块号的内存占用链表中移除;并将所述内存
块进行清空处理,还原至空闲内存块状态;再根据所述内存块的大小,将所述内存块链接在
相应规格的内存空闲链表中。

比如空闲内存链表的规格有16字节、32字节、64字节、128字节等若干规格,当进程
中的某个模块号下的一个业务申请54字节大小的内存时,内存管理模块10根据申请的内存
大小54字节,从大于或等于54字节,且最接近的空闲内存链表中查找空闲内存块来分配给
该业务。因此,管理模块会从规格为64的空闲内存链表中移除一内存块给该业务。规格为64
字节的空闲内存链表中,所有的内存块均为64字节大小。而内存占用链表是以模块号来分
组的,同一模块号的内存占用链表中占用的内存块大小不一定相等,但都属于同一个进程
中的同一个模块号。由于每一个业务申请分配一个内存块,内存块释放后又会挂载到相应
规格的空闲内存链表中,因此不会产生内存碎片的问题,都可使用。

本发明的内存管理系统,操作简单,避免内存碎片问题,提升内存处理的效率和准
确性。

本发明内存管理系统的另一实施例,在上述实施例的基础上,还包括初始化模块
40,内存空间申请模块50、内存空间划分模块60;所述内存空间申请模块50分别与所述初始
化模块40及所述内存空间划分模块60相连,且所述内存管理模块10分别与所述内存空间申
请模块50、内存空间划分模块60相连,其中:

当进程启动时,所述初始模块将内存初始化,所述内存空间申请模块50根据所述
进程向系统申请一内存池;

所述内存空间划分模块60根据所述进程,将所述内存池划分成不同规格的内存块
组;同一内存块组中包含若干大小相等的空闲内存块;所述内存块包括结构头、可存储区、
和诊断尾;所述结构头和诊断尾用于存储数据的相关信息,且所述结构头上存储有双向指
针;

所述内存管理模块10将同一内存块组的空闲内存块通过所述双向指针链接起来,
形成所述规格的内存空闲链表;

当所述内存管理模块10判断进程中的模块号下的业务占用了内存块时,所述内存
管理模块10利用所述双向指针,将所述进程中同一个模块号下已占用的内存块链接起来构
成内存占用链表。

申请的内存池由于已被初始化,因此划分成内存块后,内存申请时可快速分配使
用。

内存池大小的申请及内存块的划分是根据进程预估的,因此在该进程后续的内存
使用中较为便捷,适用,相当于为该进程量身定制。不同的进程申请的内存池大小不同,划
分也不同,通过预估,可获得这个进程的大概适用内存大小,一方面避免了内存的浪费,另
一方面降低了内存不足的概率。一般情况下内存块组中的空闲内存块不会出现短缺现象,
如果万一使用时该规格的内存块没有了的话,可再像系统申请,或者也可向数量较多的大
于该内存的内存块申请使用。

空闲内存链表和占用内存链表的创建,大大提高了内存管理的有效性,准确性,也
避免了内存碎片的问题。

较佳的,在上述实施例的基础上还包括遍历判断模块70,所述遍历判断模块70分
别与所述查找模块20及内存管理模块10相连,其中:

所述查找模块20查找相应模块号的内存占用链表;

所述遍历判断模块70遍历所述内存占用链表,判断所述内存占用链表中的内存块
的结构头信息是否被擦写,若是,则判断所述内存块为坏块。

内存块的结构头或诊断尾部分可为内存诊断提供依据。通过内存块的结构头信息
判断内存块为坏块后,可再根据诊断尾信息,查找到该内存块的相关信息,比如申请该内存
块的位置等。

本发明系统的另一实施例,在上述实施例的基础上,在内存申请时:

所述操作模块30在所述内存管理模块10的控制下,从所述内存空闲链表中移除一
空闲内存块是指所述操作模块30在所述内存管理模块10的控制下,从所述内存空闲链表的
头部或尾部移除一空闲内存块;

所述内存管理模块10将所述空闲内存块分配给业务存储数据信息,所述操作模块
30将所述存储数据信息的内存块添加到所述业务所属的模块号下的内存占用链表中包括:
所述内存管理模块10根据所述业务信息,填充所述内存块的结构头和诊断尾信息,所述内
存块的可存储区用于给业务存储数据信息;所述操作模块30在所述内存管理模块10的控制
下将所述内存块挂载在以所述业务所属的模块号为下标的内存占用链表头部或尾部;

在内存释放时:

所述操作模块30在所述内存管理模块10的控制下,将待释放的内存块从所述模块
号的内存占用链表中移除包括:所述操作模块30在所述内存管理模块10的控制下,根据待
释放内存块的双向指针,在所述模块号的内存占用链表中找到所述待释放内存块的前一内
存块及后一内存块;所述操作模块30将所述待释放内存块从所述内存占用链表中移除;所
述操作模块30将所述待释放内存块的前一内存块和后一内存块链接起来;

所述操作模块30根据所述内存块的大小,将所述内存块链接在相应规格的内存空
闲链表中是指所述操作模块30根据所述内存块的大小,将所述内存块挂载在相应规格的内
存空闲链表头部或尾部。

链表中内存块添加均可根据预设规则,挂载在链表的头部或尾部,不用根据内存
块的地址来插入链表中间的相应位置,简单而便捷。

空闲链表中的内存块使用也是如此,根据预设规则,从空闲内存链表的头部或尾
部移除即可,使得内存申请更为高效。

较佳的,在上述实施例的基础上,所述内存块的结构头,用于存储双向指针、内存
块的总大小、存储的数据标识位、及所属的模块号信息;

所述内存块的诊断尾,用于存储申请所述内存块的文件名、行号信息。

所述内存块的大小为2i,其中i为自然数。

尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造
性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优
选实施例以及落入本发明范围的所有变更和修改。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精
神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围
之内,则本发明也意图包含这些改动和变型在内。

一种内存管理方法及系统.pdf_第1页
第1页 / 共22页
一种内存管理方法及系统.pdf_第2页
第2页 / 共22页
一种内存管理方法及系统.pdf_第3页
第3页 / 共22页
点击查看更多>>
资源描述

《一种内存管理方法及系统.pdf》由会员分享,可在线阅读,更多相关《一种内存管理方法及系统.pdf(22页珍藏版)》请在专利查询网上搜索。

本发明公开了一种内存管理方法,包括:内存申请方法:根据业务信息申请内存的需求,查找相应规格的内存空闲链表中是否存在空闲内存块,若是,则从内存空闲链表中移除一空闲内存块,否则,从内存空闲链表中移除一空闲内存块;向系统申请相应的空闲内存块;将空闲内存块分配给业务存储数据信息,并添加到业务所属的模块号的内存占用链表中;内存释放方法:将待释放的内存块从模块号的内存占用链表中移除;将内存块进行清空处理,还原。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1