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