專利名稱:一種動(dòng)態(tài)內(nèi)存池的實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)內(nèi)存管理技術(shù),提供了一種實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存池的方法,并支持可配置的檢測(cè)內(nèi)存越界、內(nèi)存泄露的功能。
背景技術(shù):
在通信領(lǐng)域中,為了提高系統(tǒng)的實(shí)時(shí)性,需要減少線程切換、系統(tǒng)調(diào)用、中斷響應(yīng)以及內(nèi)存操作的開(kāi)銷,而內(nèi)存管理的效率是影響系統(tǒng)開(kāi)銷的重要因素。成熟的通信產(chǎn)品中一般都有專門的內(nèi)存管理子系統(tǒng)。
操作系統(tǒng)一般都提供的是基于堆的內(nèi)存分配策略,可以分酸變長(zhǎng)的內(nèi)存塊。它的優(yōu)點(diǎn)是消除了內(nèi)存塊內(nèi)部的碎片,但是系統(tǒng)長(zhǎng)時(shí)間運(yùn)行后,內(nèi)存塊間會(huì)引入外部分片,導(dǎo)致大量的內(nèi)存浪費(fèi)。另外一個(gè)重要缺點(diǎn)是內(nèi)存的分配、釋放的時(shí)間存在不確定性,因此實(shí)時(shí)系統(tǒng)中一般不直接使用這種策略。
實(shí)時(shí)系統(tǒng)中通常使用靜態(tài)的內(nèi)存分配方式,并采用固定長(zhǎng)度的內(nèi)存分配策略。按照內(nèi)存塊的大小,組織若干個(gè)內(nèi)存緩沖池,構(gòu)成一個(gè)內(nèi)存區(qū)域。如果內(nèi)存的大小是按照2的倍數(shù)遞增,那么可以通過(guò)專門的匯編指令加速內(nèi)存緩沖池的定位(通常只需要若干條指令),否則也可以通過(guò)查找算法,如二分法加速內(nèi)存緩沖池的定位。內(nèi)存塊的分配和釋放通常是基于鏈表的操作,因此其開(kāi)銷主要在于用于互斥的P、V操作。這種內(nèi)存管理策略引入了內(nèi)存塊內(nèi)部的碎片,但是消除了內(nèi)存塊之間的碎片,且內(nèi)存分配、釋放的時(shí)間相對(duì)確定。
中國(guó)專利文獻(xiàn)00108090.3列出了一種實(shí)時(shí)系統(tǒng)中快速分配與釋放的方法。它假定內(nèi)存塊存在2的倍數(shù)關(guān)系,利用匯編中存在計(jì)算前導(dǎo)零個(gè)數(shù)的位串操作相關(guān)的機(jī)器指令,加速內(nèi)存緩沖池的定位。如果內(nèi)存塊不是這種倍數(shù)關(guān)系,則需要使用其它搜索算法,進(jìn)行內(nèi)存池定位。
中國(guó)專利文獻(xiàn)01118873.1公開(kāi)了一種自適應(yīng)動(dòng)態(tài)內(nèi)存管理方法,當(dāng)頁(yè)面簇中的所有分片均處于空閑時(shí),該頁(yè)面簇可以被轉(zhuǎn)換成所需類型的頁(yè)面簇以供申請(qǐng),實(shí)現(xiàn)了內(nèi)存空間的動(dòng)態(tài)管理,使內(nèi)存資源得以充分利用。
如果針對(duì)不同的內(nèi)存緩沖池,能夠配置合理數(shù)量的內(nèi)存頁(yè)面,系統(tǒng)可以正常運(yùn)行了。但由于業(yè)務(wù)的復(fù)雜性、多模塊耦合等因素,開(kāi)發(fā)人員難以預(yù)期系統(tǒng)運(yùn)行中所需內(nèi)存頁(yè)面的準(zhǔn)確數(shù)量。當(dāng)系統(tǒng)運(yùn)行在較輕負(fù)載情況或內(nèi)存頁(yè)面大小的分布發(fā)生變化時(shí),應(yīng)用指定的內(nèi)存頁(yè)面的數(shù)量可能不合理。此外,系統(tǒng)靜態(tài)分配的內(nèi)存頁(yè)面可能不能適應(yīng)突發(fā)的內(nèi)存請(qǐng)求,雖然系統(tǒng)中還有可用的物理或虛擬內(nèi)存。
中國(guó)專利文獻(xiàn)01118873.1也是一種動(dòng)態(tài)調(diào)整內(nèi)存池配置的方法,但沒(méi)有考慮突發(fā)的內(nèi)存請(qǐng)求的處理。
此外,內(nèi)存池的管理需要綜合考慮基本的內(nèi)存泄漏檢測(cè)、內(nèi)存越界檢測(cè)的功能,尤其是在系統(tǒng)調(diào)試的時(shí)候。
發(fā)明內(nèi)容
本發(fā)明的目的是為了提高系統(tǒng)的內(nèi)存管理效率和靈活性,提供一種動(dòng)態(tài)內(nèi)存池的實(shí)現(xiàn)方法,內(nèi)存池可以在系統(tǒng)允許的范圍內(nèi)動(dòng)態(tài)擴(kuò)展,適應(yīng)突發(fā)的情況。本發(fā)明允許系統(tǒng)在較輕負(fù)載情況或內(nèi)存頁(yè)面大小的分布發(fā)生變化時(shí),釋放空閑的內(nèi)存緩沖池,減少系統(tǒng)開(kāi)銷。本發(fā)明還實(shí)現(xiàn)可配置的檢測(cè)內(nèi)存越界、內(nèi)存泄露的功能。
本發(fā)明的技術(shù)方案是一種動(dòng)態(tài)內(nèi)存池的實(shí)現(xiàn)方法,其特征在于采用固定大小的內(nèi)存分配方式,而且每一類型的內(nèi)存緩沖池是可以擴(kuò)展或回收的;如果應(yīng)用申請(qǐng)的內(nèi)存超出了當(dāng)前可用內(nèi)存頁(yè)面的數(shù)量,觸發(fā)內(nèi)存緩沖池?cái)U(kuò)展申請(qǐng),在系統(tǒng)配置允許的范圍內(nèi)則向操作系統(tǒng)申請(qǐng)新的內(nèi)存緩沖池,并向應(yīng)用返回可用的內(nèi)存頁(yè)面地址;如果系統(tǒng)處于較輕的負(fù)載或內(nèi)存塊大小的分布情況發(fā)生了較大的變化時(shí),觸發(fā)內(nèi)存池回收的請(qǐng)求,若在系統(tǒng)配置允許的范圍內(nèi),則向操作系統(tǒng)釋放空閑的內(nèi)存緩沖池。
如上所述的動(dòng)態(tài)內(nèi)存池的實(shí)現(xiàn)方法,其特征在于內(nèi)存頁(yè)面上的應(yīng)用數(shù)據(jù)區(qū)前后配置不可寫的區(qū)域,使用特定的字符填充,并使用哈西表記錄內(nèi)存分配、釋放等操作的上下文信息。這是實(shí)現(xiàn)內(nèi)存越界、內(nèi)存泄露的檢測(cè)功能的技術(shù)要點(diǎn)。
如上所述的動(dòng)態(tài)內(nèi)存池的實(shí)現(xiàn)方法,其特征在于采用下列特征首先是內(nèi)存池初始化,包括以下步驟步驟1初始化內(nèi)存池配置數(shù)據(jù),并緩沖池鏈表、空閑頁(yè)面鏈表,如果是多任務(wù)或多線程訪問(wèn)內(nèi)存池,還需要初始化互斥信號(hào)量;步驟2分配內(nèi)存緩沖池的初始化配置指定的內(nèi)存空間,并分配空閑頁(yè)面;其次是內(nèi)存池的擴(kuò)展技術(shù),包括以下步驟步驟1內(nèi)存緩沖池的頁(yè)面沒(méi)有空閑,觸發(fā)內(nèi)存緩沖池的擴(kuò)展請(qǐng)求;步驟2檢察當(dāng)前已分配的內(nèi)存頁(yè)面總量是否小于允許的最大總量,否則返回?cái)U(kuò)展失??;步驟3計(jì)算內(nèi)存池?cái)U(kuò)充的內(nèi)存大小,是否在操作系統(tǒng)允許的范圍內(nèi),否則返回?cái)U(kuò)展失敗;步驟4向操作系統(tǒng)申請(qǐng)新的內(nèi)存池空間,并綴到內(nèi)存緩沖池的隊(duì)列末尾,并更新內(nèi)存緩沖池的數(shù)量;步驟5將新的內(nèi)存緩沖池的所有內(nèi)存頁(yè)面添加到空閑頁(yè)面鏈表的尾部,并更新當(dāng)前可用的頁(yè)面數(shù)量以及內(nèi)存頁(yè)面的總量;再次是內(nèi)存池的回收技術(shù),包括以下步驟步驟1啟動(dòng)獨(dú)立的線程或任務(wù),定期執(zhí)行內(nèi)存池的回收檢查;當(dāng)體眠時(shí)間到,則執(zhí)行步驟2;步驟2當(dāng)內(nèi)存緩沖池的大小沒(méi)有超出閥值,則任務(wù)再次體眠,否則執(zhí)行步驟3,觸發(fā)內(nèi)存池回收的操作;步驟3如果內(nèi)存池的頁(yè)面總數(shù)不大于內(nèi)存池的保留的頁(yè)面數(shù)量,則執(zhí)行步驟4,否則跳出對(duì)該內(nèi)存池的檢查;步驟4檢查內(nèi)存池上是否存在已經(jīng)分配出去的頁(yè)面,存在則跳出對(duì)該內(nèi)存池的檢查,否則釋放內(nèi)存上空間的內(nèi)存頁(yè)面以及該內(nèi)存緩沖池;步驟5如果還有未檢查的內(nèi)存緩沖池,跳轉(zhuǎn)到步驟3,否則內(nèi)存回收過(guò)程結(jié)束,再次休眠并等待體眠時(shí)間到重復(fù)步驟2~5;最后是可配置的內(nèi)存越界、內(nèi)存泄漏的檢測(cè)功能,其中內(nèi)存越界的檢測(cè)包含以下步驟步驟1在內(nèi)存池初始化時(shí),將內(nèi)存頁(yè)面以及前后的保留內(nèi)存均填充為0xdb;步驟2內(nèi)存分配時(shí),將內(nèi)存頁(yè)面內(nèi)的碎片也填充為0xdb;步驟3啟動(dòng)獨(dú)立的線程或任務(wù),或在內(nèi)存的分配、釋放時(shí),檢查可能的內(nèi)存越界;如果是在獨(dú)立的線程或任務(wù)中執(zhí)行,則檢查所有的內(nèi)存頁(yè)面的頁(yè)面內(nèi)部碎片以及前后保留內(nèi)存是否被改寫,否則檢查單個(gè)內(nèi)存頁(yè)面的內(nèi)部碎片以及前后保留內(nèi)存是否被改寫;如果發(fā)生了越界改寫,就報(bào)告內(nèi)存越界以及相關(guān)的上下文信息,為調(diào)試提供線索;內(nèi)存泄露的檢測(cè)包含以下步驟步驟1初始化記錄內(nèi)存頁(yè)面上下文信息的哈希表,記錄的關(guān)鍵字為內(nèi)存塊指針;步驟2內(nèi)存分配、釋放操作時(shí),記錄上下文信息,包括內(nèi)存頁(yè)面的類型、大小、創(chuàng)建時(shí)間、位置、最近的歷史操作列表和計(jì)數(shù)信息;步驟3檢查該哈希表,顯示沒(méi)有釋放的內(nèi)存塊以及上下文信息;開(kāi)發(fā)人員結(jié)合上下文信息確認(rèn)是否為內(nèi)存泄漏。
本發(fā)明的優(yōu)點(diǎn)如下①保持了內(nèi)存靜態(tài)分配的高效率的優(yōu)點(diǎn),同時(shí)在可控的范圍內(nèi)允許內(nèi)存池動(dòng)態(tài)擴(kuò)展和回收,簡(jiǎn)化了內(nèi)存池的配置管理以及增強(qiáng)了系統(tǒng)處理突發(fā)內(nèi)存請(qǐng)求的健壯性。
②提供了基本的內(nèi)存越界、內(nèi)存泄漏檢查的功能,提高了系統(tǒng)的可調(diào)試性。
③方法具有通用性,使用于各種類型的操作系統(tǒng)。
圖1,本發(fā)明實(shí)施例的內(nèi)存池結(jié)構(gòu)示意圖。
具體實(shí)施例方式
下面用實(shí)施例對(duì)本發(fā)明作進(jìn)一步的詳細(xì)描述。
圖1描述了本發(fā)明實(shí)施例的內(nèi)存池結(jié)構(gòu)示意圖。101是不同類型的內(nèi)存緩沖池的數(shù)組單元,它記錄了緩沖池的鏈表頭指針、個(gè)數(shù)和擴(kuò)展信息以及空閑內(nèi)存頁(yè)面的個(gè)數(shù)、鏈表頭指針。102描述了一個(gè)緩沖池的結(jié)構(gòu),它由兄弟成員鏈指針、緩沖池頭信息和數(shù)據(jù)頁(yè)面構(gòu)成。103描述了內(nèi)存頁(yè)面的結(jié)構(gòu),并通過(guò)空閑頁(yè)面指針鏈接為空閑頁(yè)面鏈表。103指向的內(nèi)存空間已經(jīng)分配在了102所示的結(jié)構(gòu)中。
本發(fā)明已經(jīng)在通信網(wǎng)絡(luò)數(shù)據(jù)安全產(chǎn)品上得到應(yīng)用性的實(shí)驗(yàn),達(dá)到了預(yù)期的目的。在PIII 1G的單板上,采用本發(fā)明所述的方法,內(nèi)存分配釋放的平均效率為0.6us,而現(xiàn)有的技術(shù)中內(nèi)存分配釋放的平均效率為3.7us,因此采用本方法后內(nèi)存分配與釋放的性能顯著提高,最終提高了整個(gè)系統(tǒng)的處理能力。另外,內(nèi)存泄漏、內(nèi)存越界檢查功能增強(qiáng)了系統(tǒng)的可調(diào)試性,加快了產(chǎn)品開(kāi)發(fā)的進(jìn)度。
雖然已經(jīng)詳細(xì)的公開(kāi)和說(shuō)明了本發(fā)明,但是本領(lǐng)域的技術(shù)人員會(huì)理解無(wú)需脫離本發(fā)明的精神和保護(hù)范圍,就可以做出過(guò)各種形式上和細(xì)節(jié)上的改變。
權(quán)利要求
1.一種動(dòng)態(tài)內(nèi)存池的實(shí)現(xiàn)方法,其特征在于采用固定大小的內(nèi)存分配方式,而且每一類型的內(nèi)存緩沖池是可以擴(kuò)展或回收的;如果應(yīng)用申請(qǐng)的內(nèi)存超出了當(dāng)前可用內(nèi)存頁(yè)面的數(shù)量,觸發(fā)內(nèi)存緩沖池?cái)U(kuò)展申請(qǐng),在系統(tǒng)配置允許的范圍內(nèi)則向操作系統(tǒng)申請(qǐng)新的內(nèi)存緩沖池,并向應(yīng)用返回可用的內(nèi)存頁(yè)面地址;如果系統(tǒng)處于較輕的負(fù)載或內(nèi)存塊大小的分布情況發(fā)生了較大的變化時(shí),觸發(fā)內(nèi)存池回收的請(qǐng)求,若在系統(tǒng)配置允許的范圍內(nèi),則向操作系統(tǒng)釋放空閑的內(nèi)存緩沖池。
2.如權(quán)利要求1所述的動(dòng)態(tài)內(nèi)存池的實(shí)現(xiàn)方法,其特征在于內(nèi)存頁(yè)面上的應(yīng)用數(shù)據(jù)區(qū)前后配置不可寫的區(qū)域,使用特定的字符填充,并使用哈西表記錄內(nèi)存分配、釋放等操作的上下文信息。
3.如權(quán)利要求2所述的動(dòng)態(tài)內(nèi)存池的實(shí)現(xiàn)方法,其特征在于采用下列特征首先是內(nèi)存池初始化,包括以下步驟步驟1初始化內(nèi)存池配置數(shù)據(jù),并緩沖池鏈表、空閑頁(yè)面鏈表,如果是多任務(wù)或多線程訪問(wèn)內(nèi)存池,還需要初始化互斥信號(hào)量;步驟2分配內(nèi)存緩沖池的初始化配置指定的內(nèi)存空間,并分配空閑頁(yè)面;其次是內(nèi)存池的擴(kuò)展技術(shù),包括以下步驟步驟1內(nèi)存緩沖池的頁(yè)面沒(méi)有空閑,觸發(fā)內(nèi)存緩沖池的擴(kuò)展請(qǐng)求;步驟2檢察當(dāng)前已分配的內(nèi)存頁(yè)面總量是否小于允許的最大總量,否則返回?cái)U(kuò)展失??;步驟3計(jì)算內(nèi)存池?cái)U(kuò)充的內(nèi)存大小,是否在操作系統(tǒng)允許的范圍內(nèi),否則返回?cái)U(kuò)展失?。徊襟E4向操作系統(tǒng)申請(qǐng)新的內(nèi)存池空間,并綴到內(nèi)存緩沖池的隊(duì)列末尾,并更新內(nèi)存緩沖池的數(shù)量;步驟5將新的內(nèi)存緩沖池的所有內(nèi)存頁(yè)面添加到空閑頁(yè)面鏈表的尾部,并更新當(dāng)前可用的頁(yè)面數(shù)量以及內(nèi)存頁(yè)面的總量;再次是內(nèi)存池的回收技術(shù),包括以下步驟步驟1啟動(dòng)獨(dú)立的線程或任務(wù),定期執(zhí)行內(nèi)存池的回收檢查;當(dāng)休眠時(shí)間到,則執(zhí)行步驟2;步驟2當(dāng)內(nèi)存緩沖池的大小沒(méi)有超出閥值,則任務(wù)再次休眠,否則執(zhí)行步驟3,觸發(fā)內(nèi)存池回收的操作;步驟3如果內(nèi)存池的頁(yè)面總數(shù)不大于內(nèi)存池的保留的頁(yè)面數(shù)量,則執(zhí)行步驟4,否則跳出對(duì)該內(nèi)存池的檢查;步驟4檢查內(nèi)存池上是否存在已經(jīng)分配出去的頁(yè)面,存在則跳出對(duì)該內(nèi)存池的檢查,否則釋放內(nèi)存上空間的內(nèi)存頁(yè)面以及該內(nèi)存緩沖池;步驟5如果還有未檢查的內(nèi)存緩沖池,跳轉(zhuǎn)到步驟3,否則內(nèi)存回收過(guò)程結(jié)束,再次休眠并等待休眠時(shí)間到重復(fù)步驟2~5;最后是可配置的內(nèi)存越界、內(nèi)存泄漏的檢測(cè)功能,其中內(nèi)存越界的檢測(cè)包含以下步驟步驟1在內(nèi)存池初始化時(shí),將內(nèi)存頁(yè)面以及前后的保留內(nèi)存均填充為0xdb;步驟2內(nèi)存分配時(shí),將內(nèi)存頁(yè)面內(nèi)的碎片也填充為0xdb;步驟3啟動(dòng)獨(dú)立的線程或任務(wù),或在內(nèi)存的分配、釋放時(shí),檢查可能的內(nèi)存越界;如果是在獨(dú)立的線程或任務(wù)中執(zhí)行,則檢查所有的內(nèi)存頁(yè)面的頁(yè)面內(nèi)部碎片以及前后保留內(nèi)存是否被改寫,否則檢查單個(gè)內(nèi)存頁(yè)面的內(nèi)部碎片以及前后保留內(nèi)存是否被改寫;如果發(fā)生了越界改寫,就報(bào)告內(nèi)存越界以及相關(guān)的上下文信息,為調(diào)試提供線索;內(nèi)存泄露的檢測(cè)包含以下步驟步驟1初始化記錄內(nèi)存頁(yè)面上下文信息的哈希表,記錄的關(guān)鍵字為內(nèi)存塊指針;步驟2內(nèi)存分配、釋放操作時(shí),記錄上下文信息,包括內(nèi)存頁(yè)面的類型、大小、創(chuàng)建時(shí)間、位置、最近的歷史操作列表和計(jì)數(shù)信息;步驟3檢查該哈希表,顯示沒(méi)有釋放的內(nèi)存塊以及上下文信息;開(kāi)發(fā)人員結(jié)合上下文信息確認(rèn)是否為內(nèi)存泄漏。
全文摘要
一種動(dòng)態(tài)內(nèi)存池的實(shí)現(xiàn)方法,其特征在于可配置多個(gè)由固定大小內(nèi)存頁(yè)面構(gòu)成的內(nèi)存緩沖池,內(nèi)存頁(yè)面的大小和數(shù)量可由應(yīng)用指定;對(duì)于特定頁(yè)面大小的內(nèi)存緩沖池,在系統(tǒng)允許的范圍內(nèi),頁(yè)面的數(shù)量可由系統(tǒng)動(dòng)態(tài)擴(kuò)充或回收,并對(duì)應(yīng)用透明;本發(fā)明還支持可配置的檢測(cè)內(nèi)存越界、內(nèi)存泄露的功能。本發(fā)明應(yīng)用于一般的實(shí)時(shí)系統(tǒng)的開(kāi)發(fā),實(shí)現(xiàn)靈活、高效的內(nèi)存管理,提高系統(tǒng)的運(yùn)行效率和健壯性。
文檔編號(hào)G06F9/46GK1996258SQ20061016652
公開(kāi)日2007年7月11日 申請(qǐng)日期2006年12月28日 優(yōu)先權(quán)日2006年12月28日
發(fā)明者涂小明 申請(qǐng)人:武漢虹旭信息技術(shù)有限責(zé)任公司