一种内存碎片管理方法

文档序号:10612727阅读:591来源:国知局
一种内存碎片管理方法
【专利摘要】本发明提供一种内存碎片管理方法,包括:在系统运行过程中,根据内存分配请求对内存空间进行分配;对内存碎片化程度进行计算,判断计算结果是否超过预设阈值;若内存碎片化程度超过预设阈值,则对内存碎片进行搜集整理。本发明在内存分配的基础上,结合内存碎片化程度,对内存碎片进行搜集整理,提高了内存空间的利用率,有效减少内存碎片化,提高了内存运行稳定性。
【专利说明】一种内存碎片管理方法
[0001]
技术领域
[0002]本发明涉及计算机技术领域,具体是一种内存碎片管理方法。
[0003]
【背景技术】
[0004]软件程序在编制时无法完全确定所需要处理的数据量。程序中不可避免地会采用动态内存分配的方式获取内存并在不再需要使用时释放该内存。一般来说,运行时间内的内存分配是不可叠加的,内存分配在时间上是独立的,从而使得碎片问题难以解决。
[0005]内存分配程序浪费内存的基本方式有三种:额外开销、内部碎片和外部碎片。内存分配程序需要存储一些描述其分配状态的数据,如内存的起始位置、大小和所有权等,从而在分配内存时产生额外的开销。另外,内存分配程序需要遵循一些基本的内存分配规则,例如,所有的内存分配必须起始于可被4、8或16整除(视处理器体系结构而定)的地址,当某个客户请求一个43字节的内存块时,他可能会获得44字节、48字节甚至更多的字节,由所需大小四舍五入而产生的多余空间就叫内部碎片。当已分配内存块之间出现未被使用的差额时,就会产生外部碎片,例如,给一个应用程序分配三个连续的内存块,然后使中间的那个内存块被释放成为空闲内存,内存分配程序能重新分配该中间内存块给其他应用程序使用,但实际需要的内存块不太可能正好与该中间内存块一样大,从而产生外部碎片。
[0006]虽然额外开销和内部碎片会浪费内存,但外部碎片才会大量消耗内存。造成外部碎片的原因正是内存的分配管理方法。常规的内存分配算法有最先适合分配算法、时间共处算法和空间共处算法。
[0007]

【发明内容】

[0008]本发明的目的在于提供一种内存碎片管理方法,通过构建内存分配管理模型,针对内存计算中数据在内存中的存储方式、数据更新处理方式,采用最合适的内存分配策略及算法,使得内存在分配使用时减少碎片化的产生,最大化地利用内存。
[0009]本发明的技术方案为:
一种内存碎片管理方法,包括以下顺序的步骤:
(1)在系统运行过程中,根据内存分配请求对内存空间进行分配;
(2)对内存碎片化程度进行计算,判断计算结果是否超过预设阈值,若是,则执行步骤(3),若否,则返回步骤(I);
(3)对内存碎片进行搜集整理。
[0010]所述的内存碎片管理方法,所述步骤(I),包括以下步骤:
a、将内存分配池中不超过8K的内存块用chunk表示,并用Free list链表数组对所有chunk进行管理,超过8K的内存块用block表示,并用Block链表对所有block进行管理,判断内存分配请求所请求分配的内存容量是否超过8K,若是,则执行步骤b,若否,则执行步骤c;
b、为所述内存分配请求重新分配一个block,并将该block添加到Block链表中;
c、在Freelist链表数组中查找是否存在适合所述内存分配请求的chunk,若是,则将所述内存分配请求分配至该chunk,若否,则执行步骤d;
d、将所述内存分配请求所请求分配的内存容量与所有chunk的容量相加,得到需要分配的内存总容量,在Block链表中查找是否存在适合所述内存总容量的block,若是,则将所述内存分配请求和所有chunk分配至该block,若否,贝Ij为所述内存分配请求和所有chunk重新分配一个block,并将该block添加到Block链表中。
[0011]所述的内存碎片管理方法,所述步骤(2)中,所述对内存碎片化程度进行计算,采用以下公式:
P=1-(L/A)*T
其中,P表示内存碎片化程度,L表示最大空闲可分配内存块的大小,A表示全部空闲内存大小,T表示时间权重。
[0012]所述的内存碎片管理方法,所述步骤(3),包括以下步骤:
a、找出被管理内存始端与末端之间的各段空闲内存;
b、若某两段空闲内存之间在地址上是不连续的,但至少其中一段的容量不小于将其隔开的中间已用内存的容量,则将这两段空闲内存标记为相近的两段空闲内存;
若某两段空闲内存之间在地址上是连续的,则将这两段空闲内存标记为相邻的两段空闲内存;
C、对于相近的两段空闲内存,将中间已用内存的存储内容转存至其中一段空闲内存,将其中另一段空闲内存与中间已用内存释放得到的一段新的空闲内存标记为相邻的两段空闲内存;
d、对于相邻的两段空闲内存,将其整合成新的空闲内存块;
e、重复上述步骤,直至被管理内存始端与末端之间的所有相近或相邻的两段空闲内存均整理完毕。
[0013]由上述技术方案可知,本发明在内存分配的基础上,结合内存碎片化程度,对内存碎片进行搜集整理,提高了内存空间的利用率,有效减少内存碎片化,提高了内存运行稳定性。
[0014]
【附图说明】
[0015]图1是本发明的方法流程图;
图2是本发明的Freelist链表数组结构示意图;
图3是本发明的内存分配流程图。
[0016]
【具体实施方式】
[0017]下面结合附图和具体实施例进一步说明本发明。
[0018]如图1所示,一种内存碎片管理方法,包括以下步骤: S1、根据内存分配策略对内存分配请求进行内存空间分配;
定义内存分配请求为Req,内存分配池为Pool,Pool中不超过8K的内存块被称为chunk,以Freelist链表数组管理,大于8K的内存块被称为block,以Block链表管理。Freelist链表数组形式如图2所示。
[0019]内存分配策略如下:
首先判断Req有没有超过8K,没有的话就在Freelist链表数组中查找有没有可以使用的chunk,如果没有找到可以使用的chunk,就把该Req大小加上所有的chunk大小,在Block链表中查找有没有满足前述大小之和的可用block,如果没有,就重新分配一个block。如果Req超过了8K,就重新分配一个Req大小的block,将其加入Block链表中,如图3所示。
[0020]S2、根据内存碎片化程度计算方法得出系统运行时的内存碎片化程度,根据计算结果判断是否需要进行内存碎片搜集整理;
内存碎片化程度计算公式如下:
内存碎片化程度=1-空闲内存占有比例
假设最大空闲可分配内存块LARGEST_free_block的大小为L,全部空闲内存All_free_memory的大小为A,空闲内存占有比例为J,则有:
J=L/A
考虑内存碎片化程度跟时间有关联,所以上述公式需要追加时间权重T进行调整,调整后空闲内存占有比例的计算方法为:
J=(L/A)*T
假设内存碎片化程度为P,则内存碎片化程度计算公式如下:
P=1-J
当P值超过预设的阈值时,需要对内存碎片进行搜集整理。
[0021]S3、结合整理方法对内存碎片进行归纳管理;
定义四个指针:MSTART指向被管理内存的始端,MEND指向被管理内存的末尾,MBREAK指向MSTART与MEND之间的已用内存,PFREE指向MSTART与MEND之间的空闲内存。
[0022]更新PFREE和MBREAK指针,对MSTART与MEND之间的内存进行循环探询。根据PFREE和MBREAK指针位置判断MSTART与MEND之间的空闲内存是否邻近,若是,则将邻近的空闲内存连接在一起,即将其标记成一个空闲内存块。
[0023]本发明可应用于电力系统运营监测中心,提高了内存使用效率,提升了系统运行性能。
[0024]以上所述实施方式仅仅是对本发明的优选实施方式进行描述,并非对本发明的范围进行限定,在不脱离本发明设计精神的前提下,本领域普通技术人员对本发明的技术方案作出的各种变形和改进,均应落入本发明的权利要求书确定的保护范围内。
【主权项】
1.一种内存碎片管理方法,其特征在于,包括以下顺序的步骤: (1)在系统运行过程中,根据内存分配请求对内存空间进行分配; (2)对内存碎片化程度进行计算,判断计算结果是否超过预设阈值,若是,则执行步骤(3),若否,则返回步骤(I); (3 )对内存碎片进行搜集整理。2.根据权利要求1所述的内存碎片管理方法,其特征在于,所述步骤(I),包括以下步骤: a、将内存分配池中不超过8K的内存块用chunk表示,并用Freelist链表数组对所有chunk进行管理,超过8K的内存块用block表示,并用Block链表对所有block进行管理,判断内存分配请求所请求分配的内存容量是否超过8K,若是,则执行步骤b,若否,则执行步骤c; b、为所述内存分配请求重新分配一个block,并将该block添加到Block链表中; c、在FreeI i st链表数组中查找是否存在适合所述内存分配请求的chunk,若是,则将所述内存分配请求分配至该chunk,若否,则执行步骤d; d、将所述内存分配请求所请求分配的内存容量与所有chunk的容量相加,得到需要分配的内存总容量,在Block链表中查找是否存在适合所述内存总容量的block,若是,则将所述内存分配请求和所有chunk分配至该block,若否,贝Ij为所述内存分配请求和所有chunk重新分配一个block,并将该block添加到Block链表中。3.根据权利要求1所述的内存碎片管理方法,其特征在于,所述步骤(2)中,所述对内存碎片化程度进行计算,采用以下公式: P=1-(L/A)*T 其中,P表示内存碎片化程度,L表示最大空闲可分配内存块的大小,A表示全部空闲内存大小,T表示时间权重。4.根据权利要求1所述的内存碎片管理方法,其特征在于,所述步骤(3),包括以下步骤: a、找出被管理内存始端与末端之间的各段空闲内存; b、若某两段空闲内存之间在地址上是不连续的,但至少其中一段的容量不小于将其隔开的中间已用内存的容量,则将这两段空闲内存标记为相近的两段空闲内存; 若某两段空闲内存之间在地址上是连续的,则将这两段空闲内存标记为相邻的两段空闲内存; C、对于相近的两段空闲内存,将中间已用内存的存储内容转存至其中一段空闲内存,将其中另一段空闲内存与中间已用内存释放得到的一段新的空闲内存标记为相邻的两段空闲内存; d、对于相邻的两段空闲内存,将其整合成新的空闲内存块; e、重复上述步骤,直至被管理内存始端与末端之间的所有相近或相邻的两段空闲内存均整理完毕。
【文档编号】G06F12/02GK105975398SQ201510882915
【公开日】2016年9月28日
【申请日】2015年12月7日
【发明人】杨栋枢, 夏同飞, 陈 峰, 李志 , 徐海青, 范叶平, 孙飞, 刘才华, 石磊, 魏建国, 袁东, 王维佳, 王超, 郭振, 胡传胜, 乔雄
【申请人】国家电网公司, 南京南瑞集团公司, 国网江苏省电力公司信息通信分公司, 安徽继远软件有限公司, 国网信息通信产业集团有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1