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