專利名稱:解決頻繁分配釋放同等大小內(nèi)存的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及應(yīng)用程序內(nèi)存管理技術(shù),特別是涉及一種解決頻繁分配釋放同等大小內(nèi)存的方法。
背景技術(shù):
內(nèi)存是計(jì)算機(jī)類產(chǎn)品的重要硬件設(shè)施,應(yīng)用程序的內(nèi)存分配釋放都是建立在操作系統(tǒng)對(duì)內(nèi)存的管理之上的。操作系統(tǒng)提供接口比如malloc,free等函數(shù)供應(yīng)用程序進(jìn)行內(nèi)存的相關(guān)操作,操作系統(tǒng)本身則對(duì)應(yīng)用程序的內(nèi)存使用情況進(jìn)行管理。
操作系統(tǒng)的內(nèi)存管理機(jī)制會(huì)產(chǎn)生幾種內(nèi)存浪費(fèi)的情況內(nèi)部碎片和外部碎片。
操作系統(tǒng)的內(nèi)存管理機(jī)制遵循一些基本的內(nèi)存分配規(guī)則。例如,所有內(nèi)存的分配必須起始于可被4、8或16整除的地址。內(nèi)存管理機(jī)制把僅僅預(yù)定大小的內(nèi)存塊分配給應(yīng)用程序。當(dāng)一個(gè)應(yīng)用程序請(qǐng)求一個(gè)43字節(jié)的內(nèi)存塊的時(shí)候,內(nèi)存管理機(jī)制可能會(huì)給它分配44個(gè)字節(jié)、或者48個(gè)字節(jié)甚至更多滿足內(nèi)存分配規(guī)則的內(nèi)存。由所需大小四舍五入而產(chǎn)生的多余空間叫內(nèi)部碎片。
當(dāng)已分配內(nèi)存塊之間出現(xiàn)未被使用的差額時(shí),就會(huì)產(chǎn)生外部碎片。例如,一個(gè)應(yīng)用程序分配三個(gè)連續(xù)的內(nèi)存塊,然后釋放中間的內(nèi)存塊。操作系統(tǒng)的內(nèi)存管理機(jī)制可以重新使用中間的內(nèi)存塊供將來的內(nèi)存塊進(jìn)行分配。但不太可能將來分配的內(nèi)存塊的大小跟操作系統(tǒng)的所有空閑內(nèi)存塊一樣大。那么內(nèi)存管理機(jī)制只能從大的空閑內(nèi)存塊中間分割出小的滿足應(yīng)用程序要求的內(nèi)存塊,這樣一直繼續(xù)下來,最后會(huì)出現(xiàn)很多小的內(nèi)存之間的碎片,它們不能滿足應(yīng)用程序的任何一個(gè)內(nèi)存請(qǐng)求,這些就是外部碎片。
在頻繁分配釋放同等大小內(nèi)存的時(shí)候,操作系統(tǒng)會(huì)產(chǎn)生大量的外部?jī)?nèi)存碎片,并影響操作系統(tǒng)的效率。傳統(tǒng)的解決方法是采用內(nèi)存池。但是單一的內(nèi)存池存在著定制性差、內(nèi)存浪費(fèi)、在擴(kuò)展內(nèi)存池的時(shí)候有可能產(chǎn)生內(nèi)存碎片等缺陷,因此,對(duì)傳統(tǒng)的頻繁分配釋放同等大小內(nèi)存的方法進(jìn)行改造,可以增加應(yīng)用程序內(nèi)存的可定制性,提高系統(tǒng)內(nèi)存的使用效率,改善系統(tǒng)性能。
一個(gè)內(nèi)存池是應(yīng)用程序從操作系統(tǒng)中預(yù)先申請(qǐng)得到的一塊連續(xù)內(nèi)存,內(nèi)存池的屬性包括內(nèi)存池的大小、起始地址、結(jié)束地址、內(nèi)存塊的大小、內(nèi)存塊的個(gè)數(shù)、內(nèi)存塊的標(biāo)志、內(nèi)存塊的其它信息等。內(nèi)存池的大小為內(nèi)存塊的個(gè)數(shù)乘以內(nèi)存塊的大小、內(nèi)存塊的標(biāo)志大小與內(nèi)存塊的其它信息大小之和。
應(yīng)用程序根據(jù)需要分配內(nèi)存的大小,從對(duì)應(yīng)的內(nèi)存池取空閑內(nèi)存塊的地址進(jìn)行使用,使用完后返回給內(nèi)存池。
內(nèi)存池沒有空閑內(nèi)存塊的時(shí)候,應(yīng)用程序擴(kuò)展內(nèi)存池,操作系統(tǒng)負(fù)責(zé)根據(jù)操作系統(tǒng)的內(nèi)存管理機(jī)制擴(kuò)展內(nèi)存池或者重新分配更大的內(nèi)存池,并且把原有的內(nèi)存池信息復(fù)制到新的內(nèi)存池。
現(xiàn)有的內(nèi)存池管理方法,在應(yīng)用程序剛開始的時(shí)候就限制了內(nèi)存池的大小,可定制性較差,盡管當(dāng)內(nèi)存池不夠大的時(shí)候可以擴(kuò)展內(nèi)存池,但同樣可能會(huì)產(chǎn)生外部?jī)?nèi)存碎片,而且在內(nèi)存池一直擴(kuò)大的情況下,不停擴(kuò)展內(nèi)存池就相當(dāng)于頻繁分配內(nèi)存,對(duì)系統(tǒng)效率有明顯的影響。
因此,如果能提出更有效的解決頻繁分配同等大小的方法,可以提高整個(gè)應(yīng)用程序內(nèi)存的可定制性,更有效的利用內(nèi)存和節(jié)約內(nèi)存,提高應(yīng)用程序的運(yùn)行速度,減少響應(yīng)時(shí)間。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種解決頻繁分配釋放同等大小內(nèi)存的方法。
本發(fā)明采用的技術(shù)方案如下1)記頻繁分配釋放同等大小內(nèi)存的大小為msize,內(nèi)存池鏈表的指針為plist,第n個(gè)內(nèi)存池為mpn,內(nèi)存池的起始地址為psn,結(jié)束地址為pen,內(nèi)存池的第一個(gè)free標(biāo)志的內(nèi)存在該內(nèi)存池的位置為freen;2)定義一個(gè)函數(shù)f(n)用來決定第n個(gè)內(nèi)存池的大小,f(n)值等于0或者小于0,則表示應(yīng)用程序設(shè)定了大小為msize的內(nèi)存塊的個(gè)數(shù)上限,大小為前面n-1次分配的內(nèi)存塊的個(gè)數(shù)的和;3)當(dāng)應(yīng)用程序需要大小為msize的內(nèi)存時(shí),則從內(nèi)存池鏈表的第一個(gè)內(nèi)存池開始,逐個(gè)判斷內(nèi)存池的freen是否大于f(n);如果freen小于等于f(n),表示該內(nèi)存池有空閑內(nèi)存可以分配,返回該內(nèi)存池;如果freen大于f(n),表示該內(nèi)存池沒有空閑內(nèi)存可以使用,判斷下一個(gè)內(nèi)存池;如果沒有下一個(gè)內(nèi)存池,并且f(n)>0,那么新建一個(gè)大小為F(n)的內(nèi)存池,其中F(n)=(msize+標(biāo)志位大小)*f(n);同時(shí)初始化所有的標(biāo)志位為free,初始化freen為1,然后返回該內(nèi)存池;如果f(n)<=0,則通知應(yīng)用程序已達(dá)內(nèi)存上限;4)得到有空閑內(nèi)存可以使用的內(nèi)存池以后,把該內(nèi)存池的位置為freen的內(nèi)存給應(yīng)用程序使用,同時(shí)把位置為freen的內(nèi)存的標(biāo)志設(shè)為used,然后從位置freen+1開始,逐個(gè)判斷內(nèi)存池的內(nèi)存的標(biāo)志是否為free,如果在內(nèi)存池結(jié)束前找到標(biāo)志為free的內(nèi)存,則令該內(nèi)存池的freen等于找到的標(biāo)志為free的內(nèi)存所在的位置,如果沒找到標(biāo)志為free的內(nèi)存,則令該內(nèi)存池的freen等于f(n)+1;5)當(dāng)應(yīng)用程序釋放大小為msize的內(nèi)存時(shí),則把該內(nèi)存的標(biāo)志設(shè)為free,同時(shí)判斷該內(nèi)存在所在內(nèi)存池的位置是否大于所在內(nèi)存池的freen,如果小于freen,則令freen等于該內(nèi)存在所在內(nèi)存池的位置;6)應(yīng)用程序退出的時(shí)候,銷毀內(nèi)存池鏈表中的所有內(nèi)存池。
本發(fā)明和已有技術(shù)相比,具有的有益的效果是用內(nèi)存池鏈表替代單一的內(nèi)存池、用函數(shù)來控制內(nèi)存池的數(shù)量和大小,從而提高了整個(gè)應(yīng)用程序內(nèi)存的可定制性,更有效的利用內(nèi)存和節(jié)約內(nèi)存,提高應(yīng)用程序的運(yùn)行速度,減少響應(yīng)時(shí)間。
圖1是內(nèi)存池結(jié)構(gòu)圖;圖2是內(nèi)存池鏈表的總結(jié)構(gòu)圖;圖3是有1個(gè)新建內(nèi)存池的內(nèi)存池鏈表;圖4是應(yīng)用程序分配了1塊大小為32的內(nèi)存后的內(nèi)存池鏈表;圖5是在圖4狀態(tài)上,應(yīng)用程序連續(xù)分配了5塊大小為32的內(nèi)存后的內(nèi)存池鏈表;圖6是在圖5狀態(tài)上,應(yīng)用程序釋放了位于內(nèi)存池鏈表中內(nèi)存池mp1第2個(gè)位置的內(nèi)存塊后的內(nèi)存池鏈表狀態(tài)。
具體實(shí)施例方式
下面結(jié)合附圖,用一個(gè)實(shí)施例來說明如何用本發(fā)明解決頻繁分配釋放同等大小內(nèi)存的情況。
記頻繁分配釋放同等大小內(nèi)存的大小為msize,內(nèi)存池鏈表的指針為plist,第n個(gè)內(nèi)存池為mpn,內(nèi)存池的起始地址為psn,結(jié)束地址為pen,內(nèi)存池的第一個(gè)free標(biāo)志的內(nèi)存在該內(nèi)存池的位置為freen;定義一個(gè)函數(shù)f(n)用來決定第n個(gè)內(nèi)存池的大小,f(n)值等于0或者小于0,則表示應(yīng)用程序設(shè)定了大小為msize的內(nèi)存塊的個(gè)數(shù)上限,大小為前面n-1次分配的內(nèi)存塊的個(gè)數(shù)的和,見圖1和圖2所示。
步驟1采用技術(shù)方案1)初始化頻繁分配釋放同等大小的內(nèi)存的大小msize=32,內(nèi)存池鏈表的指針為plist為空;
步驟2采用技術(shù)方案2)初始化函數(shù)f,令f(1)=5,f(2)=7,f(3)=0,表示應(yīng)用程序設(shè)定了內(nèi)存大小為32的內(nèi)存塊的個(gè)數(shù)上限為5+7=12個(gè);步驟3采用技術(shù)方案3)取得有空閑內(nèi)存的內(nèi)存池mp1,內(nèi)存池mp1的5個(gè)內(nèi)存塊的標(biāo)志全部為free(用F簡(jiǎn)寫),內(nèi)存池的第一個(gè)空閑內(nèi)存塊的位置free1=1。(見圖3所示)步驟4得到有空閑內(nèi)存塊的內(nèi)存池后,采用技術(shù)方案4)把位置為1的內(nèi)存塊給應(yīng)用程序使用,同時(shí)把位置1的內(nèi)存塊的標(biāo)志改成used(用U簡(jiǎn)寫),內(nèi)存池mp1的第一個(gè)空閑內(nèi)存塊的位置free1=2。(見圖4所示)步驟5采用技術(shù)方案3)和4)再分配5塊大小為32的內(nèi)存給應(yīng)用程序使用,這時(shí)內(nèi)存池mp1的第一個(gè)空閑內(nèi)存塊的位置free1=6,內(nèi)存池mp2的第一個(gè)空閑內(nèi)存塊的位置free2=2。(見圖5所示)步驟6采用技術(shù)方案5)釋放內(nèi)存池mp1的位置為2的內(nèi)存塊,這時(shí)把該內(nèi)存塊的標(biāo)志改為free,同時(shí)令內(nèi)存池mp1的第一個(gè)空閑內(nèi)存塊的位置free1=2。(見圖6所示)步驟7采用技術(shù)方案6)銷毀內(nèi)存池鏈表plist中的內(nèi)存池mp1和mp2。這時(shí),plist為空。
權(quán)利要求
1一種解決頻繁分配釋放同等大小內(nèi)存的方法,其特征在于1)記頻繁分配釋放同等大小內(nèi)存的大小為msize,內(nèi)存池鏈表的指針為plist,第n個(gè)內(nèi)存池為mpn,內(nèi)存池的起始地址為psn,結(jié)束地址為pen,內(nèi)存池的第一個(gè)free標(biāo)志的內(nèi)存在該內(nèi)存池的位置為freen;2)定義一個(gè)函數(shù)f(n)用來決定第n個(gè)內(nèi)存池的大小,f(n)值等于0或者小于0,則表示應(yīng)用程序設(shè)定了大小為msize的內(nèi)存塊的個(gè)數(shù)上限,大小為前面n-1次分配的內(nèi)存塊的個(gè)數(shù)的和;3)當(dāng)應(yīng)用程序需要大小為msize的內(nèi)存時(shí),則從內(nèi)存池鏈表的第一個(gè)內(nèi)存池開始,逐個(gè)判斷內(nèi)存池的freen是否大于f(n);如果freen小于等于f(n),表示該內(nèi)存池有空閑內(nèi)存可以分配,返回該內(nèi)存池;如果freen大于f(n),表示該內(nèi)存池沒有空閑內(nèi)存可以使用,判斷下一個(gè)內(nèi)存池;如果沒有下一個(gè)內(nèi)存池,并且f(n)>0,那么新建一個(gè)大小為F(n)的內(nèi)存池,其中F(n)=(msize+標(biāo)志位大小)*f(n);同時(shí)初始化所有的標(biāo)志位為free,初始化freen為1,然后返回該內(nèi)存池;如果f(n)<=0,則通知應(yīng)用程序已達(dá)內(nèi)存上限;4)得到有空閑內(nèi)存可以使用的內(nèi)存池以后,把該內(nèi)存池的位置為freen的內(nèi)存給應(yīng)用程序使用,同時(shí)把位置為freen的內(nèi)存的標(biāo)志設(shè)為used,然后從位置freen+1開始,逐個(gè)判斷內(nèi)存池的內(nèi)存的標(biāo)志是否為free,如果在內(nèi)存池結(jié)束前找到標(biāo)志為free的內(nèi)存,則令該內(nèi)存池的freen等于找到的標(biāo)志為free的內(nèi)存所在的位置,如果沒找到標(biāo)志為free的內(nèi)存,則令該內(nèi)存池的freen等于f(n)+1;5)當(dāng)應(yīng)用程序釋放大小為msize的內(nèi)存時(shí),則把該內(nèi)存的標(biāo)志設(shè)為free,同時(shí)判斷該內(nèi)存在所在內(nèi)存池的位置是否大于所在內(nèi)存池的freen,如果小于freen,則令freen等于該內(nèi)存在所在內(nèi)存池的位置;6)應(yīng)用程序退出的時(shí)候,銷毀內(nèi)存池鏈表中的所有內(nèi)存池。
全文摘要
本發(fā)明公開了一種解決頻繁分配釋放同等大小內(nèi)存的方法。本發(fā)明的方法通過維護(hù)一個(gè)可以擴(kuò)展的內(nèi)存池的鏈表,用函數(shù)來動(dòng)態(tài)控制內(nèi)存池鏈表中內(nèi)存池的大小和內(nèi)存池的數(shù)量。用鏈表來管理內(nèi)存池,避免了一般內(nèi)存池分配方式在內(nèi)存池不夠大的情況下,需要擴(kuò)展原來的內(nèi)存池,不能擴(kuò)展的時(shí)候不得不重新分配更大的內(nèi)存塊作為內(nèi)存池,導(dǎo)致內(nèi)存碎片增多,不斷的擴(kuò)展內(nèi)存池又導(dǎo)致了頻繁分配內(nèi)存的情況。用函數(shù)來控制分配的內(nèi)存池的大小和數(shù)量,使得應(yīng)用程序能更有效的利用內(nèi)存和節(jié)約內(nèi)存,提高應(yīng)用程序內(nèi)存的可定制性。
文檔編號(hào)G06F12/02GK1740975SQ20051006079
公開日2006年3月1日 申請(qǐng)日期2005年9月16日 優(yōu)先權(quán)日2005年9月16日
發(fā)明者卜佳俊, 陳純, 方豐平, 柯化成 申請(qǐng)人:浙江大學(xué)