專利名稱:一種嵌入式系統(tǒng)內(nèi)存管理的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種內(nèi)存的管理方法,尤其是一種應(yīng)用于數(shù)字電視機(jī)頂盒、PDA等嵌入式系統(tǒng)的內(nèi)存管理方法。
背景技術(shù):
嵌入式系統(tǒng)的應(yīng)用非常廣泛。由于嵌入式系統(tǒng)資源的限制,并且內(nèi)存的使用頻率很高,所以如何高效的使用內(nèi)存成為人們非常關(guān)心的一個(gè)問(wèn)題。這就使嵌入式系統(tǒng)內(nèi)存管理的方法顯得十分重要。
目前,在嵌入式系統(tǒng)中,主要采用兩種內(nèi)存分配方法,一種是固定長(zhǎng)度的內(nèi)存分配策略,另一種是可變長(zhǎng)度的內(nèi)存分配策略。
對(duì)于可變長(zhǎng)度的內(nèi)存分配策略,該方法將空閑的內(nèi)存塊以鏈表的形式排列,當(dāng)用戶申請(qǐng)大小為size的內(nèi)存時(shí),就從鏈表的頭部開始搜索空閑內(nèi)存塊,若空閑內(nèi)存塊小于size,則繼續(xù)搜索,直到找到足夠大小的空閑內(nèi)存塊,分配給用戶。用戶釋放內(nèi)存時(shí),就將釋放的內(nèi)存塊放在鏈表的尾部。
這種內(nèi)存分配策略有明顯的缺點(diǎn)。由于在嵌入式系統(tǒng)中,內(nèi)存的分配與釋放非常頻繁,而且存在大量小內(nèi)存的分配。使用這種內(nèi)存管理方法,經(jīng)過(guò)一段時(shí)間的運(yùn)行后,小塊內(nèi)存將會(huì)散布在整個(gè)內(nèi)存,必然產(chǎn)生大量的內(nèi)存碎片。這時(shí),雖然系統(tǒng)還有很多剩余內(nèi)存,用戶卻申請(qǐng)不到內(nèi)存,造成大量的內(nèi)存浪費(fèi),甚至導(dǎo)致系統(tǒng)崩潰。
第二種是固定長(zhǎng)度的內(nèi)存分配策略。該方法是先把內(nèi)存劃分為幾個(gè)區(qū),每個(gè)區(qū)又劃分為大小相等的內(nèi)存塊。例如,第一個(gè)內(nèi)存區(qū)每個(gè)內(nèi)存塊為16字節(jié),第二個(gè)內(nèi)存區(qū)每個(gè)內(nèi)存塊為32字節(jié),第三個(gè)內(nèi)存區(qū)每個(gè)內(nèi)存塊為64字節(jié),等等。當(dāng)用戶申請(qǐng)大小為size的內(nèi)存時(shí),掃描各個(gè)內(nèi)存區(qū),找到不小于size的最小的內(nèi)存塊所在的區(qū),從該區(qū)中取出一個(gè)內(nèi)存塊分配給用戶。用戶釋放內(nèi)存時(shí),再將該內(nèi)存塊歸還其所在的區(qū)。
這種方法的缺點(diǎn)是,如果滿足條件的內(nèi)存區(qū)的內(nèi)存塊已經(jīng)用完,則內(nèi)存申請(qǐng)失敗。即使其它區(qū)還有更大的內(nèi)存塊,也不會(huì)分配給用戶。這樣,使得內(nèi)存不能得到充分利用,造成大量浪費(fèi)。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問(wèn)題在于提出一種嵌入式系統(tǒng)的內(nèi)存管理方法,可以充分的利用系統(tǒng)的內(nèi)存資源,減少系統(tǒng)由于內(nèi)存而引起的系統(tǒng)崩潰。
一種嵌入式系統(tǒng)內(nèi)存管理的方法,包括如下步驟步驟一、嵌入式系統(tǒng)的內(nèi)存管理模塊,從內(nèi)存中劃分出一個(gè)區(qū)域作為內(nèi)存池;步驟二、當(dāng)用戶申請(qǐng)的內(nèi)存大于設(shè)定的閾值時(shí),則為大內(nèi)存申請(qǐng),執(zhí)行步驟三;否則,為小內(nèi)存申請(qǐng),執(zhí)行步驟四;步驟三、用戶申請(qǐng)的是大內(nèi)存,內(nèi)存管理模塊就向系統(tǒng)申請(qǐng)為用戶在內(nèi)存池以外的區(qū)域分配一塊內(nèi)存,用完后,釋放該內(nèi)存;步驟四、用戶申請(qǐng)的是小內(nèi)存,內(nèi)存管理模塊就在內(nèi)存池中為用戶分配一塊內(nèi)存,用完后,歸還內(nèi)存池。
本發(fā)明所述的針對(duì)嵌入式系統(tǒng)的內(nèi)存管理方法,通過(guò)將小內(nèi)存集中于內(nèi)存池中分配,大內(nèi)存單獨(dú)申請(qǐng),有效減少由于大量小內(nèi)存分配而產(chǎn)生的內(nèi)存碎片;通過(guò)內(nèi)存分配服務(wù)線程使得對(duì)公共內(nèi)存的數(shù)據(jù)保護(hù)和管理得以實(shí)現(xiàn)。
圖1是本發(fā)明方法的流程示意圖;圖2是本發(fā)明小內(nèi)存分配的流程示意圖;圖3是本發(fā)明內(nèi)存池結(jié)構(gòu)的示意圖。
具體實(shí)施例方式
在嵌入式系統(tǒng)(如數(shù)字電視機(jī)頂盒或PDA或手機(jī)等系統(tǒng))中,內(nèi)存的使用頻率非常高,大量的小內(nèi)存分配會(huì)造成內(nèi)存產(chǎn)生很多碎片。本發(fā)明的內(nèi)存分配策略是將小內(nèi)存分配集中在內(nèi)存的某一區(qū)域(內(nèi)存池),避免使小塊內(nèi)存散布在整個(gè)內(nèi)存中,這樣可以有效的減少內(nèi)存碎片的產(chǎn)生。如圖1所示,具體方法如下步驟一、嵌入式系統(tǒng)的內(nèi)存管理模塊,從內(nèi)存中劃分出一個(gè)區(qū)域作為內(nèi)存池;步驟二、當(dāng)用戶申請(qǐng)的內(nèi)存大于設(shè)定的閾值時(shí),則為大內(nèi)存申請(qǐng),執(zhí)行步驟三;否則,為小內(nèi)存申請(qǐng),執(zhí)行步驟四;步驟三、用戶申請(qǐng)的是大內(nèi)存,內(nèi)存管理模塊就向系統(tǒng)申請(qǐng)為用戶在內(nèi)存池以外的區(qū)域分配一塊內(nèi)存,用完后,釋放該內(nèi)存;步驟四、用戶申請(qǐng)的是小內(nèi)存,內(nèi)存管理模塊就在內(nèi)存池中為用戶分配一塊內(nèi)存,用完后,歸還內(nèi)存池。
當(dāng)用戶申請(qǐng)大小為size的內(nèi)存時(shí),內(nèi)存管理模塊根據(jù)size的大小不同,以一定的閾值作為界定標(biāo)準(zhǔn),分為大內(nèi)存申請(qǐng)和小內(nèi)存申請(qǐng)來(lái)分別處理。size大于閾值的作為大內(nèi)存來(lái)處理,小于閾值的作為小內(nèi)存來(lái)處理。
閾值的大小根據(jù)嵌入式系統(tǒng)的不同和應(yīng)用的場(chǎng)合不同而可以有不同的設(shè)定,根據(jù)具體小內(nèi)存申請(qǐng)的情況,取值范圍一般為32--256之間,一般為2n字節(jié),比如,對(duì)于數(shù)字電視機(jī)頂盒可以為256字節(jié),對(duì)于手機(jī)可以為128字節(jié)。
內(nèi)存池的大小根據(jù)閾值的大小、用戶申請(qǐng)小內(nèi)存的數(shù)量和系統(tǒng)內(nèi)存總量設(shè)定,發(fā)明所述的內(nèi)存池的大小為2--16K字節(jié),如對(duì)于數(shù)字電視機(jī)頂盒可以取8K字節(jié)。
當(dāng)用戶申請(qǐng)的是大內(nèi)存時(shí),內(nèi)存管理模塊就向系統(tǒng)申請(qǐng)為用戶在內(nèi)存池以外的區(qū)域分配一塊內(nèi)存,內(nèi)存用完后直接釋放。由于所有的大內(nèi)存的申請(qǐng)全部集中在內(nèi)存池外,這樣既有利于成功的分配,又可以避免大量的小內(nèi)存申請(qǐng)而產(chǎn)生碎片,提高了內(nèi)存的利用效率。
如果僅將小內(nèi)存的分配集中在內(nèi)存池中,仍采用原有的內(nèi)存管理方法來(lái)管理,雖然可以起到一定的效果,但是并不能充分利用內(nèi)存池的資源。因此,本發(fā)明中內(nèi)存管理模塊可以用一個(gè)內(nèi)存管理鏈表來(lái)管理這個(gè)內(nèi)存池。
如圖2所示,在內(nèi)存池中,每一段已分配的內(nèi)存或空閑內(nèi)存的前8個(gè)字節(jié)作為內(nèi)存管理鏈表的一個(gè)節(jié)點(diǎn)。該節(jié)點(diǎn)記錄了這段內(nèi)存的狀態(tài)STATE(已分配或空閑)、大小SIZE、這段內(nèi)存所在的內(nèi)存池的編號(hào)、下一節(jié)點(diǎn)的地址等信息。圖2中A表示內(nèi)存管理列表的節(jié)點(diǎn),B表示用戶實(shí)際占用的內(nèi)存,圖中的箭頭表示NEXT中存儲(chǔ)的是下一節(jié)點(diǎn)的地址信息。
通過(guò)以上的內(nèi)存管理鏈表可以方便的監(jiān)視內(nèi)存的使用情況,完成內(nèi)存的分配和回收。
如圖3所示是本發(fā)明小內(nèi)存分配的流程示意圖,在內(nèi)存池中分配時(shí),內(nèi)存管理模塊將從第一個(gè)內(nèi)存池開始逐個(gè)檢查。找到有空閑空間的內(nèi)存池后,內(nèi)存管理模塊在該內(nèi)存池范圍內(nèi)搜索內(nèi)存管理鏈表,檢查是否有滿足需求空閑空間。如果有,則分配給用戶,如果沒(méi)有,則繼續(xù)檢查下一個(gè)內(nèi)存池。如果當(dāng)前所有的內(nèi)存池都沒(méi)有滿足需求空閑空間,內(nèi)存管理模塊將向系統(tǒng)申請(qǐng)?jiān)黾右粋€(gè)內(nèi)存池,如果申請(qǐng)成功,則在新內(nèi)存池中為用戶分配內(nèi)存,如果申請(qǐng)失敗,則返回內(nèi)存分配失敗信息。
具體包括如下步驟步驟40、內(nèi)存管理模塊將從第一個(gè)內(nèi)存池開始;步驟41、判斷該內(nèi)存池中是否存在空閑內(nèi)存空間;如果存在,則執(zhí)行步驟42;否則執(zhí)行步驟43;步驟42、在該內(nèi)存池中搜索內(nèi)存管理鏈表,根據(jù)鏈表判斷是否存在滿足需求的內(nèi)存空間,如果存在,則將內(nèi)存分配給用戶,將剩余的內(nèi)存添加到鏈表中,結(jié)束分配過(guò)程;否則執(zhí)行步驟43;
步驟43、判斷該內(nèi)存池是否為最后一個(gè)內(nèi)存池,如果不是,則檢查下一個(gè)內(nèi)存池,執(zhí)行步驟41;如果是,則執(zhí)行步驟44;步驟44、向系統(tǒng)申請(qǐng),增加一個(gè)新的內(nèi)存池;如果成功,則在新的內(nèi)存池中,將內(nèi)存分配給用戶,將剩余的內(nèi)存添加到鏈表中,結(jié)束分配過(guò)程;否則,提示用戶內(nèi)存分配失敗,結(jié)束分配過(guò)程。
對(duì)于每一個(gè)內(nèi)存池都按其建立的順序,分配一個(gè)數(shù)字來(lái)區(qū)分不同的內(nèi)存池,比如,最先建立的內(nèi)存池的標(biāo)號(hào)為1;第二個(gè)建立的內(nèi)存池標(biāo)號(hào)為2,依次類推。所述的步驟40和步驟43的循環(huán)就是遍歷所有的內(nèi)存池一次,判斷是否是所有的內(nèi)存池都已滿或都不存在滿足需求的空閑內(nèi)存,作為是否建立新的內(nèi)存池的條件。
如果內(nèi)存池中存在的空閑空間與用戶請(qǐng)求的內(nèi)存空間相同,則直接將該內(nèi)存分配給用戶,并修改鏈表中對(duì)應(yīng)節(jié)點(diǎn)的狀態(tài)。
如果內(nèi)存池中存在的空閑空間大于用戶請(qǐng)求的內(nèi)存,則分配給用戶其所請(qǐng)求的大小的內(nèi)存空間,同時(shí)更改內(nèi)存管理鏈表中該段空閑內(nèi)存的表項(xiàng),狀態(tài)改為已占用,大小改為用戶請(qǐng)求的大小,NEXT指向剩余的內(nèi)存空間;增加一個(gè)剩余的內(nèi)存空間的表項(xiàng),狀態(tài)為未占用,大小為剩余的可用空間大小,NEXT指向原該段空閑內(nèi)存NEXT的指向的地址。
為了避免不必要的內(nèi)存管理鏈表的反復(fù)更改,如果空閑的內(nèi)存空間比用戶請(qǐng)求的空間大16個(gè)字節(jié)以內(nèi),則直接將該段內(nèi)存分配給用戶使用,不在將剩余的內(nèi)存加入到鏈表中,以此來(lái)提高小內(nèi)存處理的效率。
用戶釋放內(nèi)存時(shí),內(nèi)存管理模塊根據(jù)用戶釋放的內(nèi)存空間地址,在內(nèi)存管理鏈表中找到相應(yīng)的節(jié)點(diǎn),修改該節(jié)點(diǎn)的記錄信息,將這段內(nèi)存標(biāo)記為空閑,并檢查內(nèi)存池中與其相鄰的內(nèi)存空間。如果與其相鄰的內(nèi)存空間為空閑空間,并且與要釋放的內(nèi)存空間在同一個(gè)內(nèi)存池中,則合并它們,以滿足以后的內(nèi)存分配的需要。然后檢查這個(gè)內(nèi)存池,如果該內(nèi)存池已經(jīng)全部被釋放,則將該內(nèi)存池占用的內(nèi)存空間歸還系統(tǒng)。
具體包括如下步驟步驟45、內(nèi)存管理模塊根據(jù)用戶釋放的內(nèi)存空間地址,在內(nèi)存管理鏈表中找到相應(yīng)的節(jié)點(diǎn);步驟46、判斷與待回收的內(nèi)存空間相鄰的內(nèi)存空間是否為空閑空間;如果是,則執(zhí)行步驟47;否則,修改該節(jié)點(diǎn)的記錄信息,將這段內(nèi)存標(biāo)記為空閑,執(zhí)行步驟48;步驟47、將待回收的內(nèi)存空間與相鄰的空閑內(nèi)存空間合并,重新建立新的鏈表單元,狀態(tài)為空閑,大小為合并后的空閑空間,NEXT指向整個(gè)空閑空間接下來(lái)的內(nèi)存地址;步驟48、判斷是否內(nèi)存池中所有的內(nèi)存空間均為空閑,如果是,則釋放該內(nèi)存池;否則結(jié)束釋放過(guò)程。
最后所應(yīng)說(shuō)明的是以上實(shí)施例僅用以說(shuō)明而非限制本發(fā)明的技術(shù)方案,盡管參照上述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解依然可以對(duì)本發(fā)明進(jìn)行修改或者等同替換,而不脫離本發(fā)明的精神和范圍的任何修改或局部替換,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
1.一種嵌入式系統(tǒng)內(nèi)存管理的方法,其特征在于包括如下步驟步驟一、嵌入式系統(tǒng)的內(nèi)存管理模塊,從內(nèi)存中劃分出一個(gè)區(qū)域作為內(nèi)存池;步驟二、當(dāng)用戶申請(qǐng)的內(nèi)存大于設(shè)定的閾值時(shí),則為大內(nèi)存申請(qǐng),執(zhí)行步驟三;否則,為小內(nèi)存申請(qǐng),執(zhí)行步驟四;步驟三、用戶中請(qǐng)的是大內(nèi)存,內(nèi)存管理模塊就向系統(tǒng)申請(qǐng)為用戶在內(nèi)存池以外的區(qū)域分配一塊內(nèi)存,用完后,釋放該內(nèi)存;步驟四、用戶申請(qǐng)的是小內(nèi)存,內(nèi)存管理模塊就在內(nèi)存池中為用戶分配一塊內(nèi)存,用完后,歸還內(nèi)存池。
2.根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)內(nèi)存管理的方法,其特征在于閾值的大小根據(jù)嵌入式系統(tǒng)的不同和應(yīng)用的場(chǎng)合不同而可以有不同的設(shè)定,取值范圍一般為32——256字節(jié)間。
3.根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)內(nèi)存管理的方法,其特征在于所述的內(nèi)存池的大小為2——16K字節(jié)。
4.根據(jù)權(quán)利要求3所述的嵌入式系統(tǒng)內(nèi)存管理的方法,其特征在于所述的所有的內(nèi)存池大小相同。
5.根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)內(nèi)存管理的方法,其特征在于所述的內(nèi)存池通過(guò)一個(gè)內(nèi)存管理鏈表來(lái)管理,在內(nèi)存池中,每一段已分配的內(nèi)存或空閑內(nèi)存的前8個(gè)字節(jié)作為內(nèi)存管理鏈表的一個(gè)節(jié)點(diǎn)。該節(jié)點(diǎn)的信息至少包括該段內(nèi)存的狀態(tài)STATE、大小SIZE和下一節(jié)點(diǎn)的地址等信息。
6.根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)內(nèi)存管理的方法,其特征在于所述的步驟四,包括如下步驟步驟40、內(nèi)存管理模塊將從第一個(gè)內(nèi)存池開始;步驟41、判斷該內(nèi)存池中是否存在空閑內(nèi)存空間;如果存在,則執(zhí)行步驟42;否則執(zhí)行步驟43;步驟42、在該內(nèi)存池中搜索內(nèi)存管理鏈表,根據(jù)鏈表判斷是否存在滿足需求的內(nèi)存空間,如果存在,則將內(nèi)存分配給用戶,將剩余的內(nèi)存添加到鏈表中,結(jié)束分配過(guò)程;否則執(zhí)行步驟43;步驟43、判斷該內(nèi)存池是否為最后一個(gè)內(nèi)存池,如果不是,則檢查下一個(gè)內(nèi)存池,執(zhí)行步驟41;如果是,則執(zhí)行步驟44;步驟44、向系統(tǒng)申請(qǐng),增加一個(gè)新的內(nèi)存池;如果成功,則在新的內(nèi)存池中,將內(nèi)存分配給用戶,將剩余的內(nèi)存添加到鏈表中,結(jié)束分配過(guò)程;否則,提示用戶內(nèi)存分配失敗,結(jié)束分配過(guò)程。
7.根據(jù)權(quán)利要求6所述的嵌入式系統(tǒng)內(nèi)存管理的方法,其特征在于所述的步驟42中,如果空閑的內(nèi)存空間比用戶請(qǐng)求的空間大16個(gè)字節(jié)以內(nèi),則直接將該段內(nèi)存分配給用戶使用。
8.根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)內(nèi)存管理的方法,其特征在于所述的步驟四中,回收內(nèi)存包括步驟45、內(nèi)存管理模塊根據(jù)用戶釋放的內(nèi)存空間地址,在內(nèi)存管理鏈表中找到相應(yīng)的節(jié)點(diǎn);步驟46、判斷與待回收的內(nèi)存空間相鄰的內(nèi)存空間是否為空閑空間;如果是,則執(zhí)行步驟47;否則,修改該節(jié)點(diǎn)的記錄信息,將這段內(nèi)存標(biāo)記為空閑,執(zhí)行步驟48;步驟47、將待回收的內(nèi)存空間與相鄰的空閑內(nèi)存空間合并,重新建立新的鏈表單元,狀態(tài)為空閑,大小為合并后的空閑空間,NEXT指向整個(gè)空閑空間接下來(lái)的內(nèi)存地址;步驟48、判斷是否內(nèi)存池中所有的內(nèi)存空間均為空閑,如果是,則釋放該內(nèi)存池;否則結(jié)束釋放過(guò)程。
全文摘要
本發(fā)明公開了一種嵌入式系統(tǒng)內(nèi)存管理的方法,包括如下步驟嵌入式系統(tǒng)的內(nèi)存管理模塊,從內(nèi)存中劃分出一個(gè)區(qū)域作為內(nèi)存池;當(dāng)用戶申請(qǐng)的內(nèi)存大于設(shè)定的閾值時(shí),則為大內(nèi)存申請(qǐng),則內(nèi)存管理模塊就向系統(tǒng)申請(qǐng)為用戶在內(nèi)存池以外的區(qū)域分配一塊內(nèi)存,用完后,釋放該內(nèi)存;否則,為小內(nèi)存申請(qǐng),內(nèi)存管理模塊就在內(nèi)存池中為用戶分配一塊內(nèi)存,用完后,歸還內(nèi)存池。本發(fā)明所述的針對(duì)嵌入式系統(tǒng)的內(nèi)存管理方法,通過(guò)將小內(nèi)存集中于內(nèi)存池中分配,大內(nèi)存單獨(dú)申請(qǐng),有效減少由于大量小內(nèi)存分配而產(chǎn)生的內(nèi)存碎片。
文檔編號(hào)G06F12/02GK1635482SQ20031011034
公開日2005年7月6日 申請(qǐng)日期2003年12月29日 優(yōu)先權(quán)日2003年12月29日
發(fā)明者王軍 申請(qǐng)人:北京中視聯(lián)數(shù)字系統(tǒng)有限公司