一种恢复被破坏的空闲内存链表的方法

文档序号:6503372阅读:298来源:国知局
一种恢复被破坏的空闲内存链表的方法
【专利摘要】本发明公开了一种恢复被破坏的空闲内存链表的方法,其利用内存管理冗余信息恢复被破坏的空闲内存链表。该方法能够极大的减少了由于内存空闲链表破坏导致内存分配失败的情况。
【专利说明】一种恢复被破坏的空闲内存链表的方法

【技术领域】
[0001]本发明涉及操作系统领域,具体涉及一种恢复被破坏的空闲内存链表的方法。

【背景技术】
[0002]现有内存管理技术主要是针对内存碎片、内存泄漏、内存越界等问题,其方法主要是通过设置内存池、记录内存分配点、增加监测区域等,当出现内存使用错误时,根据记录的有关数据,便于跟踪和修复有关错误。
[0003]现有的这些方法对于解决单块内存使用错误有一定效果,但难以解决系统中维护空闲内存块的链表发生错误时,造成分配内存失败或错误的问题。
[0004]针对系统中维护空闲内存块的链表发生错误造成的问题,现有技术中通过在释放内存时做有效性检查,虽然这样可以避免释放错误内存导致空闲链表错误,但难以解决由其它情况引起的空闲内存链表错误,比如对没有进行初始化的指针赋值,导致错误的写了空闲链表。


【发明内容】

[0005]本发明针对内存空闲链表破坏导致内存分配失败,甚至引起设备异常的问题,而提供一种恢复被破坏的空闲内存链表的方法。该方法利用内存管理冗余信息来恢复被破坏的空闲内存链表,极大的减少了由于内存空闲链表破坏导致内存分配失败的情况。
[0006]为了达到上述目的,本发明采用如下的技术方案:
[0007]—种恢复被破坏的空闲内存链表的方法,所述方法利用内存管理冗余信息恢复被破坏的空闲内存链表。
[0008]在本发明的优选实例中,所述方法恢复被破坏的空闲内存链表的具体步骤如下:
[0009](I)形成所有空闲地址为连续的空闲内存链表,且空闲链表控制块记录空闲块的首地址、空闲块的大小和结束地址等信息;
[0010](2)从空闲内存链表分配地址时,检查空闲块是否有效;
[0011](3)检查到空闲块出现错误时,设置标志,表明此空闲内存链表出现错误,后续禁止从该链分配地址,并根据空闲链表控制块记录的空闲块首地址、空闲块大小和结束地址等冗余信息开始该内存链表的整理过程;
[0012](4)从空闲块的起始地址开始,把所有空闲的空闲块重新组成一空闲链表;
[0013](5)把在上述整理过程中释放的内存块组成另一空闲链表;
[0014](6)将上述两个链表合并,组成新的空闲内存链表;
[0015](7)处理结束,后续内存申请从新的链表中分配。
[0016]进一步的,所述步骤(I)中组成空闲内存链表的过程如下:
[0017](11)首先,根据链表中空闲块数目和每块大小及其链表控制块等冗余信息计算出此空闲链表需要的所有内存大小,并分配内存;
[0018](12)把分配内存的地址即空闲块的起始地址、结束地址、空闲块大小、数目等记录到链表控制快中,每个空闲块具有冗余头部,用来记录分配的地址、该块内存处于分配或空闲状态及下一块的指针,并初始化每块头部,所有空闲块组成空闲内存链表。
[0019]进一步的,所述步骤(6)把两个链表合并方法为将步骤(4)中形成的空闲链表插入到步骤(5)中空闲链表的尾部,形成一个新的空闲链表。
[0020]利用本发明提供的方案能够大大减少由于内存空闲链表破坏导致内存分配失败的情况,增强了系统的稳定性,并能及时的发现内存越界等错误。

【具体实施方式】
[0021]为了使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,下面进一步阐述本发明。
[0022]针对空闲内存链表破坏导致内存分配失败的问题,本发明利用内存管理冗余信息恢复被破坏的空闲内存链表,具体过程如下:
[0023]1、根据链表中空闲块数目和每块大小及其链表控制块等冗余信息计算出此空闲链表需要的所有内存大小,并分配内存;
[0024]2、把分配内存的地址即空闲块起始地址、结束地址、空闲块大小、数目、空闲内存链表的指针等记录到链表控制块中、设置标志位为正常状态(该标志位用来表明空闲链表分配过程中是否检查到异常,如有异常发生,则设置为异常状态),链表控制块记为C,每个空闲块具有冗余头部,用来记录分配的地址、状态标志位(表明该块内存处于分配或空闲状态)、下一空闲块的指针,初始化每块头部,所有空闲块组成空闲内存链表L,把L赋值于链表控制块C中的记录空闲链表指针的域;
[0025]3、组成的空闲内存链表进行内存分配时,检查链表控制块C中记录的空闲块数目是否为0,如果为0,表明本空闲链表已经全部分配出去,返回空指针,结束处理;否则从链表控制块C中得到空闲链表指针L,取L的首节点N,并检查其有效性,方法为查看N地址在不在链表控制块C中记录的起始地址和结束地址范围内,N地址与C中记录的起始地址之差是不是空闲块大小(空闲链表中所有空闲块大小都相同,其大小在链表控制块C中记录)的整数倍,检查成功,则设置节点N中的冗余头部中各域:记录分配内存地址、设置标志位为分配状态,并把节点N中记录的下一空闲块指针赋值于链表控制块C中的空闲链表指针域,把链表控制块C中记录的空闲块数目减1,此次内存分配成功,返回空闲块地址,记为F,结束处理;
[0026]4、上述检查失败,可能与节点N相邻的前一块内存P (P的状态可以是空闲态或是分配态)越界或其它(比如未初始化的指针赋值等)异常使用错误,日志提示错误,并把链表控制块C中指向空闲内存链表的指针赋值为空,空闲块数目设置为O(空闲块数目为O表示空闲链表已经全部被分配,没有可再使用的空闲块),以禁止继续从该链表分配地址。设置控制块C中的标志位为异常状态,表明此内存链表检查中遇到异常,需要做整理恢复空闲链表操作,并通知系统中内存恢复任务T (在系统初始化创建,其主要目的恢复系统中空闲链表)本链表出现异常;
[0027]5、当属于该空闲内存链表的内存块F释放时,如果链表控制块C中的标志位为正常状态,则把正在释放的内存块F插入空闲链表的尾部;否则表明空闲链表目前还处于异常状态,把内存块F释放在链表控制块C的另一条链表尾部(本链表只用于在空闲链表异常情况下,把需要释放的内存块组成新的链表,并把该链表标记为LI),设置内存块F的冗余头部信息:记录释放地址、设置状态标志位为空闲、下一空闲块指针为空,释放内存块F过程结束;
[0028]6、恢复任务T根据链表控制块C中记录的信息,开始该内存链表的整理恢复过程。具体过程为:(I)从链表控制块C中记录的起始地址开始,即第一个内存块记为first,检查该块头部状态标志位,如果为空闲状态,则把该块放入重整链表L2的尾部(本链表为内部变量,临时用来把整理恢复过程中检查到的空闲块组织成一个链表),否则如为分配状态则不做处理;(2):把内存块first与链表控制块C中记录的空闲块大小相加,得到下一内存块地址next,同理检查next的头部状态标志位,如果为空闲态,则加入重整链表L2的尾部,否则不做处理;(3)把next赋值于first,跳转到第2步处理,直到next地址大于等于控制链表C中记录的结束地址。
[0029]7、进入临界区;
[0030]8、将步骤6形成的空闲链表L2插入第5步中的链表LI尾部,形成新的空闲链表L,并赋值于链表控制块C中的空闲内存链表指针域,计算出空闲链表L中空闲块数目,并赋值于链表控制块C中空闲块数目域,设置链表控制块C中的标志位为正常状态;
[0031]9、退出临界区;
[0032]10、整个恢复处理过程结束,此后可对本空闲内存链表进行正常的分配和释放操作。
[0033]通过上述步骤,可快速的恢复被破坏的内存空闲链表,纠正了系统错误,提高了内存维护的可靠性,减少了设备发生异常的概率。
[0034]以上显示和描述了本发明的基本原理、主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。
【权利要求】
1.一种恢复被破坏的空闲内存链表的方法,其特征在于,所述方法利用内存管理冗余信息恢复被破坏的空闲内存链表。
2.根据权利要求1所述的一种恢复被破坏的空闲内存链表的方法,其特征在于,所述方法恢复被破坏的空闲内存链表的具体步骤如下: (1)形成所有空闲地址为连续的空闲内存链表,且空闲链表控制块记录空闲块的首地址、空闲块的大小和结束地址等信息; (2)从空闲内存链表分配地址时,检查空闲块是否有效; (3)检查到空闲块出现错误时,设置标志,表明此空闲内存链表出现错误,后续禁止从该链分配地址,并根据空闲链表控制块记录的空闲块首地址、空闲块大小和结束地址等冗余信息开始该内存链表的整理过程; (4)从空闲块的起始地址开始,把所有空闲的空闲块重新组成一空闲链表; (5)把在上述整理过程中释放的内存块组成另一空闲链表; (6)将上述两个链表合并,组成新的空闲内存链表; (7)处理结束,后续内存申请从新的链表中分配。
3.根据权利要求2所述的一种恢复被破坏的空闲内存链表的方法,其特征在于,所述步骤(I)中组成空闲内存链表的过程如下: (11)首先,根据链表中空闲块数目和每块大小及其链表控制块等冗余信息计算出此空闲链表需要的所有内存大小,并分配内存; (12)把分配内存的地址即空闲块的起始地址、结束地址、空闲块大小、数目等记录到链表控制快中,每个空闲块具有冗余头部,用来记录分配的地址、该块内存处于分配或空闲状态及下一块的指针,并初始化每块头部,所有空闲块组成空闲内存链表。
4.根据权利要求2所述的一种恢复被破坏的空闲内存链表的方法,其特征在于,所述步骤(6)链表合并方法为将步骤(4)形成的空闲链表插入到步骤(5)中空闲链表的尾部,形成一个新的空闲链表。
【文档编号】G06F11/08GK104182291SQ201310204921
【公开日】2014年12月3日 申请日期:2013年5月28日 优先权日:2013年5月28日
【发明者】汪革, 苟利平, 李俊盛, 刘基永, 于雯 申请人:上海博达数据通信有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1