一種基于用途編號(hào)的用戶程序內(nèi)存分配及批量回收的方法及裝置制造方法
【專利摘要】本發(fā)明提供了一種基于用途編號(hào)的用戶程序內(nèi)存分配及批量回收的方法及裝置,對(duì)于一類需要逐漸地進(jìn)行內(nèi)存分配,而同時(shí)釋放所有之前所分配空間的功能需求,提供一種更高效率的內(nèi)存分配及回收方法,使得無論在內(nèi)存分配過程中有多少次分配操作,都可以在釋放空間時(shí)一次完成,極大的改善了此類應(yīng)用對(duì)系統(tǒng)資源的消耗,提高了內(nèi)存分配方法的效率。
【專利說明】一種基于用途編號(hào)的用戶程序內(nèi)存分配及批量回收的方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)操作系統(tǒng)中內(nèi)存管理【技術(shù)領(lǐng)域】,尤其涉及在分布式計(jì)算中對(duì)細(xì)粒度任務(wù)進(jìn)行離散的內(nèi)存分配以及批量?jī)?nèi)存回收的方法及裝置。
【背景技術(shù)】
[0002]在計(jì)算機(jī)系統(tǒng)中,內(nèi)存的分配和回收是一種核心功能,支持操作系統(tǒng)和應(yīng)用程序動(dòng)態(tài)的獲取和釋放系統(tǒng)內(nèi)存資源,操作系統(tǒng)內(nèi)核中的內(nèi)存分配策略服務(wù)于所有內(nèi)核中的功能,是一種通用的內(nèi)存分配策略。
[0003]常見內(nèi)存分配算法及優(yōu)缺點(diǎn)如下:
[0004](I)首次適應(yīng)算法。使用該算法進(jìn)行內(nèi)存分配時(shí),從空閑分區(qū)鏈?zhǔn)组_始查找,直至找到一個(gè)能滿足其大小要求的空閑分區(qū)為止。然后再按照作業(yè)的大小,從該分區(qū)中劃出一塊內(nèi)存分配給請(qǐng)求者,余下的空閑分區(qū)仍留在空閑分區(qū)鏈中。
[0005]該算法傾向于使用內(nèi)存中低地址部分的空閑分區(qū),在高地址部分的空閑分區(qū)很少被利用,從而保留了高地址部分的大空閑區(qū)。顯然為以后到達(dá)的大作業(yè)分配大的內(nèi)存空間創(chuàng)造了條件。缺點(diǎn)在于低址部分不斷被劃分,留下許多難以利用、很小的空閑區(qū),而每次查找又都從低址部分開始,這無疑會(huì)增加查找的開銷。
[0006](2)循環(huán)首次適應(yīng)算法。該算法是由首次適應(yīng)算法演變而成的。在為進(jìn)程分配內(nèi)存空間時(shí),不再每次從鏈?zhǔn)组_始查找,而是從上次找到的空閑分區(qū)開始查找,直至找到一個(gè)能滿足要求的空閑分區(qū),并從中劃出一塊來分給作業(yè)。該算法能使空閑中的內(nèi)存分區(qū)分布得更加均勻,但將會(huì)缺乏大的空閑分區(qū)。
[0007](3)最佳適應(yīng)算法。該算法總是把既能滿足要求,又是最小的空閑分區(qū)分配給作業(yè)。
[0008]為了加速查找,該算法要求將所有的空閑區(qū)按其大小排序后,以遞增順序形成一個(gè)空白鏈。這樣每次找到的第一個(gè)滿足要求的空閑區(qū),必然是最優(yōu)的。孤立地看,該算法似乎是最優(yōu)的,但事實(shí)上并不一定。因?yàn)槊看畏峙浜笫S嗟目臻g一定是最小的,在存儲(chǔ)器中將留下許多難以利用的小空閑區(qū)。同時(shí)每次分配后必須重新排序,這也帶來了一定的開銷。
[0009](4)最差適應(yīng)算法。最差適應(yīng)算法中,該算法按大小遞減的順序形成空閑區(qū)鏈,分配時(shí)直接從空閑區(qū)鏈的第一個(gè)空閑分區(qū)中分配(不能滿足需要?jiǎng)t不分配)。很顯然,如果第一個(gè)空閑分區(qū)不能滿足,那么再?zèng)]有空閑分區(qū)能滿足需要。這種分配方法初看起來不太合理,但它也有很強(qiáng)的直觀吸引力:在大空閑區(qū)中放入程序后,剩下的空閑區(qū)常常也很大,于是還能裝下一個(gè)較大的新程序。
[0010]最壞適應(yīng)算法與最佳適應(yīng)算法的排序正好相反,它的隊(duì)列指針總是指向最大的空閑區(qū),在進(jìn)行分配時(shí),總是從最大的空閑區(qū)開始查尋。
[0011]該算法克服了最佳適應(yīng)算法留下的許多小的碎片的不足,但保留大的空閑區(qū)的可能性減小了,而且空閑區(qū)回收也和最佳適應(yīng)算法一樣復(fù)雜。[0012]而內(nèi)核中的不同功能對(duì)內(nèi)存的需求各不相同,對(duì)內(nèi)存空間的使用也存在不同的規(guī)律,使用一種通用的存儲(chǔ)管理方法會(huì)導(dǎo)致內(nèi)存利用率降低、內(nèi)存碎片逐漸嚴(yán)重。
[0013]對(duì)于內(nèi)核中的一些模塊,其在申請(qǐng)內(nèi)存的過程中是逐漸獲取的,不斷增加其持有的內(nèi)存資源,而在這個(gè)模塊完成某項(xiàng)功能,將要釋放資源的時(shí)候,則希望在同一時(shí)刻釋放所有其持有的內(nèi)存資源。現(xiàn)有的內(nèi)存分配方法要求釋放的內(nèi)存對(duì)應(yīng)分配時(shí)的位置和大小,對(duì)于多次分配而獲得的較大內(nèi)存空間,也需要逐個(gè)進(jìn)行釋放。這就導(dǎo)致了內(nèi)存釋放時(shí)出現(xiàn)大量集中的操作,帶來較大的開銷。
[0014]常見內(nèi)存回收算法及優(yōu)缺點(diǎn)如下:
[0015]引用計(jì)數(shù)算法的優(yōu)點(diǎn)和缺陷同樣明顯。這一算法在執(zhí)行垃圾收集任務(wù)時(shí)速度較快,但算法對(duì)程序中每一次內(nèi)存分配和指針操作提出了額外的要求(增加或減少內(nèi)存塊的引用計(jì)數(shù))。更重要的是,引用計(jì)數(shù)算法無法正確釋放循環(huán)引用的內(nèi)存塊。
[0016]標(biāo)記-清除算法的執(zhí)行過程分為“標(biāo)記”和“清除”兩大階段。這種分步執(zhí)行的思路奠定了現(xiàn)代垃圾收集算法的思想基礎(chǔ)。與引用計(jì)數(shù)算法不同的是,標(biāo)記-清除算法不需要運(yùn)行環(huán)境監(jiān)測(cè)每一次內(nèi)存分配和指針操作,而只要在“標(biāo)記”階段中跟蹤每一個(gè)指針變量的指向。用類似思路實(shí)現(xiàn)的垃圾收集器也常被后人統(tǒng)稱為跟蹤收集器。伴隨著Lisp語言的成功,標(biāo)記-清除算法也在大多數(shù)早期的Lisp運(yùn)行環(huán)境中大放異彩。盡管最初版本的標(biāo)記-清除算法在今天看來還存在效率不高(標(biāo)記和清除是兩個(gè)相當(dāng)耗時(shí)的過程)等諸多缺陷。
[0017]為了解決標(biāo)記-清除算法在垃圾收集效率方面的缺陷,M.L.Minsky于1963年發(fā)表了著名的論文“一種使用雙存儲(chǔ)區(qū)的Lisp語言垃圾收集器(A LISP Garbage CollectorAlgorithm Using Serial Secondary Storage)”。]^.L.Minsky在該論文中描述的算法被人們稱為復(fù)制算法,它也被M.L.Minsky本人成功地引入到了 Lisp語言的一個(gè)實(shí)現(xiàn)版本中。
[0018]分區(qū)、復(fù)制的思路不僅大幅提高了垃圾收集的效率,而且也將原本繁紛復(fù)雜的內(nèi)存分配算法變得前所未有地簡(jiǎn)明和扼要。既然每次內(nèi)存回收都是對(duì)整個(gè)半?yún)^(qū)的回收,內(nèi)存分配時(shí)也就不用考慮內(nèi)存碎片等復(fù)雜情況,只要移動(dòng)堆頂指針,按順序分配內(nèi)存就可以了。在垃圾收集技術(shù)中,復(fù)制算法提高效率的代價(jià)是人為地將可用內(nèi)存縮小了一半。
[0019]標(biāo)記-整理算法是標(biāo)記-清除算法和復(fù)制算法的有機(jī)結(jié)合。標(biāo)記-整理算法的總體執(zhí)行效率高于標(biāo)記-清除算法,又不像復(fù)制算法那樣需要犧牲一半的存儲(chǔ)空間,這是一種非常理想的方法。在許多現(xiàn)代的垃圾收集器中都使用了標(biāo)記-整理算法或其改進(jìn)版本。
【發(fā)明內(nèi)容】
[0020]本發(fā)明的目的為提供一種基于用途編號(hào)的對(duì)于離散分配的內(nèi)存空間進(jìn)行批量回收的方法及裝置,提高了批量?jī)?nèi)存釋放時(shí)的效率,從而消除在集中釋放內(nèi)存時(shí)帶來的較大開銷。
[0021]為解決上述技術(shù)問題,本發(fā)明提供了一種基于用途編號(hào)的對(duì)于離散分配的內(nèi)存空間進(jìn)行批量回收的方法及裝置,如圖1所示,所述方法包括:
[0022]內(nèi)存分配接口。這一接口的調(diào)用者需要提供兩個(gè)參數(shù)。第一個(gè)參數(shù)是需要分配的內(nèi)存空間的大小,以字節(jié)為單位。第二個(gè)參數(shù)是一個(gè)任意的數(shù)值,用于區(qū)分內(nèi)存的用途,相同的數(shù)值表示所分配的內(nèi)存用于相同的用途,并且將在使用結(jié)束后一起回收。這個(gè)數(shù)值被稱為“用途編號(hào)”
[0023]內(nèi)存回收接口。這一接口的調(diào)用者需要提供一個(gè)參數(shù)。這個(gè)參數(shù)對(duì)應(yīng)在內(nèi)存分配時(shí)所提供的用途編號(hào),調(diào)用內(nèi)存回收接口表示把參數(shù)數(shù)值所對(duì)應(yīng)的所有內(nèi)存空間全部回收,供未來分配使用。
[0024]內(nèi)存管理模塊。為每一個(gè)出現(xiàn)過的用途編號(hào)預(yù)留一個(gè)連續(xù)的內(nèi)存空間,不同的用途編號(hào)對(duì)應(yīng)不用的內(nèi)存空間。一個(gè)用途之內(nèi)的內(nèi)存申請(qǐng)?jiān)谧约核鶎俚目臻g之中申請(qǐng)內(nèi)存。一個(gè)用途編號(hào)所對(duì)應(yīng)的預(yù)留內(nèi)存空間被稱為一個(gè)子內(nèi)存池,相應(yīng)地,一個(gè)子內(nèi)存池服務(wù)于一個(gè)用途。內(nèi)存管理結(jié)構(gòu)如圖2所示。
【專利附圖】
【附圖說明】
[0025]圖1為內(nèi)存分配裝置的結(jié)構(gòu)圖。
[0026]圖2為內(nèi)存管理模塊結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0027]對(duì)于一個(gè)子內(nèi)存池,其中的存儲(chǔ)分配是順序的。一個(gè)空閑空間指針指向未分配內(nèi)存段的開始。分配操作采用計(jì)算機(jī)的原子操作指令對(duì)空閑空間指針進(jìn)行操作,返回當(dāng)前空閑空間的地址,并向后移動(dòng)所申請(qǐng)的大小,使其指向新的空閑空間的開始地址。
[0028]當(dāng)子內(nèi)存池的空間不足以分配新的元素時(shí),管理模塊調(diào)用操作系統(tǒng)的底層內(nèi)存管理功能,為子內(nèi)存池?cái)U(kuò)容,即申請(qǐng)更多的空間,新申請(qǐng)的空間和子內(nèi)存池是連續(xù)的,保證內(nèi)存池中的地址空間總是連續(xù)的。
[0029]關(guān)閉子內(nèi)存池表示不再繼續(xù)使用一個(gè)用途編號(hào)所對(duì)應(yīng)的內(nèi)存資源。關(guān)閉一個(gè)內(nèi)存池的時(shí)候,整個(gè)內(nèi)存池所占用的內(nèi)存空間被清除,交回操作系統(tǒng)管理。
[0030]一個(gè)子內(nèi)存池中的存儲(chǔ)單元不能單獨(dú)回收。
[0031]回收子內(nèi)存池表示將一個(gè)子內(nèi)存池中的存儲(chǔ)空間全部重置,交還給內(nèi)存管理模塊,但是這一子內(nèi)存池還要繼續(xù)為后續(xù)的申請(qǐng)繼續(xù)服務(wù),子內(nèi)存池所包含的內(nèi)存資源不會(huì)交還給操作系統(tǒng)。
[0032]在系統(tǒng)內(nèi)存資源不足時(shí),內(nèi)存管理模塊會(huì)開始進(jìn)行強(qiáng)制內(nèi)存回收操作。強(qiáng)制內(nèi)存回收操作步驟如下:
[0033]隨機(jī)選擇一個(gè)子內(nèi)存池。檢查當(dāng)前子內(nèi)存池已經(jīng)預(yù)留的內(nèi)存空間。檢查當(dāng)前子內(nèi)存池已經(jīng)分配的內(nèi)存空間。如果已經(jīng)分配的內(nèi)存空間比已經(jīng)預(yù)留的內(nèi)存空間小,表示當(dāng)前內(nèi)存池并沒有完全被使用,可以對(duì)這個(gè)子內(nèi)存池進(jìn)行回收操作。
[0034]回收操作通過調(diào)用操作系統(tǒng)的內(nèi)存管理函數(shù)將子內(nèi)存池實(shí)際占用的內(nèi)存邊界調(diào)整到實(shí)際分配的大小,從而減小了實(shí)際占用的內(nèi)存大小。
[0035]如果當(dāng)前系統(tǒng)的空閑內(nèi)存能夠滿足要求,則完成強(qiáng)制內(nèi)存回收操作。如果當(dāng)前還不能獲得足夠的內(nèi)存空間,則再次隨機(jī)選取一個(gè)子內(nèi)存池進(jìn)行上述的操作。如此迭代操作,直到回收了足夠的內(nèi)存空間。如果已經(jīng)遍歷了所有的子內(nèi)存池,依然沒有獲得足夠的內(nèi)存空間,則報(bào)告內(nèi)存不足。
【權(quán)利要求】
1.內(nèi)存分配接口。這一接口的調(diào)用者需要提供兩個(gè)參數(shù)。第一個(gè)參數(shù)是需要分配的內(nèi)存空間的大小,以字節(jié)為單位。第二個(gè)參數(shù)是一個(gè)任意的數(shù)值,用于區(qū)分內(nèi)存的用途,相同的數(shù)值表示所分配的內(nèi)存用于相同的用途,并且將在使用結(jié)束后一起回收。這個(gè)數(shù)值被稱為“用途編號(hào)”。
2.內(nèi)存回收接口。這一接口的調(diào)用者需要提供一個(gè)參數(shù)。這個(gè)參數(shù)對(duì)應(yīng)在內(nèi)存分配時(shí)所提供的用途編號(hào),調(diào)用內(nèi)存回收接口表示把參數(shù)數(shù)值所對(duì)應(yīng)的所有內(nèi)存空間全部回收,供未來分配使用。
3.內(nèi)存管理模塊。為每一個(gè)出現(xiàn)過的用途編號(hào)預(yù)留一個(gè)連續(xù)的內(nèi)存空間,不同的用途編號(hào)對(duì)應(yīng)不用的內(nèi)存空間。一個(gè)用途之內(nèi)的內(nèi)存申請(qǐng)?jiān)谧约核鶎俚目臻g之中申請(qǐng)內(nèi)存。一個(gè)用途編號(hào)所對(duì)應(yīng)的預(yù)留內(nèi)存空間被稱為一個(gè)子內(nèi)存池,相應(yīng)地,一個(gè)子內(nèi)存池服務(wù)于一個(gè)用途。
4.對(duì)于一個(gè)子內(nèi)存池,其中的存儲(chǔ)分配是順序的。一個(gè)空閑空間指針指向未分配內(nèi)存段的開始。分配操作采用計(jì)算機(jī)的原子操作指令對(duì)空閑空間指針進(jìn)行操作,返回當(dāng)前空閑空間的地址,并向后移動(dòng)所申請(qǐng)的大小,使其指向新的空閑空間的開始地址。
5.回收子內(nèi)存池表示將一個(gè)子內(nèi)存池中的存儲(chǔ)空間全部重置,交還給內(nèi)存管理模塊,但是這一子內(nèi)存池還要繼續(xù)為后續(xù)的申請(qǐng)繼續(xù)服務(wù),子內(nèi)存池所包含的內(nèi)存資源不會(huì)交還給操作系統(tǒng)。
【文檔編號(hào)】G06F12/02GK103488577SQ201310430994
【公開日】2014年1月1日 申請(qǐng)日期:2013年9月22日 優(yōu)先權(quán)日:2013年9月22日
【發(fā)明者】吳興博, 龍翔, 王雷 申請(qǐng)人:北京航空航天大學(xué)