專利名稱:嵌入式實時操作系統中內存釋放的方法
技術領域:
本發明涉及計算機領域,具體地說,涉及計算機領域中的嵌入式實時多任務操作系統中的內存釋放。
背景技術:
嵌入式實時操作系統一般由任務調度管理、時間管理、任務同步和通信、內存管理等幾部分組成。因為實時操作系統對內存的依賴性很強,因此內存管理作為操作系統的核心就顯得很重要。
現在常用的固定大小內存釋放方法是使用的HEAD(內存頭)釋放方法和二分法,其具體方法分別如下預先向操作系統申請一塊大的內存區,將該內存區劃分為若干內存池,每個內存池中內存塊的大小固定,各種大小的內存塊的數量可根據需要配置。
根據實際情況可以將緩沖池分為64,128,256,512,1024,2048,4096,8192八種大小,每種大小的緩沖池用循環隊列來進行管理,提供申請內存和釋放內存的接口。申請內存時根據申請內存的大小選擇管理隊列,從隊列的頭摘取一個緩沖區返回指針給申請者,釋放時將內存追加到隊列的尾部。
內存塊劃分的情況和緩沖池POOL的結構如附圖1所示。
附圖2所示是內存的操作維護算法圖。內存隊列是一個簡單的循環隊列,申請時從隊列頭取一空閑塊,歸還時放在列尾。由于內存隊列是系統每個任務都會申請和歸還的,設置了一個信號量來互斥。為了提高效率,內存隊列采用二級索引內存塊的大小經過簡單的移位得到一級索引值,一級索引值即為內存隊列的編號。
HEAD釋放方法歸還內存時,從內存塊的HEAD中找到相應的緩沖池POOL及其對應的內存隊列,將要釋放的內存的指針值放入相應內存隊列的尾指針。
二分法釋放方法
通過對被釋放的內存塊的地址,采用二分法進行查找比較后,能正確釋放所需釋放的內存塊。
現有技術中的HEAD釋放方法,由于必須通過內存塊的HEAD才能正確的釋放所需要釋放的內存塊,而HEAD經常由于內存越界而被破壞,這樣當HEAD被破壞的時候就會出現釋放失敗的情況。而采用二分法釋放內存時,由于進行查找比較操作,會耗費比較多的時間,這樣在實際釋放時對釋放的效率會產生一定的影響。
發明內容
本發明所要解決的技術問題是提供一種新的內存釋放方法,能克服現有技術中的HEAD釋放方法因HEAD被破壞導致釋放失敗的缺點,相對于二分法提高了內存的釋放效率,而且具有伸縮性,可適應不同規模的嵌入式系統。
本發明的技術方案為1、一種嵌入式實時操作系統中內存釋放的方法,包括1.1預先在系統中劃出一塊內存區,設大小為X;1.2把劃出的內存區根據需要設置成大小為m,2m,4m,8m,16m...2km的K種內存池,不同大小的內存池分別有nk塊可供分配;1.3在系統初始化的時候,建立一個索引,索引指向內存塊所屬的內存池的位置;建立索引的方法可以是首先根據內存塊的大小和塊數求K個內存池的最大公約數,即求n0,2n1,4n2,8n3,16n4,32n5...2k-1nk-1這K個數字的最大公約數S,然后根據S和m以及X的值建立一個索引,索引的長度為X/(S×m)。
1.4當程序需要內存塊時,根據所需的內存塊大小,首先在含有此大小內存塊的描述數組中查找有沒有空置出來的塊,如果有,則按順序分配給需要的程序;如果沒有,則從內存區中按順序申請內存塊,并根據申請內存塊的大小在含有此大小的內存塊的描述數組尾部添加,然后分配,同時修改描述數組中該塊內存標識為已經分配;1.5在釋放內存的時候,先求得索引的下標,通過索引確定被釋放的內存塊屬于哪個內存池;然后進一步得到被釋放內存塊在內存池中的位置,最后釋放。
求得索引的下標的方法可以是用釋放時傳入的釋放地址*p2減去整個內存區的起始地址*p1所得差值再對(S×m)取模,所得的值就是索引的下標。
得到被釋放內存塊在內存池中的位置的方法可以是,用被釋放內存塊的地址減去所屬內存池的起始地址,所得的結果對該內存池內存塊大小取模,可得到被釋放內存塊在內存池中的位置。
采用本發明所述的釋放方法,與現有技術相比,解決了內存模塊中可能出現的HEAD頭被破壞而導致釋放失敗的情況,同時由于S,m一定是一個2的n次方的數,所有的取模運算可以直接通過移位來完成,移位運算在計算機中的運行速度是非常快的,可以大大提高系統的效率,達到了簡單性、可伸縮性的效果,降低了釋放出錯的風險。
圖1是內存塊劃分的情況和緩沖池POOL的結構圖;圖2是內存的操作維護算法圖;圖3是在一塊大的內存區設置釋放內存塊的內存池示例圖;圖4是本發明中系統內存的初始設置流程圖;圖5是本發明中釋放內存塊的流程圖。
具體實施例方式
圖3顯示了預先向操作系統申請一塊大的內存區并設置了大小為64(8塊),128(4塊),256(2塊),512(1塊)內存塊的內存池(pool)。
圖4是本發明中系統內存的初始設置流程圖。先劃出一塊內存區,設大小為X,然后設置如圖3所示的內存池。
圖5是本發明的釋放內存塊的流程圖。在發明的內容中已有詳細描述,此處不再重復。
下面用一個實施例進行說明設a為所要釋放的內存塊位于內存池中的位置(a的值為0表示位于第一個內存池中,a的值為1表示位于第二個內存池中,依此類推)。
1.1預先在系統中劃出一塊內存區,設大小為2048;1.2把劃出的內存區根據需要設置成大小為64,128,256,512的4種內存池,不同大小的內存池分別有8,4,2,1塊可供分配;1.3在系統初始化的時候,建立一個索引,索引指向內存塊所屬的內存池的位置;建立索引的方法可以是首先根據內存塊的大小和塊數求4個內存池的最大公約數,即求8,2×4,4×2,8×1這4個數字的最大公約數S=8,然后根據8和64以及4的值建立一個索引,索引的長度為4/(8×64)。
1.4當程序需要內存塊時,根據所需的內存塊大小,首先在含有此大小內存塊的描述數組中查找有沒有空置出來的塊,如果有,則按順序分配給需要的程序;如果沒有,則從內存區中按順序申請內存塊,并根據申請內存塊的大小在含有此大小的內存塊的描述數組尾部添加,然后分配,同時修改描述數組中該塊內存標識為已經分配;1.5在釋放內存的時候,先求得索引的下標,通過索引確定被釋放的內存塊屬于哪個內存池;然后進一步得到被釋放內存塊在內存池中的位置,最后釋放。
求得索引的下標的方法可以是用釋放時傳入的釋放地址*p2減去整個內存區的起始地址*p1所得差值(64×8+128×2)再對(8×64)取模,所得的值就是索引的下標,即a=1(表明所要釋放的內存塊位于大小為128的內存池中)。再用被釋放內存塊的地址減去所屬內存池的起始地址的差值(128×2)對該內存池內存塊大小值128取模得到值為2,這樣就可以知道需釋放的內存塊的具體位置并釋放該塊內存,同時修改該塊內存標識為沒有分配。
綜上所述,本發明采用hash釋放方法較以前的方法解決了內存模塊中可能出現的HEAD頭被破壞而導致釋放失敗的情況,同時提高了釋放的效率。
權利要求
1.一種嵌入式實時操作系統中內存釋放的方法,包括1.1預先在系統中劃出一塊內存區,設大小為X;1.2把劃出的內存區根據需要設置成大小為m,2m,4m,8m,16m...2km的K種內存池,不同大小的內存池分別有nk塊可供分配;1.3在系統初始化的時候,建立一個索引,索引指向內存塊所屬的內存池的位置;1.4當程序需要內存塊時,根據所需的內存塊大小,首先在含有此大小內存塊的描述數組中查找有沒有空置出來的塊,如果有,則按順序分配給需要的程序;如果沒有,則從內存區中按順序申請內存塊,并根據申請內存塊的大小在含有此大小的內存塊的描述數組尾部添加,然后分配,同時修改描述數組中該塊內存標識為已經分配;1.5在釋放內存的時候,先求得索引的下標,通過索引確定被釋放的內存塊屬于哪個內存池;然后進一步得到被釋放內存塊在內存池中的位置,最后釋放。
2.權利要求1所述的嵌入式實時操作系統中內存釋放的方法,其特征在于,所述步驟1.3中的建立一個索引的方法為首先根據內存塊的大小和塊數求K個內存池的最大公約數,即求n0,2n1,4n2,8n3,16n4,32n5...2k-1nk-1這K個數字的最大公約數S,然后根據S和m以及X的值建立一個索引,索引的長度為X/(S×m)。
3.權利要求1所述的嵌入式實時操作系統中內存釋放的方法,其特征在于,所述步驟1.5中的求得索引的下標的方法為用釋放時傳入的釋放地址*p2減去整個內存區的起始地址*p1所得差值再對(S×m)取模,所得的值就是索引的下標。
4.權利要求1所述的嵌入式實時操作系統中內存釋放的方法,其特征在于,所述步驟1.5中的得到被釋放內存塊在內存池中的位置的方法為,用被釋放內存塊的地址減去所屬內存池的起始地址,所得的結果對該內存池內存塊大小取模,可得到被釋放內存塊在內存池中的位置。
全文摘要
一種嵌入式實時操作系統中內存釋放的方法,預先在系統中劃出一塊內存區;把劃出的內存區設置成大小為文檔編號G06F9/50GK1556475SQ20041003201
公開日2004年12月22日 申請日期2004年3月25日 優先權日2004年1月2日
發明者魯旭, 繆敬, 張芝萍, 王陳, 蘆東昕, 魯 旭 申請人:中興通訊股份有限公司