專利名稱:一種內(nèi)存管理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種內(nèi)存管理方法,尤其涉及一種數(shù)據(jù)通信設(shè)備中的內(nèi)存管理方法。
背景技術(shù):
數(shù)據(jù)通信設(shè)備支持的業(yè)務(wù)種類非常眾多,而各種業(yè)務(wù)種類的數(shù)據(jù)結(jié)構(gòu)內(nèi)存特征大小各不相同。為了滿足各種內(nèi)存特征大小的申請、釋放操作,通常使用一種經(jīng)典的內(nèi)存管理方法—伙伴算法。
該算法將空閑內(nèi)存分為多個塊組,每組中塊的大小為2的冪次方字節(jié),比如第0組中塊的大小都為32字節(jié),第1組中塊的大小都為64字節(jié),第n組中塊的大小都為32*2^n字節(jié)。也就是說,每一組中塊的大小都相同且這些相同大小的塊形成一個鏈表。當(dāng)申請65字節(jié)內(nèi)存時(shí),該算法先從128字節(jié)的塊組的空閑鏈表中尋找,看是否存在空閑塊。如果有就直接分配;如果沒有就繼續(xù)查找下一個更大的塊。具體地說,就是在256字節(jié)的塊組的空閑鏈表中尋找,如果存在這樣的空閑塊,將該空閑塊分為兩等份,一份分配出去,另一份插入到128字節(jié)塊組的空閑鏈中。如果256字節(jié)的塊組也沒有空閑塊,則繼續(xù)找更大的塊組,即512字節(jié)的塊組。如果存在空閑塊,則將512字節(jié)分配出128字節(jié),剩余384字節(jié)分為256字節(jié)插入256字節(jié)塊組和128字節(jié)插入128字節(jié)塊組。以此類推。如果最大塊組還沒有空閑塊則放棄分配。內(nèi)存釋放是上述過程的逆過程,即兩塊大小相等、物理地址連續(xù)的內(nèi)存可以進(jìn)行合并,合并后的內(nèi)存還可以與相鄰塊合并時(shí)則繼續(xù)合并。
這種內(nèi)存管理方法可以滿足各種內(nèi)存特征大小的申請和釋放,但是存在內(nèi)存使用效率不足的缺點(diǎn),根據(jù)算法原理,平均情形內(nèi)存使用效率只有75%,如果某些關(guān)鍵數(shù)據(jù)結(jié)構(gòu)內(nèi)存特征大小處于特殊值比如65時(shí),內(nèi)存使用效率就下降到只有50%多一點(diǎn)了。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是提出一種內(nèi)存管理方法,該方法能夠有效地提高內(nèi)存的使用效率。
為了解決上述技術(shù)問題,本發(fā)明提供了一種內(nèi)存管理方法,包括下述步驟(a)設(shè)定一個最小單元,使空閑內(nèi)存塊的大小均為該最小單元p倍,p為正整數(shù),同時(shí)定義多個塊組,每個塊組對應(yīng)于一個周內(nèi)存大小標(biāo)識的區(qū)間且各區(qū)間互不重疊,每個塊組可包括多個大小不同的空閑內(nèi)存塊;(b)使用時(shí),將內(nèi)存劃分為一個或多個空閑內(nèi)存塊,在內(nèi)存中維護(hù)每個塊組當(dāng)前所包括的空閑內(nèi)存塊的信息,以及每個內(nèi)存塊的大小和使用情況的信息;(c)內(nèi)存管理模塊收到內(nèi)存分配請求后,確定能滿足該請求的最小空閑內(nèi)存塊的大小,然后從那些可能具有該最小空閑內(nèi)存塊或更大空閑內(nèi)存塊的塊組中尋找一個能滿足該請求的空閑內(nèi)存塊進(jìn)行分配,如找到,執(zhí)行下一步,否則,此次申請失敗,結(jié)束;(d)如果找到的空閑內(nèi)存塊即為所述最小空閑內(nèi)存塊,執(zhí)行步驟(e),否則,其大小要大于所述最小空閑內(nèi)存塊的大小,執(zhí)行步驟(f);(e)將找到的空閑內(nèi)存塊的可用區(qū)間分配給用戶使用,更新該內(nèi)存塊的信息以及其所屬塊組的空閑內(nèi)存塊的信息,此次申請成功,結(jié)束;(f)將找到的空閑內(nèi)存塊拆分為最小空閑內(nèi)存塊和余下部分構(gòu)成的空閑內(nèi)存塊,將最小空閑內(nèi)存塊的可用區(qū)間分配給用戶使用,并更新該兩個內(nèi)存塊的信息及其所屬塊組的空閑內(nèi)存塊的信息,此次申請成功,結(jié)束。
進(jìn)一步地,上述內(nèi)存管理方法還可具有以下特點(diǎn)還包括以下釋放內(nèi)存和合并空閑內(nèi)存塊的步驟(h)內(nèi)存管理模塊收到釋放內(nèi)存請求,根據(jù)請求中的參數(shù)找到待處理的內(nèi)存塊;
(i)判斷與所述待處理的內(nèi)存塊相鄰的前一個和后一個內(nèi)存塊是否為空閑內(nèi)存塊,如果是,執(zhí)行下一步,否則,執(zhí)行步驟(k);(j)將所述待處理的內(nèi)存塊與其相鄰的前一個和/或后一個空閑內(nèi)存塊合并,將該合并的空閑內(nèi)存塊作為新的待處理內(nèi)存塊,更新被合并的空閑內(nèi)存塊所屬塊組的空閑內(nèi)存塊的信息;(k)更新所述待處理內(nèi)存塊的信息及其所屬塊組的空閑內(nèi)存塊的信息,結(jié)束。
進(jìn)一步地,上述內(nèi)存管理方法還可具有以下特點(diǎn)所述步驟(c)中,所述內(nèi)存管理模塊在查找能滿足所述內(nèi)存分配請求的空閑內(nèi)存塊時(shí),是從所述最小空閑內(nèi)存塊所屬的塊組或其下一個塊組開始查找,如果在該塊組中找不到,再向到其下一個塊組去查找,如此依次查找。
進(jìn)一步地,上述內(nèi)存管理方法還可具有以下特點(diǎn)所述步驟(a)定義塊組的區(qū)間時(shí),使各個塊組對應(yīng)的內(nèi)存大小的區(qū)間合在一起覆蓋了用戶可能申請使用的內(nèi)存大小。
進(jìn)一步地,上述內(nèi)存管理方法還可具有以下特點(diǎn)所述步驟(a)按以下方式定義塊組的區(qū)間第n個塊組對應(yīng)區(qū)間內(nèi)的內(nèi)存大小為所述最小單元的2n倍到2(n+1)-1倍,n=0,1,2,……。
進(jìn)一步地,上述內(nèi)存管理方法還可具有以下特點(diǎn)所述步驟(b)還事先建立p值與開始查找的塊組的塊組號的映射關(guān)系,在所述步驟(c)中可根據(jù)最小空閑內(nèi)存塊的p值直接確定開始查找的塊組。
進(jìn)一步地,上述內(nèi)存管理方法還可具有以下特點(diǎn)所述步驟(b)中,是為每個塊組維護(hù)一個空閑內(nèi)存塊鏈表,鏈表中的節(jié)點(diǎn)指示了對應(yīng)塊組當(dāng)前所包括的所有空閑內(nèi)存塊及其位置信息,且還為每個內(nèi)存塊建立了一個用于記錄其信息的內(nèi)存管理結(jié)構(gòu),該結(jié)構(gòu)中至少包含該內(nèi)存塊的大小和使用標(biāo)志的信息。
進(jìn)一步地,上述內(nèi)存管理方法還可具有以下特點(diǎn)所述空閑內(nèi)存塊鏈表為雙向鏈表,鏈表中每一個中間節(jié)點(diǎn)均保存了其前、后相鄰節(jié)點(diǎn)的地址信息。
進(jìn)一步地,上述內(nèi)存管理方法還可具有以下特點(diǎn)所述空閑內(nèi)存塊鏈表的第一個節(jié)點(diǎn)均建立在專用內(nèi)存區(qū),其第二個及以后的節(jié)點(diǎn)均建立在該節(jié)點(diǎn)所指示的空閑內(nèi)存塊中。
進(jìn)一步地,上述內(nèi)存管理方法還可具有以下特點(diǎn)所述步驟(b)為每個內(nèi)存塊建立的內(nèi)存管理結(jié)構(gòu)設(shè)置在每個內(nèi)存塊內(nèi)的起始位置,所述步驟(c)中收到大小為size的內(nèi)存分配請求后,需要先將size加上該內(nèi)存管理結(jié)構(gòu)所需的大小作為待分配的最小內(nèi)存大小,再確定能滿足該請求的最小空閑內(nèi)存塊的大小。
進(jìn)一步地,上述內(nèi)存管理方法還可具有以下特點(diǎn)所述步驟(c)在確定了能滿足該請求的最小空閑內(nèi)存塊的大小后,在該最小空閑內(nèi)存塊也是其所屬塊組中最小的空閑內(nèi)存塊時(shí),查找其所屬塊組的空閑內(nèi)存塊鏈表,否則查找其所屬塊組的下一個塊組的空閑內(nèi)存塊鏈表,從查找的鏈表中取出存在的第一個空閑內(nèi)存塊進(jìn)行分配。
進(jìn)一步地,上述內(nèi)存管理方法還可具有以下特點(diǎn)所述為每個內(nèi)存塊建立的內(nèi)存管理結(jié)構(gòu)中還包括地址相鄰的前一個內(nèi)存塊的位置信息和/或是否存在地址相鄰的后一內(nèi)存塊的標(biāo)志信息。
進(jìn)一步地,上述內(nèi)存管理方法還可具有以下特點(diǎn)當(dāng)空閑內(nèi)存塊被分配給用戶使用而更新其所屬塊組的空閑內(nèi)存塊的信息時(shí),是將該塊組的空閑內(nèi)存塊鏈表中對應(yīng)于該空閑內(nèi)存塊的節(jié)點(diǎn)從該鏈表中刪除,當(dāng)因拆分、釋放而有新的空閑內(nèi)存塊生成而更新該新的空閑內(nèi)存塊所屬塊組的空閑內(nèi)存塊的信息時(shí),是在該塊組的空閑內(nèi)存塊鏈表中加入用于指示該空閑內(nèi)存塊的節(jié)點(diǎn)。
與現(xiàn)有技術(shù)相比,本發(fā)明具有如下顯著優(yōu)點(diǎn)(1)本發(fā)明極大地改進(jìn)了伙伴算法內(nèi)存使用效率低的缺點(diǎn),并且使得內(nèi)存使用效率與關(guān)鍵數(shù)據(jù)結(jié)構(gòu)內(nèi)存特征大小關(guān)系較小采用接近用戶所需大小進(jìn)行內(nèi)存的分配,每次內(nèi)存分配的浪費(fèi)在最壞情形下也只是接近一個最小內(nèi)存塊,只要申請內(nèi)存的平均值比最小內(nèi)存塊大很多,則即使在最壞情形下的內(nèi)存使用效率也能大大超過伙伴算法的平均內(nèi)存使用效率;(2)本發(fā)明所述的內(nèi)存管理方法的內(nèi)存申請無需伙伴算法的多次分片,內(nèi)存釋放無需伙伴算法的多次合并,在效率上也得到了進(jìn)一步的改進(jìn)。
圖1為本發(fā)明實(shí)施例塊組和空閑內(nèi)存塊的構(gòu)造及邏輯關(guān)系示意圖;圖2為本發(fā)明實(shí)施例塊組、空閑內(nèi)存塊、已分配內(nèi)存塊基本數(shù)據(jù)結(jié)構(gòu)示意圖;圖3為本發(fā)明實(shí)施例內(nèi)存分配的流程圖;圖4為本發(fā)明實(shí)施例內(nèi)存釋放的流程圖具體實(shí)施方式
下面結(jié)合附圖和具體實(shí)施例對本發(fā)明作進(jìn)一步的介紹,但不作為對本發(fā)明的限定。
在本實(shí)施例中,首先確定一個空閑內(nèi)存塊的最小單元,空閑內(nèi)存塊的大小均為該最小單元p倍,p為正整數(shù)。同時(shí),定義多個塊組,每個塊組對應(yīng)于一個用內(nèi)存大小標(biāo)識的區(qū)間,不同塊組的區(qū)間互不重疊,使得這些塊組的內(nèi)存大小區(qū)間合在一起可以覆蓋用戶可能申請使用的內(nèi)存大小,這樣申請內(nèi)存時(shí)總可以找到相應(yīng)的塊組。每個塊組可以包括多個大小不等但在該塊組區(qū)間內(nèi)的內(nèi)存塊,反之,每個內(nèi)存塊按其大小歸屬于一個塊組。
參考圖1,塊1表示大小為確定的最小單元的空閑內(nèi)存塊,塊2表示大小為最小單元2倍的空閑內(nèi)存塊,以此類推……。根據(jù)空閑內(nèi)存塊的大小所屬的區(qū)間將其歸屬到該區(qū)間對應(yīng)的塊組中。本實(shí)施例中,第0個塊組中空閑內(nèi)存塊的大小都是最小單元,第1個塊組中空閑內(nèi)存塊的大小是最小單元的2倍或3倍,第2個塊組中空閑內(nèi)存塊的大小都為最小單元的4倍、5倍、6倍或7倍,……第n個塊組中空閑內(nèi)存塊的大小都為最小單元的2n倍到2(n+1)-1倍,n可以根據(jù)用戶的實(shí)際需求確定,應(yīng)注意的是,這里的區(qū)間也可以采用其它的劃分方式。
圖2是本實(shí)施例塊組、空閑內(nèi)存塊和已分配內(nèi)存塊基本數(shù)據(jù)結(jié)構(gòu)示意圖。本實(shí)施例在用戶可用內(nèi)存中的每個內(nèi)存塊的起始位置設(shè)置了一個內(nèi)存管理結(jié)構(gòu),用于記錄該內(nèi)存塊的大小(size=最小單元的倍數(shù))、地址相鄰的前一個內(nèi)存塊的位置(prev_nbr_addr)(指起始地址)、是否存在地址相鄰的后一內(nèi)存塊的標(biāo)志(have_next_nbr),以及本內(nèi)存塊是否使用的標(biāo)志(used_flag)等信息。將這些信息直接存放在內(nèi)存塊的起始位置,就不必建立保存以上信息的映射表并在映射表和內(nèi)存塊之間來回跳轉(zhuǎn)和在映射表中逐一查找,可以很方便地獲取內(nèi)存塊的各種信息。實(shí)施例中所提的內(nèi)存塊的大小包括了其內(nèi)存管理結(jié)構(gòu)所占用的空間。
以上內(nèi)存管理結(jié)構(gòu)中的內(nèi)容是可以變化的,例如,在另一實(shí)施例中,后一內(nèi)存塊標(biāo)記可以不需要,直接根據(jù)地址可以判斷出來。而前一個相鄰內(nèi)存塊的地址只是在內(nèi)存釋放合并時(shí)才需要,僅僅內(nèi)存申請或者采用定時(shí)合并方式是不需要的。
為了便于在用戶內(nèi)存的申請時(shí)快速找到需要的空閑內(nèi)存塊,本實(shí)施例方法為每個塊組均維護(hù)一個雙向的空閑內(nèi)存塊鏈表,用于指示該塊組包含的所有空閑內(nèi)存塊及其位置信息。每個雙向空閑鏈表由相互鏈接的一個或多個節(jié)點(diǎn)組成。如圖2所示,本實(shí)施例將所有雙向空閑內(nèi)存鏈表的第一個節(jié)點(diǎn)集中設(shè)置在內(nèi)存的一個專用區(qū)域,查詢時(shí)可以從該區(qū)域中找到相應(yīng)塊組的第一個節(jié)點(diǎn),該節(jié)點(diǎn)應(yīng)保存有該鏈表對應(yīng)的塊組的標(biāo)識。第一個節(jié)點(diǎn)后的所有節(jié)點(diǎn)直接設(shè)置在該節(jié)點(diǎn)所指示的空閑內(nèi)存塊中,其所在位置即該空閑內(nèi)存塊的位置,無需額外的指示信息。在每個節(jié)點(diǎn)上均包括第一指針和第二指針,第一指針為前一個節(jié)點(diǎn)的地址,第二指針為后一個節(jié)點(diǎn)的地址,第一個節(jié)點(diǎn)的第一指針和最后一個節(jié)點(diǎn)的第二指針設(shè)為空(NULL)。通過將節(jié)點(diǎn)設(shè)置在空閑內(nèi)存塊中,可以利用用戶內(nèi)存空間完成雙向鏈表的構(gòu)建,因而有效地節(jié)約了內(nèi)存空間。
如圖2所示,為塊組mm_unit[1](即第一個塊組)維護(hù)了一個雙向空閑內(nèi)存塊鏈表,用于指示該塊組中包含的大小為最小單元2倍或3倍的空閑內(nèi)存塊,圖中該鏈表包括3個節(jié)點(diǎn)。類似地,要為塊組mm_unit[n]維護(hù)一個雙向空閑鏈表,用于指示該塊組中包含的大小為最小單元2n倍或2n+1倍、....、2(n+1)-1倍的空閑內(nèi)存塊。
雙向鏈表的設(shè)置使得可以很方便地從鏈表中刪除一個節(jié)點(diǎn),當(dāng)要刪除一個空閑內(nèi)存塊對應(yīng)的節(jié)點(diǎn)N時(shí),只要根據(jù)該空閑內(nèi)存塊中保存的節(jié)點(diǎn)N的第一和第二指針找到其前后節(jié)點(diǎn),并將其前一個節(jié)點(diǎn)的第二指針修改為節(jié)點(diǎn)N的第二指針,將其后一個節(jié)點(diǎn)的第一指針修改為節(jié)點(diǎn)N的第一指針就可以了,無需從頭訪問鏈表。在鏈表中增加一個節(jié)點(diǎn)時(shí),在本實(shí)施方式中是插入到原鏈表的第一個節(jié)點(diǎn)之后。但在另一實(shí)施例中,也可以接在原鏈表最后一個節(jié)點(diǎn)上。
圖3為本發(fā)明實(shí)施例內(nèi)存分配方法的流程圖,其中的操作都是由內(nèi)存管理模塊完成的,如圖所示,該方法包括以下步驟步驟100,使用時(shí),先將用戶可用的空閑內(nèi)存劃分為多個空閑內(nèi)存塊,常用的是將可用的空閑內(nèi)存劃分為內(nèi)存管理模塊設(shè)定的最大空閑內(nèi)存塊,將這些最大空閑內(nèi)存塊鏈入最大塊組的多向鏈表中,但也可以劃分為屬于不同塊組的多個空閑塊;本實(shí)施例采用最小單元的1倍到2(n+1)-1倍這種方式來設(shè)置塊組,內(nèi)存管理模塊只需要設(shè)置最小單元和n,根據(jù)具體的用戶環(huán)境選擇合適的值就可以要滿足這個要求,對超過設(shè)置的最大空閑內(nèi)存塊大小的內(nèi)存需求可以由內(nèi)存管理模塊先進(jìn)行拆分。
另外,為了提高內(nèi)存申請的效率,還事先建立p與大小為最小單元p倍的空閑內(nèi)存塊所屬塊組號的映射關(guān)系。
步驟101內(nèi)存管理模塊收到大小為size內(nèi)存分配請求后,將size加上內(nèi)存管理結(jié)構(gòu)所需的大小,得到待分配的最小內(nèi)存大?。槐緦?shí)施例中,由于內(nèi)存管理結(jié)構(gòu)是在用戶內(nèi)存塊的內(nèi)部,所以最終分配出的內(nèi)存塊中隱含了一個管理內(nèi)存結(jié)構(gòu),在計(jì)算所需大小時(shí)要計(jì)入內(nèi)存管理結(jié)構(gòu)所需的大小。
步驟102根據(jù)待分配的最小內(nèi)存的大小,計(jì)算出能容納該最小內(nèi)存的空閑內(nèi)存塊大小應(yīng)為最小單元的p1倍;
步驟103根據(jù)事先設(shè)定的p與塊組號的映射關(guān)系,找到相應(yīng)的塊組;本實(shí)施例中,p并不一定是和大小為p倍最小單元的空閑內(nèi)存塊所屬塊組的塊組號間建立映射,為了保證查找的塊組中的空閑內(nèi)存塊都能大于或等于待分配的最小內(nèi)存的大小,以簡化流程。在映射時(shí),如果p倍最小單元是某個塊組的最小空閑內(nèi)存塊的大小,則在該p值與大小為p倍最小單元的空閑內(nèi)存塊所屬塊組的塊組號間建立映射,而當(dāng)p倍最小單元不是塊組所包括的最小空閑內(nèi)存塊的大小時(shí),則與該p值建立映射的塊組號,其對應(yīng)塊組是大小為p倍最小單元的空閑內(nèi)存塊所屬塊組的下一個塊組(文中所說的某一個塊組A的“下一個”塊組是指與塊組A的區(qū)間相鄰,且其包括的空閑內(nèi)存塊大于塊組A包括的空閑內(nèi)存塊的塊組)。
步驟104查詢該塊組的雙向空閑鏈表中是否存在空閑內(nèi)存塊,如果存在,則執(zhí)行步驟105,如果不存在,則執(zhí)行步驟110;步驟105從該空閑鏈表中取出其指示的第一個空閑內(nèi)存塊;步驟106判斷該空閑內(nèi)存塊的大小是否大于p1倍的最小單元,如果是,則執(zhí)行下一步驟107,如果不是,則執(zhí)行步驟109;步驟107將空閑內(nèi)存塊拆分為兩塊,第一個內(nèi)存塊的內(nèi)存大小為p1倍最小單元,修改該塊內(nèi)存管理結(jié)構(gòu)中的相應(yīng)內(nèi)容為內(nèi)存大小size=p1,地址相鄰的后一內(nèi)存塊的存在標(biāo)記have_next_nbr=1,使用標(biāo)記used_flag=1,地址相鄰的前一個內(nèi)存塊的位置prev_nbr_addr=原值;剩余的第二個內(nèi)存塊的管理結(jié)構(gòu)中的相應(yīng)內(nèi)容也相應(yīng)更改為內(nèi)存大小size=原倍數(shù)-p1,地址相鄰的前一個內(nèi)存塊的位置prev_nbr_addr=剛拆分的第一個內(nèi)存塊地址,地址相鄰的后一內(nèi)存塊的存在標(biāo)記have_next_nbr=原值,使用標(biāo)記used_flag=0;步驟108,根據(jù)分出的第二個內(nèi)存塊的內(nèi)存大小定位到其所屬的塊組號,在該塊組的雙向空閑鏈表后加上用于指示該內(nèi)存塊的節(jié)點(diǎn),并將分出的第一個內(nèi)存塊的用戶區(qū)間分配給用戶使用,從雙向鏈表中刪除該內(nèi)存塊對應(yīng)的節(jié)點(diǎn),本次申請成功,結(jié)束;步驟109將該空閑內(nèi)存塊的用戶區(qū)間分配給用戶使用,并從雙向鏈表中刪除該內(nèi)存塊對應(yīng)的節(jié)點(diǎn),本次申請成功,結(jié)束;步驟110判斷是否存在下一個塊組,如果存在,則執(zhí)行步驟104,如果不存在,則執(zhí)行步驟111;步驟111;內(nèi)存申請失敗,作錯誤處理,結(jié)束。
圖4為本實(shí)施例內(nèi)存釋放的流程圖,各個操作是由內(nèi)存管理模塊執(zhí)行的,如圖所示,該流程包括以下步驟步驟201,內(nèi)存管理模塊收到釋放內(nèi)存請求,輸入?yún)?shù)為待釋放內(nèi)存地址,待釋放內(nèi)存減去管理結(jié)構(gòu)所需大小得一地址,定義為待處理內(nèi)存;步驟202根據(jù)待處理內(nèi)存塊攜帶的管理結(jié)構(gòu)判斷其是否存在相鄰且空閑的前一個內(nèi)存塊,如果存在,執(zhí)行步驟203,如果不存在,則直接執(zhí)行步驟204;步驟203從所述前一個空閑內(nèi)存塊所屬塊組的空閑內(nèi)存塊鏈表中刪除該內(nèi)存塊對應(yīng)的節(jié)點(diǎn),將待處理的內(nèi)存塊和該前一個空閑內(nèi)存塊合并,設(shè)置合并后內(nèi)存塊的內(nèi)存管理結(jié)構(gòu)的內(nèi)容為內(nèi)存大小size=兩者之和、地址相鄰的后一內(nèi)存塊的存在標(biāo)記have_next_nbr=待處理內(nèi)存塊的原值,使用標(biāo)記used_flag=0,地址相鄰的前一個內(nèi)存塊的位置prev_nbr_addr=所述前一個空閑內(nèi)存塊的原值,然后將合并后的內(nèi)存塊設(shè)置為新的待處理內(nèi)存,執(zhí)行步驟204;步驟204判斷待處理內(nèi)存是否存在相鄰且空閑的后一塊內(nèi)存,如果存在,則執(zhí)行步驟205,如果不存在,則執(zhí)行步驟206;步驟205將所述后一個空閑內(nèi)存塊對應(yīng)的鏈表節(jié)點(diǎn)從其所屬塊組的空閑內(nèi)存塊鏈表中刪除,將待處理的內(nèi)存塊和該后一個空閑內(nèi)存塊合并,設(shè)置合并后內(nèi)存塊的內(nèi)存管理結(jié)構(gòu)的內(nèi)容為內(nèi)存大小size=兩者之和、地址相鄰的后一內(nèi)存塊的存在標(biāo)記have_next_nbr=后一個內(nèi)存塊的原值,使用標(biāo)記used_flag=0,地址相鄰的前一個內(nèi)存塊的位置prev_nbr_addr=待處理內(nèi)存塊的原值,然后將合并后的內(nèi)存塊設(shè)置為新的待處理內(nèi)存,執(zhí)行步驟206;步驟206根據(jù)待處理內(nèi)存塊的大小確定其所屬的塊組,在該塊組的空閑內(nèi)存塊鏈表中加入指示該待處理內(nèi)存塊的節(jié)點(diǎn),結(jié)束。
在上述實(shí)施例的基礎(chǔ)上,本發(fā)明還可以有各種變換,這些變換應(yīng)當(dāng)屬于本發(fā)明的保護(hù)范圍之內(nèi)。
例如對空閑內(nèi)存塊的合并是因?yàn)橐恢辈鸱植缓喜⒌脑?,會?dǎo)致空閑內(nèi)存塊越來越小,當(dāng)用戶申請較大內(nèi)存時(shí)就會申請不成功,而實(shí)際上可用內(nèi)存還很多,所以內(nèi)存合并是必須的,數(shù)學(xué)上可以證明實(shí)施例中采用的每次釋放時(shí)與前一個、后一個空閑塊合并就可以保證合并無遺漏了。但是,上述合并的方式并不是唯一的,在另一實(shí)施例中,也可以采用定時(shí)合并的方式,即在定時(shí)器到時(shí),搜索內(nèi)存中的空閑內(nèi)存塊,可以按順序?qū)⒖珊喜⒌目臻e內(nèi)存塊都合并在一起。
又如,本實(shí)施例在查找空閑內(nèi)存塊時(shí),是從能容納計(jì)算出的最小內(nèi)存的空閑內(nèi)存塊所屬塊組開始查找的,但在另一實(shí)施例中,是先從最大空閑塊組開始尋找,找不到再繼續(xù)找次大空閑塊組,直到所屬塊組,還可以采用其他順序。事先由內(nèi)存管理模塊將查找順序設(shè)定好就可以了。
又如在分配空閑內(nèi)存時(shí),確定了要查找的塊組后,上述實(shí)施例是在該塊組的鏈表中找到第一個空閑內(nèi)存塊就進(jìn)行分配,在另一實(shí)施例中,也可以先查找在塊組的鏈表中是否存在剛好能容納該申請內(nèi)存的大小為最小單元p倍的空閑內(nèi)存塊,如果沒有再對第一個空閑內(nèi)存塊進(jìn)行分配。
權(quán)利要求
1.一種內(nèi)存管理方法,包括下述步驟(a)設(shè)定一個最小單元,使空閑內(nèi)存塊的大小均為該最小單元p倍,p為正整數(shù),同時(shí)定義多個塊組,每個塊組對應(yīng)于一個用內(nèi)存大小標(biāo)識的區(qū)間且各區(qū)間互不重疊,每個塊組可包括多個大小不同的空閑內(nèi)存塊;(b)使用時(shí),將內(nèi)存劃分為一個或多個空閑內(nèi)存塊,在內(nèi)存中維護(hù)每個塊組當(dāng)前所包括的空閑內(nèi)存塊的信息,以及每個內(nèi)存塊的大小和使用情況的信息;(c)內(nèi)存管理模塊收到內(nèi)存分配請求后,確定能滿足該請求的最小空閑內(nèi)存塊的大小,然后從那些可能具有該最小空閑內(nèi)存塊或更大空閑內(nèi)存塊的塊組中尋找一個能滿足該請求的空閑內(nèi)存塊進(jìn)行分配,如找到,執(zhí)行下一步,否則,此次申請失敗,結(jié)束;(d)如果找到的空閑內(nèi)存塊即為所述最小空閑內(nèi)存塊,執(zhí)行步驟(e),否則,其大小要大于所述最小空閑內(nèi)存塊的大小,執(zhí)行步驟(f);(e)將找到的空閑內(nèi)存塊的可用區(qū)間分配給用戶使用,更新該內(nèi)存塊的信息以及其所屬塊組的空閑內(nèi)存塊的信息,此次申請成功,結(jié)束;(f)將找到的空閑內(nèi)存塊拆分為最小空閑內(nèi)存塊和余下部分構(gòu)成的空閑內(nèi)存塊,將最小空閑內(nèi)存塊的可用區(qū)間分配給用戶使用,并更新該兩個內(nèi)存塊的信息及其所屬塊組的空閑內(nèi)存塊的信息,此次申請成功,結(jié)束。
2.如權(quán)利要求1所述的內(nèi)存管理方法,其特征在于,還包括以下釋放內(nèi)存和合并空閑內(nèi)存塊的步驟(h)內(nèi)存管理模塊收到釋放內(nèi)存請求,根據(jù)請求中的參數(shù)找到待處理的內(nèi)存塊;(i)判斷與所述待處理的內(nèi)存塊相鄰的前一個和后一個內(nèi)存塊是否為空閑內(nèi)存塊,如果是,執(zhí)行下一步,否則,執(zhí)行步驟(k);(j)將所述待處理的內(nèi)存塊與其相鄰的前一個和/或后一個空閑內(nèi)存塊合并,將該合并的空閑內(nèi)存塊作為新的待處理內(nèi)存塊,更新被合并的空閑內(nèi)存塊所屬塊組的空閑內(nèi)存塊的信息;(k)更新所述待處理內(nèi)存塊的信息及其所屬塊組的空閑內(nèi)存塊的信息,結(jié)束。
3.如權(quán)利要求2所述的內(nèi)存管理方法,其特征在于,所述步驟(c)中,所述內(nèi)存管理模塊在查找能滿足所述內(nèi)存分配請求的空閑內(nèi)存塊時(shí),是從所述最小空閑內(nèi)存塊所屬的塊組或其下一個塊組開始查找,如果在該塊組中找不到,再向到其下一個塊組去查找,如此依次查找。
4.如權(quán)利要求1或2所述的內(nèi)存管理方法,其特征在于,所述步驟(a)定義塊組的區(qū)間時(shí),使各個塊組對應(yīng)的內(nèi)存大小的區(qū)間合在一起覆蓋了用戶可能申請使用的內(nèi)存大小。
5.如權(quán)利要求1或2所述的內(nèi)存管理方法,其特征在于,所述步驟(a)按以下方式定義塊組的區(qū)間第n個塊組對應(yīng)區(qū)間內(nèi)的內(nèi)存大小為所述最小單元的2n倍到2(n+1)-1倍,n=0,1,2,……。
6.如權(quán)利要求3所述的內(nèi)存管理方法,其特征在于,所述步驟(b)還事先建立p值與開始查找的塊組的塊組號的映射關(guān)系,在所述步驟(c)中可根據(jù)最小空閑內(nèi)存塊的p值直接確定開始查找的塊組。
7.如權(quán)利要求1或2所述的內(nèi)存管理方法,其特征在于,所述步驟(b)中,是為每個塊組維護(hù)一個空閑內(nèi)存塊鏈表,鏈表中的節(jié)點(diǎn)指示了對應(yīng)塊組當(dāng)前所包括的所有空閑內(nèi)存塊及其位置信息,且還為每個內(nèi)存塊建立了一個用于記錄其信息的內(nèi)存管理結(jié)構(gòu),該結(jié)構(gòu)中至少包含該內(nèi)存塊的大小和使用標(biāo)志的信息。
8.如權(quán)利要求7所述的內(nèi)存管理方法,其特征在于,所述空閑內(nèi)存塊鏈表為雙向鏈表,鏈表中每一個中間節(jié)點(diǎn)均保存了其前、后相鄰節(jié)點(diǎn)的地址信息。
9.如權(quán)利要求7所述的內(nèi)存管理方法,其特征在于,所述空閑內(nèi)存塊鏈表的第一個節(jié)點(diǎn)均建立在專用內(nèi)存區(qū),其第二個及以后的節(jié)點(diǎn)均建立在該節(jié)點(diǎn)所指示的空閑內(nèi)存塊中。
10.如權(quán)利要求7所述的內(nèi)存管理方法,其特征在于,所述步驟(b)為每個內(nèi)存塊建立的內(nèi)存管理結(jié)構(gòu)設(shè)置在每個內(nèi)存塊內(nèi)的起始位置,所述步驟(c)中收到大小為size的內(nèi)存分配請求后,需要先將size加上該內(nèi)存管理結(jié)構(gòu)所需的大小作為待分配的最小內(nèi)存大小,再確定能滿足該請求的最小空閑內(nèi)存塊的大小。
11.如權(quán)利要求7所述的內(nèi)存管理方法,其特征在于,所述步驟(c)在確定了能滿足該請求的最小空閑內(nèi)存塊的大小后,在該最小空閑內(nèi)存塊也是其所屬塊組中最小的空閑內(nèi)存塊時(shí),查找其所屬塊組的空閑內(nèi)存塊鏈表,否則查找其所屬塊組的下一個塊組的空閑內(nèi)存塊鏈表,從查找的鏈表中取出存在的第一個空閑內(nèi)存塊進(jìn)行分配。
12.如權(quán)利要求7所述的內(nèi)存管理方法,其特征在于,所述為每個內(nèi)存塊建立的內(nèi)存管理結(jié)構(gòu)中還包括地址相鄰的前一個內(nèi)存塊的位置信息和/或是否存在地址相鄰的后一內(nèi)存塊的標(biāo)志信息。
13.如權(quán)利要求7所述的內(nèi)存管理方法,其特征在于,當(dāng)空閑內(nèi)存塊被分配給用戶使用而更新其所屬塊組的空閑內(nèi)存塊的信息時(shí),是將該塊組的空閑內(nèi)存塊鏈表中對應(yīng)于該空閑內(nèi)存塊的節(jié)點(diǎn)從該鏈表中刪除,當(dāng)因拆分、釋放而有新的空閑內(nèi)存塊生成而更新該新的空閑內(nèi)存塊所屬塊組的空閑內(nèi)存塊的信息時(shí),是在該塊組的空閑內(nèi)存塊鏈表中加入用于指示該空閑內(nèi)存塊的節(jié)點(diǎn)。
全文摘要
本發(fā)明公開了一種內(nèi)存管理方法,先設(shè)定一個空閑內(nèi)存塊的最小單元,并定義多個塊組,每個塊組可包括多個大小不同的空閑內(nèi)存塊;使用時(shí),維護(hù)每個塊組當(dāng)前所包括的所有空閑內(nèi)存塊的信息及每個內(nèi)存塊的大小和使用情況信息;收到內(nèi)存分配請求后,確定能滿足該請求的最小空閑內(nèi)存塊,然后在可能具有滿足該請求的空閑內(nèi)存塊的塊組中尋找一個可滿足該請求的空閑內(nèi)存塊,如找到的空閑內(nèi)存塊大小等于該最小空閑內(nèi)存塊,則直接將其分配給用戶并更新相關(guān)信息,否則將其拆分為最小空閑內(nèi)存塊和剩余部分構(gòu)成的內(nèi)存塊,將最小空閑內(nèi)存塊分配給用戶,并更新該兩個內(nèi)存塊的信息及其所屬塊組的空閑內(nèi)存塊的信息。本發(fā)明方法能夠有效地提高內(nèi)存的使用效率。
文檔編號G06F12/02GK1963788SQ20051011767
公開日2007年5月16日 申請日期2005年11月8日 優(yōu)先權(quán)日2005年11月8日
發(fā)明者張應(yīng)平, 沈曉峰 申請人:中興通訊股份有限公司