本發(fā)明屬于嵌入式數(shù)據(jù)庫存儲(chǔ)管理技術(shù),具體涉及一種嵌入式數(shù)據(jù)庫的動(dòng)態(tài)內(nèi)存分配方法。
背景技術(shù):
嵌入式實(shí)時(shí)數(shù)據(jù)庫系統(tǒng)是指可在嵌入式設(shè)備中獨(dú)立運(yùn)行的一種數(shù)據(jù)庫管理系統(tǒng),用以處理大量的,時(shí)效性強(qiáng)的數(shù)據(jù),它以高可靠性、高實(shí)時(shí)性和高信息吞吐量為目標(biāo)。由于嵌入式實(shí)時(shí)數(shù)據(jù)庫在運(yùn)行環(huán)境和運(yùn)行方式上與常見的傳統(tǒng)數(shù)據(jù)庫系統(tǒng)有很大的差異,研究在嵌入式環(huán)境下的實(shí)時(shí)數(shù)據(jù)庫系統(tǒng)成為嵌入式領(lǐng)域的一項(xiàng)重要研究?jī)?nèi)容。
由于嵌入式數(shù)據(jù)庫的設(shè)計(jì)特征,其數(shù)據(jù)庫管理系統(tǒng)為完成其基本功能,必須使用動(dòng)態(tài)內(nèi)存分配子系統(tǒng)來獲取內(nèi)存空間。而常用的系統(tǒng)調(diào)用malloc()和free()存在著效率不夠高、可能產(chǎn)生內(nèi)存碎片的問題,而在嵌入式領(lǐng)域由于內(nèi)存空間受限,內(nèi)存碎片的產(chǎn)生可能會(huì)導(dǎo)致內(nèi)存空間不足,造成數(shù)據(jù)庫操作失敗,從而影響系統(tǒng)的可靠性和安全性,這對(duì)于安全關(guān)鍵的系統(tǒng)是不可接受的。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是:
針對(duì)上述存在的問題,本發(fā)明提出了用戶可配置的動(dòng)態(tài)內(nèi)存分配子系統(tǒng)和方法,應(yīng)用者可根據(jù)具體嵌入式系統(tǒng)內(nèi)存空間大小配置嵌入式數(shù)據(jù)庫專用的內(nèi)存堆空間及相關(guān)參數(shù),基于配置的內(nèi)存空間和數(shù)據(jù)庫最大內(nèi)存占用數(shù),本內(nèi)存管理子系統(tǒng)能夠在算法上保證不會(huì)產(chǎn)生內(nèi)存泄漏和內(nèi)存碎片,
本發(fā)明采取的技術(shù)方案:
將最大可分配的內(nèi)存分為多個(gè)內(nèi)存塊,最小內(nèi)存塊的大小為n(取整到2的冪之后的),M是最大內(nèi)存占用數(shù),N是可分配內(nèi)存的總數(shù)。當(dāng)滿足一下不等式約束時(shí),內(nèi)存分配器永遠(yuǎn)不會(huì)由于內(nèi)存碎片而崩潰:N>=M*(1+log2(n)/2)-n+1
1.一種嵌入式數(shù)據(jù)庫的動(dòng)態(tài)內(nèi)存分配子系統(tǒng)及方法,其特征在于:它包括以下步驟:
(1)初始化內(nèi)存空間,獲取嵌入式數(shù)據(jù)庫配置的堆內(nèi)存空間和最小內(nèi)存塊大小,計(jì)算可分配內(nèi)存的總塊數(shù),初始化空閑內(nèi)存塊列表,鏈接所有的內(nèi)存塊,
(2)等待接收請(qǐng)求;
(3)若接收到需要分配內(nèi)存的請(qǐng)求,將申請(qǐng)的內(nèi)存取整到2的冪,逐一查看空閑內(nèi)存鏈表中是否存滿足要求的空閑內(nèi)存塊,若有則進(jìn)行內(nèi)存分配,并從空閑內(nèi)存列表中剔除它。若該空閑內(nèi)存塊>2*請(qǐng)求內(nèi)存,則對(duì)該空閑內(nèi)存塊進(jìn)行重新分割,將分割出來的內(nèi)存進(jìn)行分配,剩余內(nèi)存記錄到空閑內(nèi)存列表中。
若接收到需要釋放內(nèi)存的請(qǐng)求,則計(jì)算申請(qǐng)釋放的內(nèi)存指針的索引,檢測(cè)申請(qǐng)釋放的內(nèi)存是否指向一個(gè)合法內(nèi)存塊,檢測(cè)申請(qǐng)釋放的內(nèi)存是否指向一個(gè)已分配內(nèi)存塊,將釋放的內(nèi)存塊加入空閑內(nèi)存列表,釋放該內(nèi)存空間。
步驟(1)所述的內(nèi)存初始化需要獲取嵌入式數(shù)據(jù)庫配置信息,包括為嵌入式數(shù)據(jù)庫分配的專用內(nèi)存堆空間,以及最小內(nèi)存分配塊的大小參數(shù),并以此初始化內(nèi)存空閑列表和鏈接空閑內(nèi)存塊。
其步驟(3)所述的內(nèi)存分配和內(nèi)存釋放過程中,記錄了調(diào)用內(nèi)存分配的總次數(shù)、內(nèi)存分配總量、最大請(qǐng)求塊大小等參數(shù),可以供嵌入式數(shù)據(jù)庫進(jìn)行內(nèi)存分配器性能統(tǒng)計(jì)分析。
一種嵌入式數(shù)據(jù)庫的動(dòng)態(tài)內(nèi)存管理子系統(tǒng),其特征在于,可配置數(shù)據(jù)庫專用的內(nèi)存堆空間,可以根據(jù)最大內(nèi)存占用空間和專用的內(nèi)存堆空間,配置最小內(nèi)存塊,從而在算法上保證在內(nèi)存堆空間中不會(huì)產(chǎn)生內(nèi)存碎片,并由此導(dǎo)致內(nèi)存分配失敗。
本發(fā)明具有的優(yōu)點(diǎn)和有益效果:
該發(fā)明已在某飛機(jī)的飛行管理項(xiàng)目中得到了應(yīng)用,提高了系統(tǒng)的可靠性和安全性,取得了良好的效果。
附圖說明
圖1---動(dòng)態(tài)內(nèi)存管理,內(nèi)存初始化過程。
圖2---動(dòng)態(tài)內(nèi)存分配的程序流程圖;
圖3---動(dòng)態(tài)內(nèi)存釋放的程序流程圖。
具體實(shí)施方式
下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步說明:
一種嵌入式數(shù)據(jù)庫的動(dòng)態(tài)內(nèi)存管理子系統(tǒng)及方法,具體實(shí)施步驟如下:
(1)初始化內(nèi)存空間,獲取嵌入式數(shù)據(jù)庫配置的堆內(nèi)存空間和最小內(nèi)存塊大小,計(jì)算可分配內(nèi)存的總塊數(shù),初始化空閑內(nèi)存塊列表(該列表用于跟蹤檢測(cè)內(nèi)存使用狀況),使用雙向鏈表鏈接所有的內(nèi)存塊,
(2)等待接收請(qǐng)求;
(3)若接收到需要分配內(nèi)存的請(qǐng)求,將申請(qǐng)的內(nèi)存取整到2的冪,逐一查看空閑內(nèi)存鏈表中是否存滿足要求的空閑內(nèi)存塊,若有則進(jìn)行內(nèi)存分配,并從空閑內(nèi)存列表中剔除它。若該空閑內(nèi)存塊>2*請(qǐng)求內(nèi)存,則對(duì)該空閑內(nèi)存塊進(jìn)行重新分割,將分割出來的內(nèi)存進(jìn)行分配,剩余內(nèi)存記錄到空閑內(nèi)存列表中。
(4)若接收到需要釋放內(nèi)存的請(qǐng)求,則計(jì)算申請(qǐng)釋放的內(nèi)存指針的索引,檢測(cè)申請(qǐng)釋放的內(nèi)存是否指向一個(gè)合法內(nèi)存塊,檢測(cè)申請(qǐng)釋放的內(nèi)存是否指向一個(gè)已分配內(nèi)存塊,將釋放的內(nèi)存塊加入空閑內(nèi)存列表,釋放該內(nèi)存空間。