一種恢復(fù)被破壞的空閑內(nèi)存鏈表的方法
【專(zhuān)利摘要】本發(fā)明公開(kāi)了一種恢復(fù)被破壞的空閑內(nèi)存鏈表的方法,其利用內(nèi)存管理冗余信息恢復(fù)被破壞的空閑內(nèi)存鏈表。該方法能夠極大的減少了由于內(nèi)存空閑鏈表破壞導(dǎo)致內(nèi)存分配失敗的情況。
【專(zhuān)利說(shuō)明】一種恢復(fù)被破壞的空閑內(nèi)存鏈表的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及操作系統(tǒng)領(lǐng)域,具體涉及一種恢復(fù)被破壞的空閑內(nèi)存鏈表的方法。
【背景技術(shù)】
[0002]現(xiàn)有內(nèi)存管理技術(shù)主要是針對(duì)內(nèi)存碎片、內(nèi)存泄漏、內(nèi)存越界等問(wèn)題,其方法主要是通過(guò)設(shè)置內(nèi)存池、記錄內(nèi)存分配點(diǎn)、增加監(jiān)測(cè)區(qū)域等,當(dāng)出現(xiàn)內(nèi)存使用錯(cuò)誤時(shí),根據(jù)記錄的有關(guān)數(shù)據(jù),便于跟蹤和修復(fù)有關(guān)錯(cuò)誤。
[0003]現(xiàn)有的這些方法對(duì)于解決單塊內(nèi)存使用錯(cuò)誤有一定效果,但難以解決系統(tǒng)中維護(hù)空閑內(nèi)存塊的鏈表發(fā)生錯(cuò)誤時(shí),造成分配內(nèi)存失敗或錯(cuò)誤的問(wèn)題。
[0004]針對(duì)系統(tǒng)中維護(hù)空閑內(nèi)存塊的鏈表發(fā)生錯(cuò)誤造成的問(wèn)題,現(xiàn)有技術(shù)中通過(guò)在釋放內(nèi)存時(shí)做有效性檢查,雖然這樣可以避免釋放錯(cuò)誤內(nèi)存導(dǎo)致空閑鏈表錯(cuò)誤,但難以解決由其它情況引起的空閑內(nèi)存鏈表錯(cuò)誤,比如對(duì)沒(méi)有進(jìn)行初始化的指針賦值,導(dǎo)致錯(cuò)誤的寫(xiě)了空閑鏈表。
【發(fā)明內(nèi)容】
[0005]本發(fā)明針對(duì)內(nèi)存空閑鏈表破壞導(dǎo)致內(nèi)存分配失敗,甚至引起設(shè)備異常的問(wèn)題,而提供一種恢復(fù)被破壞的空閑內(nèi)存鏈表的方法。該方法利用內(nèi)存管理冗余信息來(lái)恢復(fù)被破壞的空閑內(nèi)存鏈表,極大的減少了由于內(nèi)存空閑鏈表破壞導(dǎo)致內(nèi)存分配失敗的情況。
[0006]為了達(dá)到上述目的,本發(fā)明采用如下的技術(shù)方案:
[0007]—種恢復(fù)被破壞的空閑內(nèi)存鏈表的方法,所述方法利用內(nèi)存管理冗余信息恢復(fù)被破壞的空閑內(nèi)存鏈表。
[0008]在本發(fā)明的優(yōu)選實(shí)例中,所述方法恢復(fù)被破壞的空閑內(nèi)存鏈表的具體步驟如下:
[0009](I)形成所有空閑地址為連續(xù)的空閑內(nèi)存鏈表,且空閑鏈表控制塊記錄空閑塊的首地址、空閑塊的大小和結(jié)束地址等信息;
[0010](2)從空閑內(nèi)存鏈表分配地址時(shí),檢查空閑塊是否有效;
[0011](3)檢查到空閑塊出現(xiàn)錯(cuò)誤時(shí),設(shè)置標(biāo)志,表明此空閑內(nèi)存鏈表出現(xiàn)錯(cuò)誤,后續(xù)禁止從該鏈分配地址,并根據(jù)空閑鏈表控制塊記錄的空閑塊首地址、空閑塊大小和結(jié)束地址等冗余信息開(kāi)始該內(nèi)存鏈表的整理過(guò)程;
[0012](4)從空閑塊的起始地址開(kāi)始,把所有空閑的空閑塊重新組成一空閑鏈表;
[0013](5)把在上述整理過(guò)程中釋放的內(nèi)存塊組成另一空閑鏈表;
[0014](6)將上述兩個(gè)鏈表合并,組成新的空閑內(nèi)存鏈表;
[0015](7)處理結(jié)束,后續(xù)內(nèi)存申請(qǐng)從新的鏈表中分配。
[0016]進(jìn)一步的,所述步驟(I)中組成空閑內(nèi)存鏈表的過(guò)程如下:
[0017](11)首先,根據(jù)鏈表中空閑塊數(shù)目和每塊大小及其鏈表控制塊等冗余信息計(jì)算出此空閑鏈表需要的所有內(nèi)存大小,并分配內(nèi)存;
[0018](12)把分配內(nèi)存的地址即空閑塊的起始地址、結(jié)束地址、空閑塊大小、數(shù)目等記錄到鏈表控制快中,每個(gè)空閑塊具有冗余頭部,用來(lái)記錄分配的地址、該塊內(nèi)存處于分配或空閑狀態(tài)及下一塊的指針,并初始化每塊頭部,所有空閑塊組成空閑內(nèi)存鏈表。
[0019]進(jìn)一步的,所述步驟(6)把兩個(gè)鏈表合并方法為將步驟(4)中形成的空閑鏈表插入到步驟(5)中空閑鏈表的尾部,形成一個(gè)新的空閑鏈表。
[0020]利用本發(fā)明提供的方案能夠大大減少由于內(nèi)存空閑鏈表破壞導(dǎo)致內(nèi)存分配失敗的情況,增強(qiáng)了系統(tǒng)的穩(wěn)定性,并能及時(shí)的發(fā)現(xiàn)內(nèi)存越界等錯(cuò)誤。
【具體實(shí)施方式】
[0021]為了使本發(fā)明實(shí)現(xiàn)的技術(shù)手段、創(chuàng)作特征、達(dá)成目的與功效易于明白了解,下面進(jìn)一步闡述本發(fā)明。
[0022]針對(duì)空閑內(nèi)存鏈表破壞導(dǎo)致內(nèi)存分配失敗的問(wèn)題,本發(fā)明利用內(nèi)存管理冗余信息恢復(fù)被破壞的空閑內(nèi)存鏈表,具體過(guò)程如下:
[0023]1、根據(jù)鏈表中空閑塊數(shù)目和每塊大小及其鏈表控制塊等冗余信息計(jì)算出此空閑鏈表需要的所有內(nèi)存大小,并分配內(nèi)存;
[0024]2、把分配內(nèi)存的地址即空閑塊起始地址、結(jié)束地址、空閑塊大小、數(shù)目、空閑內(nèi)存鏈表的指針等記錄到鏈表控制塊中、設(shè)置標(biāo)志位為正常狀態(tài)(該標(biāo)志位用來(lái)表明空閑鏈表分配過(guò)程中是否檢查到異常,如有異常發(fā)生,則設(shè)置為異常狀態(tài)),鏈表控制塊記為C,每個(gè)空閑塊具有冗余頭部,用來(lái)記錄分配的地址、狀態(tài)標(biāo)志位(表明該塊內(nèi)存處于分配或空閑狀態(tài))、下一空閑塊的指針,初始化每塊頭部,所有空閑塊組成空閑內(nèi)存鏈表L,把L賦值于鏈表控制塊C中的記錄空閑鏈表指針的域;
[0025]3、組成的空閑內(nèi)存鏈表進(jìn)行內(nèi)存分配時(shí),檢查鏈表控制塊C中記錄的空閑塊數(shù)目是否為0,如果為0,表明本空閑鏈表已經(jīng)全部分配出去,返回空指針,結(jié)束處理;否則從鏈表控制塊C中得到空閑鏈表指針L,取L的首節(jié)點(diǎn)N,并檢查其有效性,方法為查看N地址在不在鏈表控制塊C中記錄的起始地址和結(jié)束地址范圍內(nèi),N地址與C中記錄的起始地址之差是不是空閑塊大小(空閑鏈表中所有空閑塊大小都相同,其大小在鏈表控制塊C中記錄)的整數(shù)倍,檢查成功,則設(shè)置節(jié)點(diǎn)N中的冗余頭部中各域:記錄分配內(nèi)存地址、設(shè)置標(biāo)志位為分配狀態(tài),并把節(jié)點(diǎn)N中記錄的下一空閑塊指針賦值于鏈表控制塊C中的空閑鏈表指針域,把鏈表控制塊C中記錄的空閑塊數(shù)目減1,此次內(nèi)存分配成功,返回空閑塊地址,記為F,結(jié)束處理;
[0026]4、上述檢查失敗,可能與節(jié)點(diǎn)N相鄰的前一塊內(nèi)存P (P的狀態(tài)可以是空閑態(tài)或是分配態(tài))越界或其它(比如未初始化的指針賦值等)異常使用錯(cuò)誤,日志提示錯(cuò)誤,并把鏈表控制塊C中指向空閑內(nèi)存鏈表的指針賦值為空,空閑塊數(shù)目設(shè)置為O(空閑塊數(shù)目為O表示空閑鏈表已經(jīng)全部被分配,沒(méi)有可再使用的空閑塊),以禁止繼續(xù)從該鏈表分配地址。設(shè)置控制塊C中的標(biāo)志位為異常狀態(tài),表明此內(nèi)存鏈表檢查中遇到異常,需要做整理恢復(fù)空閑鏈表操作,并通知系統(tǒng)中內(nèi)存恢復(fù)任務(wù)T (在系統(tǒng)初始化創(chuàng)建,其主要目的恢復(fù)系統(tǒng)中空閑鏈表)本鏈表出現(xiàn)異常;
[0027]5、當(dāng)屬于該空閑內(nèi)存鏈表的內(nèi)存塊F釋放時(shí),如果鏈表控制塊C中的標(biāo)志位為正常狀態(tài),則把正在釋放的內(nèi)存塊F插入空閑鏈表的尾部;否則表明空閑鏈表目前還處于異常狀態(tài),把內(nèi)存塊F釋放在鏈表控制塊C的另一條鏈表尾部(本鏈表只用于在空閑鏈表異常情況下,把需要釋放的內(nèi)存塊組成新的鏈表,并把該鏈表標(biāo)記為L(zhǎng)I),設(shè)置內(nèi)存塊F的冗余頭部信息:記錄釋放地址、設(shè)置狀態(tài)標(biāo)志位為空閑、下一空閑塊指針為空,釋放內(nèi)存塊F過(guò)程結(jié)束;
[0028]6、恢復(fù)任務(wù)T根據(jù)鏈表控制塊C中記錄的信息,開(kāi)始該內(nèi)存鏈表的整理恢復(fù)過(guò)程。具體過(guò)程為:(I)從鏈表控制塊C中記錄的起始地址開(kāi)始,即第一個(gè)內(nèi)存塊記為first,檢查該塊頭部狀態(tài)標(biāo)志位,如果為空閑狀態(tài),則把該塊放入重整鏈表L2的尾部(本鏈表為內(nèi)部變量,臨時(shí)用來(lái)把整理恢復(fù)過(guò)程中檢查到的空閑塊組織成一個(gè)鏈表),否則如為分配狀態(tài)則不做處理;(2):把內(nèi)存塊first與鏈表控制塊C中記錄的空閑塊大小相加,得到下一內(nèi)存塊地址next,同理檢查next的頭部狀態(tài)標(biāo)志位,如果為空閑態(tài),則加入重整鏈表L2的尾部,否則不做處理;(3)把next賦值于first,跳轉(zhuǎn)到第2步處理,直到next地址大于等于控制鏈表C中記錄的結(jié)束地址。
[0029]7、進(jìn)入臨界區(qū);
[0030]8、將步驟6形成的空閑鏈表L2插入第5步中的鏈表LI尾部,形成新的空閑鏈表L,并賦值于鏈表控制塊C中的空閑內(nèi)存鏈表指針域,計(jì)算出空閑鏈表L中空閑塊數(shù)目,并賦值于鏈表控制塊C中空閑塊數(shù)目域,設(shè)置鏈表控制塊C中的標(biāo)志位為正常狀態(tài);
[0031]9、退出臨界區(qū);
[0032]10、整個(gè)恢復(fù)處理過(guò)程結(jié)束,此后可對(duì)本空閑內(nèi)存鏈表進(jìn)行正常的分配和釋放操作。
[0033]通過(guò)上述步驟,可快速的恢復(fù)被破壞的內(nèi)存空閑鏈表,糾正了系統(tǒng)錯(cuò)誤,提高了內(nèi)存維護(hù)的可靠性,減少了設(shè)備發(fā)生異常的概率。
[0034]以上顯示和描述了本發(fā)明的基本原理、主要特征和本發(fā)明的優(yōu)點(diǎn)。本行業(yè)的技術(shù)人員應(yīng)該了解,本發(fā)明不受上述實(shí)施例的限制,上述實(shí)施例和說(shuō)明書(shū)中描述的只是說(shuō)明本發(fā)明的原理,在不脫離本發(fā)明精神和范圍的前提下,本發(fā)明還會(huì)有各種變化和改進(jìn),這些變化和改進(jìn)都落入要求保護(hù)的本發(fā)明范圍內(nèi)。本發(fā)明要求保護(hù)范圍由所附的權(quán)利要求書(shū)及其等效物界定。
【權(quán)利要求】
1.一種恢復(fù)被破壞的空閑內(nèi)存鏈表的方法,其特征在于,所述方法利用內(nèi)存管理冗余信息恢復(fù)被破壞的空閑內(nèi)存鏈表。
2.根據(jù)權(quán)利要求1所述的一種恢復(fù)被破壞的空閑內(nèi)存鏈表的方法,其特征在于,所述方法恢復(fù)被破壞的空閑內(nèi)存鏈表的具體步驟如下: (1)形成所有空閑地址為連續(xù)的空閑內(nèi)存鏈表,且空閑鏈表控制塊記錄空閑塊的首地址、空閑塊的大小和結(jié)束地址等信息; (2)從空閑內(nèi)存鏈表分配地址時(shí),檢查空閑塊是否有效; (3)檢查到空閑塊出現(xiàn)錯(cuò)誤時(shí),設(shè)置標(biāo)志,表明此空閑內(nèi)存鏈表出現(xiàn)錯(cuò)誤,后續(xù)禁止從該鏈分配地址,并根據(jù)空閑鏈表控制塊記錄的空閑塊首地址、空閑塊大小和結(jié)束地址等冗余信息開(kāi)始該內(nèi)存鏈表的整理過(guò)程; (4)從空閑塊的起始地址開(kāi)始,把所有空閑的空閑塊重新組成一空閑鏈表; (5)把在上述整理過(guò)程中釋放的內(nèi)存塊組成另一空閑鏈表; (6)將上述兩個(gè)鏈表合并,組成新的空閑內(nèi)存鏈表; (7)處理結(jié)束,后續(xù)內(nèi)存申請(qǐng)從新的鏈表中分配。
3.根據(jù)權(quán)利要求2所述的一種恢復(fù)被破壞的空閑內(nèi)存鏈表的方法,其特征在于,所述步驟(I)中組成空閑內(nèi)存鏈表的過(guò)程如下: (11)首先,根據(jù)鏈表中空閑塊數(shù)目和每塊大小及其鏈表控制塊等冗余信息計(jì)算出此空閑鏈表需要的所有內(nèi)存大小,并分配內(nèi)存; (12)把分配內(nèi)存的地址即空閑塊的起始地址、結(jié)束地址、空閑塊大小、數(shù)目等記錄到鏈表控制快中,每個(gè)空閑塊具有冗余頭部,用來(lái)記錄分配的地址、該塊內(nèi)存處于分配或空閑狀態(tài)及下一塊的指針,并初始化每塊頭部,所有空閑塊組成空閑內(nèi)存鏈表。
4.根據(jù)權(quán)利要求2所述的一種恢復(fù)被破壞的空閑內(nèi)存鏈表的方法,其特征在于,所述步驟(6)鏈表合并方法為將步驟(4)形成的空閑鏈表插入到步驟(5)中空閑鏈表的尾部,形成一個(gè)新的空閑鏈表。
【文檔編號(hào)】G06F11/08GK104182291SQ201310204921
【公開(kāi)日】2014年12月3日 申請(qǐng)日期:2013年5月28日 優(yōu)先權(quán)日:2013年5月28日
【發(fā)明者】汪革, 茍利平, 李俊盛, 劉基永, 于雯 申請(qǐng)人:上海博達(dá)數(shù)據(jù)通信有限公司