專利名稱:內(nèi)存的分配、清理和釋放方法及內(nèi)存管理的裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及內(nèi)存管理技術(shù),特別是內(nèi)存的分配、清理和釋放方法及內(nèi)存 管理的裝置。
背景技術(shù):
隨著linux系統(tǒng)廣泛使用,該系統(tǒng)中動(dòng)態(tài)內(nèi)存的管理方式已經(jīng)變得愈發(fā) 重要。因?yàn)槿绻麆?dòng)態(tài)內(nèi)存短缺或管理不當(dāng),將導(dǎo)致整個(gè)系統(tǒng)反應(yīng)遲緩,甚至 整個(gè)系統(tǒng)的崩潰。
為了保證linux內(nèi)存管理機(jī)制能夠高效運(yùn)行,在現(xiàn)代操作系統(tǒng)中采用了 許多技術(shù),其中比較常用的就是伙伴算法。該算法最早是由Donald E. Knuth 于1968年提出的,是一個(gè)快速的動(dòng)態(tài)內(nèi)存管理經(jīng)典算法。
在該算法中有多個(gè)空閑隊(duì)列,塊長(zhǎng)為2k個(gè)頁面的空閑塊都在同 一個(gè)隊(duì)列 中。當(dāng)要分配一個(gè)長(zhǎng)為m的內(nèi)存塊時(shí),需從塊長(zhǎng)為2'的空閑隊(duì)列中分配一個(gè) 內(nèi)存塊(其中i滿足2'-'〈m〈2')。如果塊長(zhǎng)為2'的空閑隊(duì)列耗盡,則從塊長(zhǎng) 為2"'的空閑隊(duì)列中分配一塊,,將其分為長(zhǎng)度相等的兩段,這兩段互為伙伴, 一段用于分配,另一段鏈入塊長(zhǎng)為2'的伙伴空閑隊(duì)列中。如果塊長(zhǎng)為2' + '的 空閑隊(duì)列也為空,則繼續(xù)向塊長(zhǎng)更大的內(nèi)存塊(21+2 , 2'" )提出請(qǐng)求。
而當(dāng)塊長(zhǎng)為"個(gè)頁面的內(nèi)存塊被釋放時(shí),首先檢查其伙伴塊是否空閑, 如果空閑則與伙伴塊合并為塊長(zhǎng)為2」+'的空閑塊,并鏈入對(duì)應(yīng)隊(duì)列中;若忙則 直接鏈入塊長(zhǎng)為2J的空閑隊(duì)列中。當(dāng)合并得到塊長(zhǎng)為2J"的空閑內(nèi)存塊時(shí),也 要檢查它的伙伴塊狀態(tài)并做相同的處理,直到得到最大的空閑塊。在伙伴算 法中,內(nèi)存的分配和合并都是一個(gè)遞歸的過程。
經(jīng)典的伙伴算法是一個(gè)非常強(qiáng)調(diào)時(shí)效的算法。最壞的情況下,內(nèi)存分配和回收的時(shí)間開銷都是G(bg M),其中M是內(nèi)存的大小。從而內(nèi)存的分配和 回收可在一定時(shí)限內(nèi)完成。在經(jīng)典的伙伴算法中主要時(shí)間消耗在分配時(shí)沒有 合適的內(nèi)存塊,需要把大的內(nèi)存塊分裂成較小的內(nèi)存塊的過程,以及在回收 時(shí),把小的空閑塊合并成較大空閑塊的過程。
經(jīng)典伙伴算法雖然具有較譯的時(shí)效性,但存在兩個(gè)問題嚴(yán)重制約著算法 的性能。首先,經(jīng)典伙伴算法由于塊長(zhǎng)為2的冪次方,造成了較多的內(nèi)部碎 片,從而導(dǎo)致即使系統(tǒng)中有足夠的內(nèi)存,但由于其不連續(xù)也不能滿足某些內(nèi)
存請(qǐng)求;其次,若分配的內(nèi)存塊生存周期很短,經(jīng)典的伙伴算法要求系統(tǒng)不
斷進(jìn)行內(nèi)存塊的分裂和合并過程,使得系統(tǒng)產(chǎn)生過大的負(fù)載影響了系統(tǒng)的運(yùn) 行效率。
針對(duì)經(jīng)典伙伴算法中存在的問題,對(duì)該算法的研究一直沒有停止過。例
如,針對(duì)內(nèi)部碎片問題,研究者們先后提出了三種比較重要的改進(jìn)算法 Knowlton和knuth的binary ^火j半算法,Hirschberg的fibonacci "f火"f半算法, 以及Shen和Peterson的weighted伙伴算法。這三種算法均通過增加內(nèi)存塊 尺寸的種類,希望最大程度的使內(nèi)存塊尺寸更加接近應(yīng)用需求,以減少內(nèi)部 碎片的產(chǎn)生。雖然這些算法提供了更多合適的內(nèi)存塊尺寸,似乎達(dá)到了減少 內(nèi)部碎片的目的,但是仔細(xì)分析則不難發(fā)現(xiàn),在提供更多的內(nèi)存塊尺寸時(shí), 系統(tǒng)就要增加維護(hù)新尺寸內(nèi)存塊的表項(xiàng),從而增加了空間開銷;同時(shí)由于內(nèi) 存塊尺寸的粒度變細(xì),增加了分裂回收伙伴的次數(shù),增加了時(shí)間開銷;而且 試驗(yàn)證明,系統(tǒng)的內(nèi)部碎片總量總是保持在25%-40%這個(gè)恒定的區(qū)間,并沒 有有效減少??偟膩碚f,這三種算法實(shí)現(xiàn)內(nèi)部碎片的減少是以犧牲算法性能 為代價(jià)的。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的目的在于提供內(nèi)存的分配、清理和釋放方法及內(nèi)存 管理的裝置,用于減小內(nèi)存碎片和提高系統(tǒng)效率。
為實(shí)現(xiàn)上述目的,本發(fā)明提供了一種內(nèi)存的分配方法,在接收到內(nèi)存請(qǐng)求時(shí),包括以下步驟
從大小最合適的空閑隊(duì)列為所述內(nèi)存請(qǐng)求分配內(nèi)存塊,對(duì)內(nèi)存分配時(shí)產(chǎn)
生的內(nèi)部碎片進(jìn)行回收,將所述內(nèi)部碎片分別插到不同的空閑隊(duì)列;當(dāng)最大 的空閑內(nèi)存塊也無法滿足所述內(nèi)存請(qǐng)求時(shí),進(jìn)行內(nèi)存塊合并操作。
本發(fā)明還提供了一種清理內(nèi)存的方法,在接收到內(nèi)存請(qǐng)求時(shí),如果空閑 內(nèi)存中最大的內(nèi)存塊也無法滿足所述內(nèi)存請(qǐng)求時(shí),進(jìn)行內(nèi)存塊合并操作。
本發(fā)明還提供了一種釋放內(nèi)存的方法,當(dāng)內(nèi)存塊被釋放時(shí),將釋放的內(nèi) 存塊插入到相應(yīng)的伙伴忙空閑隊(duì)列,或?qū)⒒锇槊臻e隊(duì)列中的內(nèi)存塊轉(zhuǎn)移到 伙伴閑空閑隊(duì)列,并不立即對(duì)內(nèi)存塊進(jìn)行合并操作,僅僅當(dāng)最大的空閑內(nèi)存 塊也無法滿足內(nèi)存請(qǐng)求時(shí),才進(jìn)行內(nèi)存塊合并操作。
本發(fā)明還提供了一種內(nèi)存管理的裝置,包括
內(nèi)存分配模塊,用于從大小最合適的空閑隊(duì)列中為內(nèi)存請(qǐng)求分配內(nèi)存
塊;
內(nèi)部碎片分別插到不同的空閑隊(duì)列;
內(nèi)存合并模塊,用于當(dāng)最大的空閑內(nèi)存塊也無法滿足所述內(nèi)存請(qǐng)求時(shí), 進(jìn)行內(nèi)存塊合并操作。
本發(fā)明通過對(duì)內(nèi)存請(qǐng)求執(zhí)行按需分配策略,能夠提供靈活多變的內(nèi)存塊 尺寸,從而達(dá)到了減少內(nèi)部碎片的目的。同時(shí)還對(duì)釋放的內(nèi)存塊執(zhí)行延遲合 并的策略,能夠避免頻繁分裂和合并所造成的內(nèi)存震蕩,從而減少系統(tǒng)頻繁 進(jìn)行分裂和合并的開銷,提高了系統(tǒng)的性能。
圖1為本發(fā)明的實(shí)施例中進(jìn)行內(nèi)存分配的方法流程圖2為本發(fā)明的實(shí)施例中待分配內(nèi)存塊的結(jié)構(gòu)示意圖3為本發(fā)明的實(shí)施例中空閑隊(duì)列的結(jié)構(gòu)示意圖4為本發(fā)明的實(shí)施例中對(duì)內(nèi)存塊進(jìn)行合并操作的方法流程圖;圖5為本發(fā)明的實(shí)施例中對(duì)內(nèi)存塊進(jìn)行回收操作的方法流程圖; 圖6為本發(fā)明的實(shí)施例中一種內(nèi)存管理裝置的結(jié)構(gòu)圖。
具體實(shí)施例方式
本發(fā)明的實(shí)施例通過對(duì)內(nèi)存請(qǐng)求執(zhí)行按需分配策略,以提供靈活多變的 內(nèi)存塊尺寸,從而達(dá)到了減少內(nèi)部碎片的目的。同時(shí)還提出了釋方文內(nèi)存塊延 遲合并的策略,以避免頻繁分裂和合并所造成的內(nèi)存震蕩,從而減少系統(tǒng)頻 繁進(jìn)行分裂和合并的開銷,以提高系統(tǒng)的性能。
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖對(duì)本發(fā)明 作進(jìn)一步的詳細(xì)描述。
當(dāng)進(jìn)行內(nèi)存分配時(shí),其核心思想是對(duì)內(nèi)存請(qǐng)求進(jìn)行按需分配,并將分配 后的內(nèi)部^e卒片進(jìn)行拆分,插入到相應(yīng)大小的內(nèi)存塊空閑隊(duì)列。該方法的流程 如圖1所示
步驟101、根據(jù)請(qǐng)求的內(nèi)存塊的大小,找到內(nèi)存塊大小為2的i次方個(gè) 頁面大小的空閑內(nèi)存塊隊(duì)列。這里的i值要滿足2卜1 〈m〈2', m是請(qǐng)求的內(nèi)存塊 的大小。
如圖2所示,假如要分配9個(gè)頁面大小的內(nèi)存塊,則找到塊長(zhǎng)為24(16) 個(gè)頁面大小的空閑內(nèi)存塊隊(duì)列。
步驟102、判斷大小為2的i次方個(gè)頁面大小的空閑內(nèi)存塊隊(duì)列中是否 有空閑內(nèi)存塊,有則執(zhí)行步驟i06;否則執(zhí)行步驟103。
判斷24個(gè)頁面大小的空閑內(nèi)存塊隊(duì)列是否有空閑內(nèi)存塊。
步驟103、將空閑內(nèi)存塊大小的指數(shù)標(biāo)志i遞增,即i^+l。該步驟的目 的是分裂更大的內(nèi)存塊,因?yàn)榇笮∽詈线m的空閑內(nèi)存塊不存在,只能從更大 的內(nèi)存塊中分配請(qǐng)求的內(nèi)存塊。
步驟104、判斷i是否大于Max,所述Max是待分配的最大空閑內(nèi)存塊 的大小值。該步驟用以判定待分裂的更大空閑內(nèi)存塊是否超過最大空閑內(nèi)存 塊值,若i〉Max,則執(zhí)行步驟105,否則執(zhí)行步驟102。步驟105、對(duì)所有空閑內(nèi)存塊進(jìn)行清理,并執(zhí)行步驟101。
步驟106、分配大小為2的i次方的空閑內(nèi)存塊,從該內(nèi)存塊的尾部起 分配所述請(qǐng)求的內(nèi)存頁。
在圖2中,在24個(gè)頁面大小的空閑內(nèi)存塊隊(duì)列中取出一個(gè)空閑內(nèi)存塊, 將該內(nèi)存塊后半部分的9個(gè)頁面分配出去。
步驟107、回收完成分配的空閑內(nèi)存塊中剩余的內(nèi)存碎片,將內(nèi)部碎片 進(jìn)行拆分并插入到相應(yīng)大小的空閑內(nèi)存塊隊(duì)列。拆分插入的原則是從分配 后的內(nèi)存塊首部起向后找到盡可能大的2的冪次方個(gè)頁面,掛入相應(yīng)的空閑 內(nèi)存塊隊(duì)列,然后依次用同樣的方法把剩下的空閑頁面都分別掛入相應(yīng)的隊(duì) 列中。
如圖2所示,首先將塊1掛入2的2次方的空閑內(nèi)存塊隊(duì)列中,再分別 將塊2和3掛入2的1次方和0次方的隊(duì)列中。在這里,由于塊3對(duì)應(yīng)的伙 伴塊是4,而4已經(jīng)分配出去了,表明塊3伙伴忙,則應(yīng)將塊3放入伙伴忙 空閑隊(duì)列,同理,塊1和2對(duì)應(yīng)的伙伴塊是5, 5已經(jīng)分配,則將塊1和2 同樣放入伙伴忙空閑隊(duì)列。 '
步驟108、返回分配得到的內(nèi)存基地址。
以上流程是分配內(nèi)存時(shí)執(zhí)行的流程,這種方法能夠提供靈活多變的內(nèi)存 塊大小,實(shí)現(xiàn)了按需分配內(nèi)存,在一定程度上減少了內(nèi)存碎片的產(chǎn)生。
該流程針對(duì)現(xiàn)有技術(shù)的另 一重要改進(jìn)是將空閑隊(duì)列分成了伙伴閑空閑 隊(duì)列和伙伴忙空閑隊(duì)列,如圖3所示,兩塊在物理上連續(xù)的存儲(chǔ)空間互稱伙 伴,若伙伴已被分配,則將其放入伙伴忙空閑隊(duì)列,伙伴未被分配,則將其 放入伙伴閑空閑隊(duì)列。圖3中,2k個(gè)頁面大小的空閑內(nèi)存塊被放入了兩個(gè)隊(duì) 列中,處于伙伴忙空閑隊(duì)列中的內(nèi)存塊其伙伴已被分配使用,二者間存在鏈 接關(guān)系,處于伙伴閑空閑隊(duì)列中的內(nèi)存塊其伙伴未被分配使用,二者間同樣 存在鏈接關(guān)系。本發(fā)明不會(huì)隨時(shí)將空閑的伙伴合并,而是僅僅在最大的內(nèi)存 塊也不能滿足請(qǐng)求者時(shí)才進(jìn)行合并,也就是內(nèi)存塊延遲合并策略。當(dāng)分配內(nèi) 存塊時(shí),優(yōu)先分配伙伴忙空閑隊(duì)列中的內(nèi)存塊,直到忙空閑隊(duì)列中的內(nèi)存塊被分配完畢,再從伙伴閑空閑隊(duì)列中分配內(nèi)存塊,這樣能夠保證在合并內(nèi)存 塊時(shí),伙伴閑空閑隊(duì)列中有更多的內(nèi)存塊可合并,提高了合并的效率。當(dāng)內(nèi) 存塊被釋放時(shí),只是將空閑的伙伴掛入伙伴閑空閑隊(duì)列。這樣就避免了現(xiàn)有 技術(shù)中分裂回收伙伴頻率過高、系統(tǒng)負(fù)擔(dān)過重的問題。
在步驟105中,當(dāng)最大空閑內(nèi)存塊不能滿足請(qǐng)求時(shí),需要對(duì)伙伴空閑塊
進(jìn)行合并操作,該操作的流程如圖4所示,具體包括如下步驟 步驟1050、賦初值,令卜0。
步驟1051、開始遍歷2i個(gè)頁面大小的伙伴閑空閑隊(duì)列。
步驟1052、判斷該伙伴閑空閑隊(duì)列是否為空,如果為空,則令i^+l, 執(zhí)行步驟1051;否則,執(zhí)行下一步。
步驟1053、判斷i是否等于MAX-1,如果是,則將該空閑隊(duì)列中的所有 內(nèi)存塊及其伙伴添加到2i+1個(gè)頁面大小的伙伴忙空閑隊(duì)列中,并執(zhí)行步驟 1055;否則執(zhí)行下一步。這是因?yàn)?,系統(tǒng)默認(rèn)2MAX個(gè)頁面大小的內(nèi)存塊是最 大的內(nèi)存塊,已經(jīng)無法再進(jìn)行合并了,即2MAx只有一個(gè)空閑隊(duì)列,不分忙和 閑,或者可以認(rèn)為只有一個(gè)伙伴忙空閑隊(duì)列。因此,當(dāng)對(duì)2MA"個(gè)頁面大小 的內(nèi)存塊進(jìn)行合并時(shí),已經(jīng)是最后一次合并了。 MAX與Max值得差別在于, MAX是系統(tǒng)默認(rèn)的最大內(nèi)存塊,Max是現(xiàn)有的空閑內(nèi)存塊中最大的。
步驟1054、遍歷2i個(gè)頁面大小的伙伴閑空閑隊(duì)列中每個(gè)節(jié)點(diǎn),從節(jié)點(diǎn)中 獲取內(nèi)存塊,將該內(nèi)存塊和其伙伴塊合并,根據(jù)合并后的2i"個(gè)頁面大小的 內(nèi)存塊其伙伴塊的分配情況,將其添加到2|+1個(gè)頁面大小的伙伴忙或伙伴閑 空閑隊(duì)列中,并將該內(nèi)存塊和其伙伴塊從2i隊(duì)列中刪除。
如何判斷伙伴塊是否被分配,可根據(jù)內(nèi)存位圖的情況,因?yàn)閮?nèi)存位圖詳 細(xì)標(biāo)識(shí)了所有內(nèi)存的使用狀態(tài)。
步驟1055、令i=i+l。
步驟1056、判斷i是否小于MAX,若是則跳轉(zhuǎn)到步驟1051,否則結(jié)束 本流程。 '
通過該流程,能夠有效避免現(xiàn)有技術(shù)需隨時(shí)進(jìn)行內(nèi)存塊的合并,而導(dǎo)致的系統(tǒng)負(fù)載增大的問題。并且由于將空閑內(nèi)存塊分別掛在了伙伴閑空閑隊(duì)列 和伙伴忙空閑隊(duì)列,從而在合并時(shí)只需對(duì)伙伴閑空閑隊(duì)列進(jìn)行操作即可,提 高了合并的效率,進(jìn)一步減輕了系統(tǒng)負(fù)荷。
釋放后,所進(jìn)行的操作,其核心思想是當(dāng)內(nèi)存塊被釋放時(shí),將釋放的內(nèi)存塊 插入到相應(yīng)的伙伴忙空閑隊(duì)列,或?qū)⒒锇槊臻e隊(duì)列中的內(nèi)存塊轉(zhuǎn)移到伙伴 閑空閑隊(duì)列,但是并不立即對(duì)內(nèi)存塊進(jìn)行合并操作,僅僅當(dāng)無法滿足內(nèi)存請(qǐng) 求時(shí)才依次對(duì)各伙伴閑空閑隊(duì)列進(jìn)行合并操作,直到得到請(qǐng)求大小的內(nèi)存塊。
該流程具體包括以下步驟
步驟201、根據(jù)釋放的內(nèi)存塊的大小,找到2i個(gè)頁面大小的空閑內(nèi)存隊(duì) 列。其中,i的取值滿足2" 〈m〈2', m是請(qǐng)求的內(nèi)存塊的大小。
依然以圖2的內(nèi)存塊為例,釋放的內(nèi)存塊大小為9個(gè)頁面大小,則i值 為4。 '
步驟202、賦初值,令j二l。
步驟203、檢查psize的1到i位,如果第j位為1并且j=MAX,則將相 應(yīng)內(nèi)存塊添加到2MAx個(gè)頁面大小的伙伴忙空閑隊(duì)列中;否則執(zhí)行下一步。其 中,psize是釋放的內(nèi)存大小的二進(jìn)制值。原因如前面所述,因?yàn)?"^個(gè)頁 面大小的內(nèi)存塊是系統(tǒng)默認(rèn)最大的內(nèi)存塊,將其掛入2max伏伴忙空閑隊(duì)列即 可。MAX實(shí)際上是一個(gè)臨界條件,表示針對(duì)釋放的內(nèi)存塊的操作至此就結(jié) 束了。
以圖2為例,9的二進(jìn)制值是1001,表明該內(nèi)存塊可以拆分為2°和23 的內(nèi)存塊,那么只需針對(duì)這兩個(gè)隊(duì)列進(jìn)行操作即可。
步驟204、如果第j位為1,則檢測(cè)內(nèi)存位圖,若此釋放的內(nèi)存塊其伙伴 塊空閑,將伙伴塊從2i伙伴忙空閑隊(duì)列中移除,并將此兩個(gè)伙伴塊添加到2j 伙伴閑空閑隊(duì)列中。第j位指的是二進(jìn)制值的第j位,該位為0時(shí)無需任何 操作。
在這里,并不立即對(duì)釋放的內(nèi)存塊進(jìn)行合并,而是將其掛入合適的空閑隊(duì)列中,目的就是為了減少合并操作,因此該流程也稱為延遲合并策略。
步驟205、如果第j位為1,則檢測(cè)內(nèi)存位圖,若此釋放的內(nèi)存塊其伙伴 塊忙,將釋放的內(nèi)存塊添加到2i伙伴忙空閑隊(duì)列中。
步驟206、令j叫+l,如果j〈+l,則跳轉(zhuǎn)到步驟203,否則結(jié)束。 以圖2為例,假定塊1、 2和3未被分配的前提下,在之前被請(qǐng)求的9 個(gè)頁面大小的內(nèi)存塊被釋放時(shí),根據(jù)其二進(jìn)制值,將這個(gè)內(nèi)存塊拆分為2°和 23個(gè)頁面大小的內(nèi)存塊,即塊4和5,其中,塊4的伙伴塊3空閑,則將塊3 從2°伙伴忙空閑隊(duì)列中移除,與塊3共同掛入2°伙伴閑空閑隊(duì)列。而塊5 的伙伴塊1和2也空閑,則將塊5和塊1、 2共同掛入23伙伴閑空閑隊(duì)列。
通過以上流程可以看出,本發(fā)明的實(shí)施例是通過對(duì)分配給請(qǐng)求的內(nèi)存塊 進(jìn)行再分配,劃分成按需分配部分和碎片回收部分。按需分配部分將請(qǐng)求分 成若干子內(nèi)存塊,每個(gè)子內(nèi)存塊的大小都為2的冪次方;同樣回收部分也是 按照2的冪次方分成若干子內(nèi)存塊。分配的時(shí)候?qū)葱璺峙洳糠值淖觾?nèi)存塊 所對(duì)應(yīng)的位圖置1,并將其分配給請(qǐng)求,同時(shí)將回收部分插入對(duì)應(yīng)的內(nèi)存塊 空閑隊(duì)列。
本發(fā)明實(shí)施例的另 一 重要特征在于采用了空閑內(nèi)存塊的延遲合并策略。 當(dāng)一個(gè)內(nèi)存塊被釋放時(shí),并不立即對(duì)其進(jìn)行合并操作,而是當(dāng)內(nèi)存請(qǐng)求不能 立即得到滿足時(shí)才嘗試合并。
圖6本發(fā)明實(shí)施例中一種內(nèi)存管理裝置的結(jié)構(gòu)圖,包括
內(nèi)存分配i^莫塊61 ,用于從大小最合適的空閑隊(duì)列中為內(nèi)存請(qǐng)求分配內(nèi)存
塊;
碎片回收模塊62,用于對(duì)內(nèi)存分配時(shí)產(chǎn)生的內(nèi)部碎片進(jìn)行回收,并將所 述內(nèi)部碎片分別插到不同的空閑隊(duì)列;
內(nèi)存合并模塊63,用于當(dāng)'最大的空閑內(nèi)存塊也無法滿足所述內(nèi)存請(qǐng)求 時(shí),進(jìn)行內(nèi)存塊合并操作;
庫交佳的,該裝置進(jìn)一步可以包括
內(nèi)存釋放模塊64,用于當(dāng)內(nèi)存塊被釋放時(shí),將釋放的內(nèi)存塊插入到相應(yīng)的伙伴忙空閑隊(duì)列,或?qū)⒒锇槊臻e隊(duì)列中的內(nèi)存塊轉(zhuǎn)移到伙伴閑S閑隊(duì)列。 其中,內(nèi)存分配模塊61根據(jù)請(qǐng)求的內(nèi)存塊的大小,找到合適大小的空
閑內(nèi)存塊,將相應(yīng)數(shù)量的頁面分配出去,剩余的頁面發(fā)送給碎片回收模塊62。 碎片回收模塊62將內(nèi)部碎片進(jìn)行拆分并插入到相應(yīng)大小的空閑內(nèi)存塊隊(duì)列。 拆分插入的原則是從分配后的內(nèi)存塊首部起向后找到盡可能大的2的冪次 方個(gè)頁面,掛入相應(yīng)的空閑內(nèi)存塊隊(duì)列,然后依次用同樣的方法把剩下的空 閑頁面都分別掛入相應(yīng)的隊(duì)列中。當(dāng)系統(tǒng)中的最大空閑內(nèi)存塊也無法滿足內(nèi) 存請(qǐng)求時(shí),需要內(nèi)存合并模塊63進(jìn)行內(nèi)存塊合并操作。合并操作是將都為空 閑的伙伴塊合并為一個(gè)兩倍大小的新內(nèi)存塊,并掛入相應(yīng)的空閑隊(duì)列。在內(nèi) 存塊被釋放時(shí),內(nèi)存釋放模塊64將釋放的內(nèi)存塊插入到相應(yīng)的伙伴忙空閑隊(duì) 列,或?qū)⒒锇槊臻e隊(duì)列中的內(nèi)存塊轉(zhuǎn)移到伙伴閑空閑隊(duì)列。
該裝置通過對(duì)內(nèi)存請(qǐng)求進(jìn)行按需分配,提供活多變的內(nèi)存塊尺寸,從而 達(dá)到了減少內(nèi)部碎片的目的。同時(shí)還通過釋放的內(nèi)存塊延遲合并,避免了頻 繁分裂和合并所造成的內(nèi)存震蕩,減少了頻繁進(jìn)行分裂和合并的開銷,提高 了系統(tǒng)性能。
總之,以上所述僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的 保護(hù)范圍。
權(quán)利要求
1、一種內(nèi)存的分配方法,在接收到內(nèi)存請(qǐng)求時(shí),其特征在于,包括以下步驟從大小最合適的空閑隊(duì)列為所述內(nèi)存請(qǐng)求分配內(nèi)存塊,對(duì)內(nèi)存分配時(shí)產(chǎn)生的內(nèi)部碎片進(jìn)行回收,將所述內(nèi)部碎片分別插到不同的空閑隊(duì)列;當(dāng)最大的空閑內(nèi)存塊也無法滿足所述內(nèi)存請(qǐng)求時(shí),進(jìn)行內(nèi)存塊合并操作。
2、 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述從大小最合適的空 閑隊(duì)列分配內(nèi)存塊具體包括根據(jù)請(qǐng)求的內(nèi)存塊的大小,'找到內(nèi)存塊大小為2i個(gè)頁面大小的空閑隊(duì) 列,i值滿足2'" 〈m〈2i, m為請(qǐng)求的內(nèi)存塊的大?。慌袛啻笮?'個(gè)頁面大小的空閑隊(duì)列中是否有空閑內(nèi)存塊,有則執(zhí)行下 一步;否則將空閑內(nèi)存塊大小的指數(shù)標(biāo)志i遞增,直到獲得空閑內(nèi)存塊;分配大小為2 1個(gè)頁面大小的空閑內(nèi)存塊,從該內(nèi)存塊的尾部起分配所述 i貪,長(zhǎng)的內(nèi)存頁。
3、 根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述對(duì)內(nèi)部碎片進(jìn) 行回收具體包括從分配后的內(nèi)存塊首部起向后找到盡可能大的2的冪次方個(gè)頁面,掛入 相應(yīng)的空閑隊(duì)列,然后依次用同樣的方法把剩下的空閑頁面都分別掛入相應(yīng) 的隊(duì)列中。
4、 根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述空閑隊(duì)列為伙 伴忙空閑隊(duì)列,當(dāng)合適的伙伴忙空閑隊(duì)列均為空時(shí),再分配伙伴閑空閑隊(duì)列。
5、 根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述內(nèi)存塊合并操 作具體包括從1=0開始,遍歷2'個(gè)頁面大小的伙伴閑空閑隊(duì)列; 遍歷2i個(gè)頁面大小的伙伴閑空閑隊(duì)列中每個(gè)節(jié)點(diǎn),從節(jié)點(diǎn)中獲取內(nèi)存塊, 將該內(nèi)存塊和其伙伴塊合并,根據(jù)合并后的2i"個(gè)頁面大小的內(nèi)存塊其伙伴塊的分配情況,將其添加到2|+1個(gè)頁面大小的伙伴忙或伙伴閑空閑隊(duì)列'中,并將該內(nèi)存塊和其伙伴塊從2''隊(duì)列中刪除。
6、 一種清理內(nèi)存的方法,在接收到內(nèi)存請(qǐng)求時(shí),其特征在于,如果空閑內(nèi)存中最大的內(nèi)存塊也無法滿足所述內(nèi)存請(qǐng)求時(shí),進(jìn)行內(nèi)存塊合并操作。
7、 根據(jù)權(quán)利要求6所述的方法,其特征在于,所述內(nèi)存塊合并操作具 體包括從i=0開始,遍歷2j個(gè)頁面大小的伙伴閑空閑隊(duì)列;遍歷2'個(gè)頁面大小的伙伴閑空閑隊(duì)列中每個(gè)節(jié)點(diǎn),從節(jié)點(diǎn)中獲取內(nèi)存塊, 將該內(nèi)存塊和其伙伴塊合并,根據(jù)合并后的2i"個(gè)頁面大小的內(nèi)存塊其伙伴 塊的分配情況,將其添加到2;+1個(gè)頁面大小的伙伴忙或伙伴閑空閑隊(duì)列中, 并將該內(nèi)存塊和其伙伴塊從2j隊(duì)列中刪除。
8、 根據(jù)權(quán)利要求7所述的,方法,其特征在于,該方法進(jìn)一步包括當(dāng)i 等于MAX-1時(shí),將該空閑隊(duì)列中的所有內(nèi)存塊及其伙伴添加到21+1個(gè)頁面大 小的伙伴忙空閑隊(duì)列中,所述MAX為系統(tǒng)默認(rèn)的最大內(nèi)存塊的大小。
9、 一種釋放內(nèi)存的方法,當(dāng)內(nèi)存塊被釋放時(shí),其特征在于,將釋放的 內(nèi)存塊插入到相應(yīng)的伙伴忙空閑隊(duì)列,或?qū)⒒锇槊臻e隊(duì)列中的內(nèi)存塊轉(zhuǎn)移 到伙伴閑空閑隊(duì)列,并不立即對(duì)內(nèi)存塊進(jìn)行合并操作,僅僅當(dāng)最大的空閑內(nèi) 存塊也無法滿足內(nèi)存請(qǐng)求時(shí),才進(jìn)行內(nèi)存塊合并操作。
10、 根據(jù)權(quán)利要求9所述的方法,其特征在于,所述將釋放的內(nèi)存塊插 入到相應(yīng)的伙伴忙空閑隊(duì)列具體包括根據(jù)釋放的內(nèi)存塊大小的二進(jìn)制值,將所述釋放的內(nèi)存塊按照2的冪次 方分成若干子內(nèi)存塊,對(duì)于每個(gè)子內(nèi)存塊,如果其伙伴塊忙,將釋放的內(nèi)存 塊添加到相應(yīng)的2的冪次方個(gè)頁面大小的伙伴忙空閑隊(duì)列中。
11、 根據(jù)權(quán)利要求9或IO所述的方法,其特征在于,所述將伙伴忙空 閑隊(duì)列中的內(nèi)存塊轉(zhuǎn)移到伙伴閑空閑隊(duì)列具體包括根據(jù)釋放的內(nèi)存塊大小的二進(jìn)制值,將所述釋放的內(nèi)存塊按照2的冪次 方分成若干子內(nèi)存塊,對(duì)于每個(gè)子內(nèi)存塊,如果其伙伴塊閑,將所述伙伴塊從伙伴忙空閑隊(duì)列中移除,并將此兩個(gè)伙伴塊添加到相應(yīng)的2的冪次方個(gè)頁 面大小的伙伴閑空閑隊(duì)列中。
12、 根據(jù)權(quán)利要求9或IO所述的方法,其特征在于,所述內(nèi)存塊合并 操作具體包括從i二0開始,遍歷2i個(gè)頁面大小的伙伴閑空閑隊(duì)列;遍歷2j個(gè)頁面大小的伙伴閑空閑隊(duì)列中每個(gè)節(jié)點(diǎn),從節(jié)點(diǎn)中獲取內(nèi)存塊, 將該內(nèi)存塊和其伙伴塊合并,根據(jù)合并后的2i+'個(gè)頁面大小的內(nèi)存塊其伙伴 塊的分配情況,將其添加到2i+'個(gè)頁面大小的伙伴忙或伙伴閑空閑隊(duì)列中, 并將該內(nèi)存塊和其伙伴塊從21隊(duì)列中刪除。
13、 一種內(nèi)存管理的裝置,其特征在于,包括內(nèi)存分配模塊,用于從大小最合適的空閑隊(duì)列中為內(nèi)存請(qǐng)求分配內(nèi)存塊;碎片回收模塊,用于對(duì)內(nèi)存分配時(shí)產(chǎn)生的內(nèi)部碎片進(jìn)行回收,并將所述 內(nèi)部碎片分別插到不同的空閑隊(duì)列;內(nèi)存合并模塊,用于當(dāng)最大的空閑內(nèi)存塊也無法滿足所述內(nèi)存請(qǐng)求時(shí), 進(jìn)行內(nèi)存塊合并操作。
14、 根據(jù)權(quán)利要求13所述的裝置,其特征在于,該裝置進(jìn)一步包括 內(nèi)存釋放模塊,用于當(dāng)內(nèi)存塊被釋放時(shí),將釋放的內(nèi)存塊插入到相應(yīng)的伙伴忙空閑隊(duì)列,或?qū)⒒锇槊臻e隊(duì)列中的內(nèi)存塊轉(zhuǎn)移到伙伴閑空閑隊(duì)列。
全文摘要
本發(fā)明公開了內(nèi)存的分配、清理和釋放方法,還公開了一種內(nèi)存管理的裝置,包括內(nèi)存分配模塊,用于從大小最合適的空閑隊(duì)列中為內(nèi)存請(qǐng)求分配內(nèi)存塊;碎片回收模塊,用于對(duì)內(nèi)存分配時(shí)產(chǎn)生的內(nèi)部碎片進(jìn)行回收,并將所述內(nèi)部碎片分別插到不同的空閑隊(duì)列;內(nèi)存合并模塊,用于當(dāng)最大的空閑內(nèi)存塊也無法滿足所述內(nèi)存請(qǐng)求時(shí),進(jìn)行內(nèi)存塊合并操作。本發(fā)明通過對(duì)內(nèi)存請(qǐng)求按需分配,能夠減少內(nèi)部碎片的產(chǎn)生。還對(duì)釋放的內(nèi)存塊延遲合并,能夠避免頻繁分裂和合并所造成的內(nèi)存震蕩,從而減少系統(tǒng)頻繁進(jìn)行分裂和合并的開銷,提高了系統(tǒng)的性能。
文檔編號(hào)G06F12/02GK101320351SQ20081004821
公開日2008年12月10日 申請(qǐng)日期2008年6月27日 優(yōu)先權(quán)日2008年6月27日
發(fā)明者鑫 余, 李江雄 申請(qǐng)人:華中科技大學(xué)