專利名稱:一種內(nèi)存池管理的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及內(nèi)存管理技術(shù)領(lǐng)域,特別是指一種內(nèi)存池管理的方法。
背景技術(shù):
目前,為了避免直接hh使用系統(tǒng)調(diào)用分配內(nèi)存帶來的內(nèi)存碎片化問題,現(xiàn)有的虛擬操作系統(tǒng)都有一套內(nèi)存管理機(jī)制。該內(nèi)存管理機(jī)制一般是將底層操作系統(tǒng)的全部內(nèi)存一次性地劃分為大小不同的內(nèi)存池,再將每一內(nèi)存池中的內(nèi)存劃分為固定的大小一致的內(nèi)存塊。通常情況下,內(nèi)存池的大小是2的冪字節(jié)數(shù),并且一個內(nèi)存池的大小是它左鄰居內(nèi)存池大小的2倍,例如,一個虛擬操作系統(tǒng)有N個內(nèi)存池,一般每個內(nèi)存池中內(nèi)存塊的大小分別為2、4、8、16、32、64……1024、2048字節(jié)……。由于內(nèi)存池的個數(shù)、每個內(nèi)存池中內(nèi)存塊的大小、內(nèi)存塊的數(shù)目等參數(shù)是在虛擬操作系統(tǒng)初始化時就被固定下來的,并且這些參數(shù)在虛擬操作系統(tǒng)運行過程中不會動態(tài)改變,因此為了高效地利用內(nèi)存,必須事先統(tǒng)計各種不同內(nèi)存的使用情況,例如每種內(nèi)存的使用平均值、峰值等,根據(jù)這些統(tǒng)計數(shù)據(jù)再將內(nèi)存進(jìn)行合理地劃分。
內(nèi)存池的屬性是由內(nèi)存池描述符來描述,在內(nèi)存池描述符中記錄了該內(nèi)存池中內(nèi)存塊的大小、類型、總數(shù)量、空閑的數(shù)量等屬性。同時每個內(nèi)存池中有兩個鏈表——空閑內(nèi)存塊鏈表和占用內(nèi)存塊鏈表。
在應(yīng)用模塊申請內(nèi)存時,虛擬操作系統(tǒng)從其現(xiàn)有的內(nèi)存塊大小最接近應(yīng)用模塊所要求的內(nèi)存池中指定一內(nèi)存塊,將該內(nèi)存塊的指針返給應(yīng)用模塊,同時將該內(nèi)存塊從其所在內(nèi)存池的空閑內(nèi)存塊鏈表中取出,插入到占用內(nèi)存塊鏈表中。當(dāng)應(yīng)用模塊釋放內(nèi)存時,虛擬操作系統(tǒng)再將該內(nèi)存塊從其所在內(nèi)存池的占用內(nèi)存塊鏈表中移到空閑內(nèi)存塊鏈表中。
現(xiàn)有內(nèi)存管理機(jī)制的缺陷在于每種內(nèi)存池的數(shù)目及每個內(nèi)存池中內(nèi)存塊的數(shù)目是在虛擬操作系統(tǒng)運行前預(yù)先劃分好的,這樣在應(yīng)用模塊申請內(nèi)存時,如果某種大小的內(nèi)存塊已消耗完畢,則可能因應(yīng)用模塊申請不到內(nèi)存而造成系統(tǒng)異常,即使虛擬操作系統(tǒng)能夠從較大的內(nèi)存池中分配一內(nèi)存塊給該應(yīng)用模塊,也會造成系統(tǒng)內(nèi)存的浪費;如果應(yīng)用模塊要申請一個所有內(nèi)存池都無法提供的超大內(nèi)存塊,則會因應(yīng)用模塊申請不到內(nèi)存而造成系統(tǒng)異常。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明提供一種內(nèi)存池管理的方法,使應(yīng)用模塊隨時都可申請到與之相匹配的內(nèi)存塊,并且在系統(tǒng)剩余內(nèi)存空間允許的情況下,應(yīng)用模塊可隨時申請到超大內(nèi)存塊。
為達(dá)到上述目的本發(fā)明的技術(shù)方案是這樣實現(xiàn)的一種內(nèi)存池管理的方法,該方法包括以下步驟a、設(shè)置一個以上子內(nèi)存池,為每個子內(nèi)存池從底層操作系統(tǒng)中申請一定數(shù)目大小相同的單位內(nèi)存塊,并將同一子內(nèi)存池中的每個單位內(nèi)存塊進(jìn)一步劃分為至少一個以上大小相同的存貯內(nèi)存塊;然后將底層操作系統(tǒng)中未被劃分的內(nèi)存設(shè)置為操作系統(tǒng)內(nèi)存池;b、當(dāng)應(yīng)用模塊申請內(nèi)存時,虛擬操作系統(tǒng)先判斷所申請內(nèi)存的大小是否大于每個子內(nèi)存池所能提供的存貯內(nèi)存塊的大小,如果是,則進(jìn)入步驟c,否則,進(jìn)入步驟d;c、判斷所申請內(nèi)存的大小是否小于等于當(dāng)前操作系統(tǒng)內(nèi)存池所能提供的內(nèi)存的大小,如果是,則虛擬操作系統(tǒng)直接從操作系統(tǒng)內(nèi)存池中為該應(yīng)用模塊分配內(nèi)存塊,結(jié)束本流程,否則拒絕本次申請,結(jié)束本流程;d、虛擬操作系統(tǒng)根據(jù)所申請內(nèi)存的大小找到存貯內(nèi)存塊的大小與之相匹配的子內(nèi)存池,并判斷該子內(nèi)存池中是否有空閑的存貯內(nèi)存塊,如果是,則直接將該子內(nèi)存池中的空閑存貯內(nèi)存塊分配給應(yīng)用模塊后,將已分配的存貯內(nèi)存塊標(biāo)記為占用;否則,虛擬操作系統(tǒng)為該子內(nèi)存池從操作系統(tǒng)內(nèi)存池中動態(tài)申請一單位內(nèi)存塊后,再將該單位內(nèi)存塊中的空閑存貯內(nèi)存塊分配給應(yīng)用模塊,并將已分配的存貯內(nèi)存塊標(biāo)記為占用。
較佳地,步驟a所述子內(nèi)存池被劃分為控制塊內(nèi)存和緩沖器內(nèi)存兩種類型。
較佳地,步驟a所述的一定數(shù)目是根據(jù)每種大小內(nèi)存池的使用平均值而確定的。
較佳地,不同子內(nèi)存池中單位內(nèi)存塊所劃分的存貯內(nèi)存塊大小不同。
較佳地,所述步驟c進(jìn)一步包括當(dāng)應(yīng)用模塊申請內(nèi)存時,虛擬操作系統(tǒng)首先判斷其申請內(nèi)存的類型,在相應(yīng)類型的子內(nèi)存池中再根據(jù)其申請的大小做相應(yīng)處理。
較佳地,當(dāng)應(yīng)用模塊釋放直接從操作系統(tǒng)內(nèi)存池中申請的超大內(nèi)存塊時,將該超大內(nèi)存塊直接返回給操作系統(tǒng)內(nèi)存池。
較佳地,所述步驟c進(jìn)一步包括當(dāng)應(yīng)用模塊釋放內(nèi)存后,虛擬操作系統(tǒng)取消對該存貯內(nèi)存塊的占用標(biāo)記,并判斷其相應(yīng)子內(nèi)存池中單位內(nèi)存塊的個數(shù)是否超過初始化時所設(shè)定的一定數(shù)目,如果是,則將超出初始化數(shù)目的空閑單位內(nèi)存塊返還給底層操作系統(tǒng);否則不做處理。
應(yīng)用本發(fā)明,通過動態(tài)管理內(nèi)存塊,使應(yīng)用模塊隨時都可申請到與之匹配的內(nèi)存塊,解決了由于某種內(nèi)存塊被耗盡后,應(yīng)用模塊因申請失敗而導(dǎo)致系統(tǒng)異常的問題;同時解決了因應(yīng)用模塊被分配給大于其需求的內(nèi)存塊而導(dǎo)致系統(tǒng)內(nèi)存資源使用浪費的問題。另外,只要在虛擬操作系統(tǒng)剩余內(nèi)存空間允許的范圍內(nèi),應(yīng)用模塊可直接從操作系統(tǒng)內(nèi)存池中申請所有子內(nèi)存池都不能提供的超大內(nèi)存塊,當(dāng)應(yīng)用模塊釋放該超大內(nèi)存塊時,該超大內(nèi)存塊將直接返回給操作系統(tǒng)內(nèi)存池,應(yīng)用此方法,解決了應(yīng)用模塊因申請不到超大內(nèi)存塊而導(dǎo)致系統(tǒng)異常的問題。同時,本發(fā)明有效地避免了底層操作系統(tǒng)內(nèi)存碎片化的問題。
圖1為應(yīng)用本發(fā)明內(nèi)存池管理方法的示意圖;圖2為應(yīng)用本發(fā)明一實施例的示意圖。
具體實施例方式
為使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下對本發(fā)明做進(jìn)一步詳細(xì)說明。
圖1所示為應(yīng)用本發(fā)明內(nèi)存池管理方法的示意圖。虛擬操作系統(tǒng)設(shè)置若干個子內(nèi)存池(Subpool),并從底層操作系統(tǒng)內(nèi)存中為每個子內(nèi)存池申請一定數(shù)目的大小一致的單位內(nèi)存塊(gen),并將該gen進(jìn)一步劃分為若干個大小相同的存貯內(nèi)存塊(mem)。其中,子內(nèi)存池又分為兩種類型一種是控制塊內(nèi)存(CB POOL),用于存儲應(yīng)用模塊的控制塊等較為永久的數(shù)據(jù);另一種是緩沖器內(nèi)存(BUF POOL),用于存儲應(yīng)用模塊之間傳遞的消息數(shù)據(jù)。同時,為實現(xiàn)本發(fā)明的管理方法,使用了一些數(shù)據(jù)結(jié)構(gòu)對底層操作系統(tǒng)內(nèi)存進(jìn)行管理,如圖1中CB POOL CB為管理控制內(nèi)存的數(shù)據(jù)結(jié)構(gòu)、BUFPOOL CB為管理緩沖器內(nèi)存的數(shù)據(jù)結(jié)構(gòu)、Subpool CB為子內(nèi)存池數(shù)組,且該數(shù)組中的每一元素對應(yīng)一子內(nèi)存池。除去上述底層操作系統(tǒng)中已被劃分的內(nèi)存,將底層操作系統(tǒng)中未被劃分的內(nèi)存設(shè)置為操作系統(tǒng)內(nèi)存池(OSPOOL)。
在虛擬操作系統(tǒng)初始化時,虛擬操作系統(tǒng)從底層操作系統(tǒng)中為每個子內(nèi)存池申請若干個大小一致的gen,其申請gen的個數(shù)是根據(jù)該類內(nèi)存塊的使用平均值而定。一個gen包含若干個mem內(nèi)存塊,因此,一個gen是一個較大的內(nèi)存塊,且一個子內(nèi)存池中g(shù)en的數(shù)目是動態(tài)可變的,即一個子內(nèi)存池中單位內(nèi)存塊的個數(shù)是可變的。由于每個子內(nèi)存池最初所申請gen的數(shù)目都是該類內(nèi)存塊的使用平均值而不是峰值,所以,在初始化底層操作系統(tǒng)后,勢必會剩余一大塊未被虛擬操作系統(tǒng)“瓜分”的內(nèi)存,該剩余的內(nèi)存即為OS POOL。
在系統(tǒng)運行過程中,當(dāng)應(yīng)用模塊申請內(nèi)存時,虛擬操作系統(tǒng)根據(jù)申請內(nèi)存的類型和大小,從最合適的子內(nèi)存池中分配以mem為單位的內(nèi)存塊給應(yīng)用模塊,并同時將這塊內(nèi)存標(biāo)記為占用,相應(yīng)地,當(dāng)應(yīng)用模塊釋放內(nèi)存時,系統(tǒng)取消對該mem內(nèi)存塊的標(biāo)記。如果某個子內(nèi)存池中所有以mem為單位的內(nèi)存塊都被標(biāo)記為占用,即該子內(nèi)存池中所有的gen內(nèi)存塊都已耗凈,則虛擬操作系統(tǒng)將從OS內(nèi)存池中為該子內(nèi)存池申請一個gen內(nèi)存塊,然后繼續(xù)從該gen中為應(yīng)用模塊分配mem內(nèi)存塊。如果一個子內(nèi)存池中g(shù)en的個數(shù)超過了其初始化時的數(shù)目,并且由于應(yīng)用模塊釋放內(nèi)存使得某些gen中的mem內(nèi)存塊全部空閑,則虛擬操作系統(tǒng)將把超出初始化數(shù)目的gen返還給底層操作系統(tǒng),即系統(tǒng)總是盡量保持每個子內(nèi)存池中內(nèi)存塊gen的數(shù)目為該子內(nèi)存池的初始值。由此可見,一個子內(nèi)存池中內(nèi)存塊的數(shù)目是可動態(tài)變化的,并且虛擬操作系統(tǒng)總是以gen為單位從操作系統(tǒng)內(nèi)存池中申請或釋放內(nèi)存,gen的容量一般較大,例如可以定為10K,因此可有效地避免底層操作系統(tǒng)內(nèi)存碎片化的問題。
當(dāng)應(yīng)用模塊申請一任何子內(nèi)存池都不能提供的超大內(nèi)存塊時,系統(tǒng)將直接從OS內(nèi)存池中為該應(yīng)用模塊申請內(nèi)存塊,只要OS內(nèi)存池的剩余空間足夠大,應(yīng)用模塊的要求都會被滿足,超大內(nèi)存塊被釋放時,也是直接返還到OS內(nèi)存池中。
圖2為應(yīng)用本發(fā)明一實施例的示意圖。假設(shè)在BUF POOL中有兩個子內(nèi)存池,其每個子內(nèi)存池中mem的大小分別為2.5K和5K。圖中mem內(nèi)存塊的右下角有黑三角標(biāo)記的,代表該mem內(nèi)存塊已被應(yīng)用模塊占用,而沒有黑三角標(biāo)記的mem內(nèi)存塊,表示該內(nèi)存塊還處于空閑狀態(tài)。
如果現(xiàn)有一應(yīng)用模塊需要申請2K的緩沖區(qū)內(nèi)存,則虛擬操作系統(tǒng)首先根據(jù)應(yīng)用模塊所申請內(nèi)存塊大小定位到mem內(nèi)存塊的大小為2.5K的子內(nèi)存池中,并判斷該子內(nèi)存池中的mem內(nèi)存塊是否都被標(biāo)為占用,如果不是,則直接為其分配一個mem內(nèi)存塊,以滿足其需求,并將已分配的men內(nèi)存塊標(biāo)為占用,否則,虛擬操作系統(tǒng)先從OS POOL中為該子內(nèi)存池申請一個gen,然后再從該gen中為應(yīng)用模塊分配一個2.5K的mem內(nèi)存塊,以滿足其需求,并將已分配的men內(nèi)存塊標(biāo)為占用;當(dāng)應(yīng)用模塊釋放內(nèi)存時,取消對該mem內(nèi)存塊的標(biāo)記,如果由于應(yīng)用模塊釋放內(nèi)存而出現(xiàn)了一個完全空閑的gen,并且該子內(nèi)存池中g(shù)en的總數(shù)目又大于初始化時gen的數(shù)目,則將該空閑的gen歸還給OS POOL。
如果現(xiàn)有一應(yīng)用模塊需要申請100K的超大內(nèi)存,則虛擬操作系統(tǒng)首先判斷是否有能夠提供100K內(nèi)存塊的子內(nèi)存池,如果有,就直接為其分配100K大小的mem內(nèi)存塊,并標(biāo)記該mem內(nèi)存塊為占用,否則,判斷當(dāng)前OS POOL中的內(nèi)存是否大于等于100K,如果是,則直接從OS POOL中為該應(yīng)用模塊提供內(nèi)存塊,否則,拒絕本次應(yīng)用模塊的申請;當(dāng)該超大內(nèi)存塊時被釋放時,直接返還到OS POOL中。
以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種內(nèi)存池管理的方法,其特征在于該方法包括以下步驟a、設(shè)置一個以上子內(nèi)存池,為每個子內(nèi)存池從底層操作系統(tǒng)中申請一定數(shù)目大小相同的單位內(nèi)存塊,并將同一子內(nèi)存池中的每個單位內(nèi)存塊進(jìn)一步劃分為至少一個以上大小相同的存貯內(nèi)存塊;然后將底層操作系統(tǒng)中未被劃分的內(nèi)存設(shè)置為操作系統(tǒng)內(nèi)存池;b、當(dāng)應(yīng)用模塊申請內(nèi)存時,虛擬操作系統(tǒng)先判斷所申請內(nèi)存的大小是否大于每個子內(nèi)存池所能提供的存貯內(nèi)存塊的大小,如果是,則進(jìn)入步驟c,否則,進(jìn)入步驟d;c、判斷所申請內(nèi)存的大小是否小于等于當(dāng)前操作系統(tǒng)內(nèi)存池所能提供的內(nèi)存的大小,如果是,則虛擬操作系統(tǒng)直接從操作系統(tǒng)內(nèi)存池中為該應(yīng)用模塊分配內(nèi)存塊,結(jié)束本流程,否則拒絕本次申請,結(jié)束本流程;d、虛擬操作系統(tǒng)根據(jù)所申請內(nèi)存的大小找到存貯內(nèi)存塊的大小與之相匹配的子內(nèi)存池,并判斷該子內(nèi)存池中是否有空閑的存貯內(nèi)存塊,如果是,則直接將該子內(nèi)存池中的空閑存貯內(nèi)存塊分配給應(yīng)用模塊后,將已分配的存貯內(nèi)存塊標(biāo)記為占用;否則,虛擬操作系統(tǒng)為該子內(nèi)存池從操作系統(tǒng)內(nèi)存池中動態(tài)申請一單位內(nèi)存塊后,再將該單位內(nèi)存塊中的空閑存貯內(nèi)存塊分配給應(yīng)用模塊,并將已分配的存貯內(nèi)存塊標(biāo)記為占用。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于步驟a所述子內(nèi)存池被劃分為控制塊內(nèi)存和緩沖器內(nèi)存兩種類型。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟a所述的一定數(shù)目是根據(jù)每種大小內(nèi)存池的使用平均值而確定的。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,不同子內(nèi)存池中單位內(nèi)存塊所劃分的存貯內(nèi)存塊大小不同。
5.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述步驟c進(jìn)一步包括當(dāng)應(yīng)用模塊申請內(nèi)存時,虛擬操作系統(tǒng)首先判斷其申請內(nèi)存的類型,在相應(yīng)類型的子內(nèi)存池中再根據(jù)其申請的大小做相應(yīng)處理。
6.根據(jù)權(quán)利要求1所述的方法,其特征在于該方法進(jìn)一步包括當(dāng)應(yīng)用模塊釋放直接從操作系統(tǒng)內(nèi)存池中申請的超大內(nèi)存塊時,將該超大內(nèi)存塊直接返回給操作系統(tǒng)內(nèi)存池。
7.根據(jù)權(quán)利要求1或5所述的方法,其特征在于,所述步驟c進(jìn)一步包括當(dāng)應(yīng)用模塊釋放內(nèi)存后,虛擬操作系統(tǒng)取消對該存貯內(nèi)存塊的占用標(biāo)記,并判斷其相應(yīng)子內(nèi)存池中單位內(nèi)存塊的個數(shù)是否超過初始化時所設(shè)定的一定數(shù)目,如果是,則將超出初始化數(shù)目的空閑單位內(nèi)存塊返還給底層操作系統(tǒng);否則不做處理。
全文摘要
本發(fā)明提供一種內(nèi)存池管理的方法,包括以下步驟設(shè)置若干個子內(nèi)存池,為每個子內(nèi)存池申請一定數(shù)目大小相同的gen內(nèi)存塊,并將同一子內(nèi)存池的gen進(jìn)一步劃分為若干個大小相同的mem內(nèi)存塊,將未被劃分的內(nèi)存設(shè)置為OS內(nèi)存池;應(yīng)用模塊申請內(nèi)存時,虛擬操作系統(tǒng)先判斷其所申請內(nèi)存的大小是否大于每個子內(nèi)存池中mem的大小,如果是則直接從OS內(nèi)存池中為該應(yīng)用模塊分配內(nèi)存塊,否則根據(jù)其申請的大小找到相應(yīng)的子內(nèi)存池,并判斷該子內(nèi)存池中是否有空閑的mem,如果是則直接將該子內(nèi)存池中的空閑mem分配給應(yīng)用模塊;否則虛擬操作系統(tǒng)先為該子內(nèi)存池從OS內(nèi)存池中動態(tài)申請一個gen后,再將該gen中的空閑mem分配給應(yīng)用模塊,并將已分配的mem標(biāo)為占用。
文檔編號G06F12/08GK1527206SQ0310505
公開日2004年9月8日 申請日期2003年3月3日 優(yōu)先權(quán)日2003年3月3日
發(fā)明者石興華 申請人:華為技術(shù)有限公司