專利名稱:一種嵌入式系統(tǒng)緩沖式內(nèi)存分配方法
技術(shù)領(lǐng)域:
本發(fā)明涉及到嵌入式系統(tǒng)內(nèi)存分配策略領(lǐng)域,特別是涉及一種嵌入式系統(tǒng)緩沖式內(nèi)存分配方法。
背景技術(shù):
隨著嵌入式系統(tǒng)的發(fā)展,嵌入式系統(tǒng)的內(nèi)存分配機制的研究也越來越重要。很多時候,內(nèi)存的分配機制是影響程序運行效率的一個關(guān)鍵要素,所以這方面的問題一直以來都是嵌入式領(lǐng)域研究的重點。雖然在內(nèi)存分配機制上已經(jīng)有了很多方法和相關(guān)理論,但還是有許多需要完善的地方,還需要不斷地研究和探索。
內(nèi)存分配機制是嵌入式系統(tǒng)研究中的一個重點和難點的問題,因為它必須滿足一些特性,這些特性是嵌入式系統(tǒng)所必須的,這是難點所在。以下是必須滿足的特性(1)實時性。從實時性的角度出發(fā),要求內(nèi)存分配過程要盡可能地快。因此,在嵌入式系統(tǒng)中,不可能采用通用操作系統(tǒng)的一些復(fù)雜而完善的內(nèi)存分配策略,一般沒有段頁式的虛存管理機制;而是采用簡單、快速的內(nèi)存分配方案,其分配方案也因程序?qū)崟r性的要求而異。
(2)可靠性。嵌入式系統(tǒng)應(yīng)用的環(huán)境千變?nèi)f化,在有些特定情況下,對系統(tǒng)的可靠性要求極高,內(nèi)存分配的請求必須得到滿足,如果分配失敗則可能會帶來災(zāi)難性的后果。特別是在一些交通工具上,如果系統(tǒng)出現(xiàn)故障,那么結(jié)果是不可想象的。
(3)高效性。內(nèi)存分配要盡可能地減少浪費。不可能為了保證滿足所有的內(nèi)存分配請求而將內(nèi)存配置得很大。一方面,嵌入式系統(tǒng)對成本的要求使得內(nèi)存在其中只是一種很有限的資源;另一方面,即使不考慮成本的因素,系統(tǒng)硬件環(huán)境有限的空間和有限的板面積決定了可配置的內(nèi)存容量是很有限的。
以上的限制條件對嵌入式系統(tǒng)內(nèi)存分配機制提出的很大的挑戰(zhàn),現(xiàn)今存在的很多內(nèi)存分配機制中很少有符合以上條件的。
總體上說,現(xiàn)今有兩種內(nèi)存分配機制一是靜態(tài)分配,靜態(tài)分配是指在編譯或鏈接時將程序所需的內(nèi)存空間分配好。采用這種分配方案的程序段,其大小一般在編譯時就必須確定,因此有很大的局限性。二是動態(tài)分配,動態(tài)分配是指系統(tǒng)運行時根據(jù)需要動態(tài)地分配內(nèi)存。動態(tài)分配的缺點是過多的分配操作影響程序效率。在本發(fā)明中,采用了一種嵌入式系統(tǒng)緩沖式內(nèi)存分配方法,該方法利用數(shù)據(jù)塊緩沖池,將已經(jīng)分配的內(nèi)存置入到數(shù)據(jù)塊緩沖池中,而不是立即由系統(tǒng)回收,由于操作系統(tǒng)分配內(nèi)存、釋放內(nèi)存的系統(tǒng)調(diào)用的消耗很大。通過本發(fā)明的方法可以在數(shù)據(jù)緩沖池中直接使用空閑數(shù)據(jù)單元,直到需要時才調(diào)用系統(tǒng)內(nèi)存分配調(diào)用,這樣就能夠有效的避免過多調(diào)用操作系統(tǒng)內(nèi)存分配、內(nèi)存釋放的系統(tǒng)調(diào)用,從而提高系統(tǒng)的效率。
發(fā)明內(nèi)容
本發(fā)明的目的在于克服現(xiàn)有技術(shù)中的不足,提供一種嵌入式系統(tǒng)緩沖式分配方法。
本發(fā)明解決其技術(shù)問題采用的技術(shù)方案如下嵌入式系統(tǒng)緩沖式內(nèi)存分配方法包括以下步驟(1)定義數(shù)據(jù)塊緩沖池數(shù)據(jù)管理器的結(jié)構(gòu)包含定義數(shù)據(jù)單元尺寸、數(shù)據(jù)塊尺寸、最多可容納的數(shù)據(jù)塊數(shù)、已使用掉的塊數(shù)、塊指針數(shù)組和空閑數(shù)據(jù)鏈表的信息內(nèi)容;(2)設(shè)計內(nèi)存塊緩沖池管理器的步驟包括創(chuàng)建數(shù)據(jù)塊管理器,參數(shù)包括內(nèi)存指針(null時表示自己分配)、塊尺寸、單元尺寸和返回緩沖池管理器指針;解構(gòu)數(shù)據(jù)塊管理器,釋放其所分配的所有內(nèi)存,調(diào)用者負責(zé)外部內(nèi)存的釋放,參數(shù)為數(shù)據(jù)塊緩存池結(jié)構(gòu),并返回成功失敗標(biāo)志;從數(shù)據(jù)塊緩沖池中分配1個單元,參數(shù)為數(shù)據(jù)塊緩沖池結(jié)構(gòu),返回數(shù)據(jù)單元指針;數(shù)據(jù)單元釋放,釋放1個數(shù)據(jù)單元,返回數(shù)據(jù)塊緩沖池結(jié)構(gòu),不對1個單元釋放2次,參數(shù)為數(shù)據(jù)塊結(jié)構(gòu)和單元指針;(3)緩沖式內(nèi)存分配過程
程序需要分配內(nèi)存單元時,系統(tǒng)首先檢測緩沖池,如果緩沖池中有空閑的數(shù)據(jù)塊或數(shù)據(jù)單元,則取得此數(shù)據(jù)單元的實際地址,并將該單元從空閑鏈表中刪除;如果緩沖池中沒有可用數(shù)據(jù)單元則調(diào)用系統(tǒng)內(nèi)存分配調(diào)用為緩沖池增加分配單元,然后從緩沖池中分配;(4)緩沖式內(nèi)存釋放過程程序釋放內(nèi)存時,首先檢測緩沖池中是否還有空間容納回收的內(nèi)存單元,如果有,則將內(nèi)存單元地址鏈接到內(nèi)存單元空閑鏈表中;如果沒有空間則另建立一個緩存池,然后將回收的內(nèi)存單元地址鏈接到緩沖池的空閑鏈表中。
作為本發(fā)明的一種改進,所述步驟(2)中內(nèi)存指針為null時表示自己分配。
本發(fā)明與背景技術(shù)相比,具有的有益的效果是在本發(fā)明中,采用了一種嵌入式系統(tǒng)緩沖式內(nèi)存分配方法,該方法利用數(shù)據(jù)塊緩沖池,將已經(jīng)分配的內(nèi)存置入到數(shù)據(jù)塊緩沖池中,而不是立即由系統(tǒng)回收,由于操作系統(tǒng)分配內(nèi)存、釋放內(nèi)存的系統(tǒng)調(diào)用的消耗很大。通過本發(fā)明的方法可以在數(shù)據(jù)緩沖池中直接使用空閑數(shù)據(jù)單元,直到需要時才調(diào)用系統(tǒng)內(nèi)存分配調(diào)用,這樣就能夠有效的避免過多調(diào)用操作系統(tǒng)內(nèi)存分配、內(nèi)存釋放的系統(tǒng)調(diào)用,從而提高系統(tǒng)的效率。
圖1是本發(fā)明方法過程框圖;具體實施方式
下面結(jié)合附圖和具體實施例對本發(fā)明的內(nèi)容進行詳細描述。在實施嵌入式系統(tǒng)緩沖式內(nèi)存分配方法時,具體方式第一步定義數(shù)據(jù)塊緩沖池管理器結(jié)構(gòu),包含的內(nèi)容1、數(shù)據(jù)單元尺寸數(shù)據(jù)單元在內(nèi)存中所占空間的字節(jié)數(shù),每個數(shù)據(jù)單元是內(nèi)存分配的最小單元;2、數(shù)據(jù)塊尺寸數(shù)據(jù)塊中單元數(shù)據(jù)的容納量,多個數(shù)據(jù)單元組合在一起形成一個數(shù)據(jù)塊,數(shù)據(jù)塊的大小是一定的,所以在一個塊中的數(shù)據(jù)單元個數(shù)也是一定的;3、最多可容納的數(shù)據(jù)塊數(shù)緩沖池中最多容納的塊數(shù),若緩沖池中數(shù)據(jù)塊超過限制,則另外開辟緩沖池;4、已使用掉的塊數(shù)緩沖池中已被使用掉的數(shù)據(jù)塊數(shù);5、塊指針數(shù)組緩沖池中的指向所有數(shù)據(jù)塊的指針數(shù)組;6、空閑數(shù)據(jù)鏈表緩沖池中連接所有空閑數(shù)據(jù)單元的鏈表;第二步內(nèi)存塊緩沖池管理器功能設(shè)計(一)創(chuàng)建數(shù)據(jù)塊緩沖池管理器,參數(shù)包括內(nèi)存指針(null時表示自己分配)、塊尺寸、單元尺寸、返回緩沖池管理器指針?,F(xiàn)象過程如下1、檢驗參數(shù)合法性。
2、單元尺寸4字節(jié)對齊,計算每個塊中的單元數(shù)。對內(nèi)存指針進行4字節(jié)對齊或者分配內(nèi)存指針。
3、初始化數(shù)據(jù)塊緩沖池結(jié)構(gòu),包括單元尺寸和塊尺寸。設(shè)置第1個內(nèi)存塊的指針。如果內(nèi)存是外來的,設(shè)置塊已用標(biāo)志(已用為0),表示不能增加塊;否則,已用塊數(shù)設(shè)為1。
4、創(chuàng)建空閑鏈表,將塊內(nèi)所有單元添加到鏈表中,最后一個單元處于鏈表的最前面。
5、返回數(shù)據(jù)塊緩沖池管理器指針。
(二)解構(gòu)數(shù)據(jù)塊緩沖池管理器,釋放它所分配的所有內(nèi)存,調(diào)用者負責(zé)外部內(nèi)存的釋放。參數(shù)為數(shù)據(jù)塊緩沖池管理器。返回成功失敗標(biāo)志。
1、參數(shù)合法性檢測。
2、刪除單向鏈表(設(shè)鏈表指針為NULL)。
3、如果塊是動態(tài)分配的,釋放它們。
4、釋放結(jié)構(gòu)數(shù)據(jù)塊緩沖池結(jié)構(gòu)。
(三)從數(shù)據(jù)塊緩沖池中分配1個單元。參數(shù)為數(shù)據(jù)塊緩沖池結(jié)構(gòu),返回數(shù)據(jù)單元指針。
1、參數(shù)合法性檢測。
2、判斷空閑鏈表是否為空(是否為NULL)。如果為空,判斷是否可以動態(tài)分配塊,如果不能,返回失敗;如果可以動態(tài)分配塊,則分配1個塊,執(zhí)行與創(chuàng)建數(shù)據(jù)塊緩沖池結(jié)構(gòu)一樣的操作。
3、從空閑鏈表中分配第1個單元,返回其指針。
注意這里有一個小技巧,即數(shù)據(jù)單元在空閑時其中存放空閑鏈表的節(jié)點信息,而分配后則存放數(shù)據(jù)內(nèi)容。
(四)釋放1個數(shù)據(jù)單元,返回數(shù)據(jù)塊緩沖池管理器。不對1個單元釋放2次。參數(shù)為數(shù)據(jù)塊緩沖池結(jié)構(gòu)和數(shù)據(jù)單元指針。
1、參數(shù)合法性檢測。
2、地址比較,判斷數(shù)據(jù)單元屬于哪個塊。
3、判斷數(shù)據(jù)單元的內(nèi)容是否為空閑鏈表節(jié)點信息(也就是塊內(nèi)某單元的地址),從而確定是否為2次釋放。
4、將該數(shù)據(jù)單元插入到空閑鏈表的前面。
5、引用該單元的指針設(shè)為NULL。
第三步緩沖式內(nèi)存分配過程程序需要分配內(nèi)存單元時,系統(tǒng)首先檢測緩沖池,如果緩沖池中有空閑的數(shù)據(jù)塊或數(shù)據(jù)單元,則取得此數(shù)據(jù)單元的實際地址,并將該單元從空閑鏈表中刪除。如果緩沖池中沒有可用數(shù)據(jù)單元則調(diào)用系統(tǒng)內(nèi)存分配調(diào)用為緩沖池增加分配單元,然后從緩沖池中分配。
第四步緩沖式內(nèi)存釋放過程程序釋放內(nèi)存時,首先檢測緩沖池中是否還有空間容納回收的內(nèi)存單元,如果有,則將內(nèi)存單元地址鏈接到內(nèi)存單元空閑鏈表中。如果沒有空間則另建立一個緩存池,然后將回收的內(nèi)存單元地址鏈接到緩沖池的空閑鏈表中。
最后,還需要注意的是,以上列舉的僅是本發(fā)明的具體實施例子。顯然,本發(fā)明不限于以上實施例子,還可以有許多變形。本領(lǐng)域的普通技術(shù)人員能從本發(fā)明公開的內(nèi)容直接導(dǎo)出或聯(lián)想到的所有變形,均應(yīng)認(rèn)為是本發(fā)明的保護范圍。
權(quán)利要求
1.一種嵌入式系統(tǒng)緩沖式內(nèi)存分配方法,其特征在于,包括以下步驟(1)定義數(shù)據(jù)塊緩沖池數(shù)據(jù)管理器的結(jié)構(gòu)定義數(shù)據(jù)單元尺寸、數(shù)據(jù)塊尺寸、最多可容納的數(shù)據(jù)塊數(shù)、已使用掉的塊數(shù)、塊指針數(shù)組和空閑數(shù)據(jù)鏈表的信息內(nèi)容;(2)設(shè)計內(nèi)存塊緩沖池管理器的步驟,包括創(chuàng)建數(shù)據(jù)塊管理器,參數(shù)包括內(nèi)存指針、塊尺寸、單元尺寸和返回緩沖池管理器指針;解構(gòu)數(shù)據(jù)塊管理器,釋放其所分配的所有內(nèi)存,調(diào)用者負責(zé)外部內(nèi)存的釋放,參數(shù)為數(shù)據(jù)塊緩存池結(jié)構(gòu),并返回成功失敗標(biāo)志;從數(shù)據(jù)塊緩沖池中分配1個單元,參數(shù)為數(shù)據(jù)塊緩沖池結(jié)構(gòu),返回數(shù)據(jù)單元指針;數(shù)據(jù)單元釋放,釋放1個數(shù)據(jù)單元,返回數(shù)據(jù)塊緩沖池結(jié)構(gòu),不對1個單元釋放2次,參數(shù)為數(shù)據(jù)塊結(jié)構(gòu)和單元指針;(3)緩沖式內(nèi)存分配過程程序需要分配內(nèi)存單元時,系統(tǒng)首先檢測緩沖池,如果緩沖池中有空閑的數(shù)據(jù)塊或數(shù)據(jù)單元,則取得此數(shù)據(jù)單元的實際地址,并將該單元從空閑鏈表中刪除;如果緩沖池中沒有可用數(shù)據(jù)單元則調(diào)用系統(tǒng)內(nèi)存分配調(diào)用為緩沖池增加分配單元,然后從緩沖池中分配;(4)緩沖式內(nèi)存釋放過程程序釋放內(nèi)存時,首先檢測緩沖池中是否還有空間容納回收的內(nèi)存單元,如果有,則將內(nèi)存單元地址鏈接到內(nèi)存單元空閑鏈表中;如果沒有空間則另建立一個緩存池,然后將回收的內(nèi)存單元地址鏈接到緩沖池的空閑鏈表中。
2.根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)緩沖式內(nèi)存分配方法,其特征在于,所述步驟(2)中內(nèi)存指針為null時表示自己分配。
全文摘要
本發(fā)明涉及嵌入式系統(tǒng)內(nèi)存分配策略領(lǐng)域,旨在提供一種嵌入式系統(tǒng)緩沖式內(nèi)存分配方法。該方法包括定義數(shù)據(jù)塊緩沖池數(shù)據(jù)管理器的結(jié)構(gòu)、設(shè)計內(nèi)存塊緩沖池管理器的步驟、緩沖式內(nèi)存分配過程和緩沖式內(nèi)存釋放過程的步驟。在本發(fā)明中,采用了一種嵌入式系統(tǒng)緩沖式內(nèi)存分配方法,該方法利用數(shù)據(jù)塊緩沖池,將已經(jīng)分配的內(nèi)存置入到數(shù)據(jù)塊緩沖池中,而不是立即由系統(tǒng)回收,由于操作系統(tǒng)分配內(nèi)存、釋放內(nèi)存的系統(tǒng)調(diào)用的消耗很大。通過本發(fā)明的方法可以在數(shù)據(jù)緩沖池中直接使用空閑數(shù)據(jù)單元,直到需要時才調(diào)用系統(tǒng)內(nèi)存分配調(diào)用,這樣就能夠有效的避免過多調(diào)用操作系統(tǒng)內(nèi)存分配、內(nèi)存釋放的系統(tǒng)調(diào)用,從而提高系統(tǒng)的效率。
文檔編號G06F9/46GK1851676SQ20061005162
公開日2006年10月25日 申請日期2006年5月25日 優(yōu)先權(quán)日2006年5月25日
發(fā)明者陳天洲, 沙峰, 謝斌, 趙懿 申請人:浙江大學(xué)