本發(fā)明涉及信息技術(shù)領(lǐng)域,具體來(lái)說,涉及一種實(shí)現(xiàn)內(nèi)存高速交互的系統(tǒng)及方法。
背景技術(shù):
常用的內(nèi)存使用方式通過使用new/delete,malloc/free進(jìn)行內(nèi)存申請(qǐng)和釋放,這樣做的缺點(diǎn)在于,由于所申請(qǐng)內(nèi)存塊的大小不定,當(dāng)頻繁使用時(shí)會(huì)造成大量的內(nèi)存碎片并進(jìn)而降低性能。
內(nèi)存高速交互技術(shù)采用預(yù)先申請(qǐng)的方式,在初始化內(nèi)存池時(shí)將內(nèi)存按照階梯進(jìn)行分配,每次使用時(shí)按需在內(nèi)存池直接取出內(nèi)存塊即可,無(wú)需重復(fù)申請(qǐng);同時(shí),為了提高性能,每塊內(nèi)存都可以復(fù)用,從而提高了性能,避免了內(nèi)存片的產(chǎn)生。
new/delete,malloc/free是C/C++語(yǔ)言提供的內(nèi)存使用方法。在C語(yǔ)言中,malloc函數(shù)動(dòng)態(tài)申請(qǐng)的內(nèi)存空間是在堆里(而一般局部變量存于棧里),并且該段內(nèi)存不會(huì)被初始化,與全局變量不一樣,如果不采用手動(dòng)free()加以釋放,則該段內(nèi)存一直存在,直到程序退出才被系統(tǒng)。
new是動(dòng)態(tài)分配內(nèi)存的運(yùn)算符,自動(dòng)計(jì)算需要分配的空間,在C++中,它屬于重載運(yùn)算符,可以對(duì)多種數(shù)據(jù)類型形式進(jìn)行分配內(nèi)存空間,比如int型、char型、結(jié)構(gòu)體型和類等的動(dòng)態(tài)中請(qǐng)的內(nèi)存分配,分配類的內(nèi)存空間時(shí),同時(shí)調(diào)用類的構(gòu)造函數(shù),對(duì)內(nèi)存空間進(jìn)行初始化,即完成類的初始化工作。
delete是撤銷動(dòng)態(tài)申請(qǐng)的內(nèi)存運(yùn)算符。delete與new通常配對(duì)使用,與new的功能相反,可以對(duì)多種數(shù)據(jù)類型形式的內(nèi)存進(jìn)行撤銷,包括類,撤銷類的內(nèi)存空間時(shí),它要調(diào)用其析構(gòu)函數(shù),完成相應(yīng)的清理工作,收回相應(yīng)的內(nèi)存資源。
new/delete,malloc/free的共同的缺點(diǎn)是:由于所申請(qǐng)內(nèi)存塊的大小不定,當(dāng)頻繁使用時(shí)會(huì)造成大量的內(nèi)存碎片并進(jìn)而降低性能。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提出一種實(shí)現(xiàn)內(nèi)存高速交互的系統(tǒng)及方法,具有使用便捷、內(nèi)存分配效率高、內(nèi)存塊可復(fù)用以及無(wú)需多次釋放的優(yōu)點(diǎn)。
為實(shí)現(xiàn)上述技術(shù)目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:
一種實(shí)現(xiàn)內(nèi)存高速交互的方法,包括以下步驟:
1)當(dāng)程序開始運(yùn)行時(shí),通過內(nèi)核將所需大小的內(nèi)存一次申請(qǐng)到位形成內(nèi)存池;
2)將所述內(nèi)存池切片劃分為若干組不同大小的內(nèi)存塊;
3)將劃分好的內(nèi)存塊的地址存入映射表,并建立內(nèi)存塊已使用和未使用兩種映射表;
4)申請(qǐng)內(nèi)存時(shí),從內(nèi)存塊未使用的映射表里直接拿到比所需內(nèi)存大且與所需內(nèi)存大小最接近的一個(gè)內(nèi)存塊的地址,同時(shí)將所述地址放入到內(nèi)存塊已使用的映射表中,釋放內(nèi)存時(shí),將所述地址重新放入到內(nèi)存塊未使用的映射表里,同時(shí)從內(nèi)存塊已使用的映射表中將所述地址刪除;
5)待整個(gè)程序運(yùn)行完成,直接釋放掉整個(gè)內(nèi)存池。
進(jìn)一步的,步驟1)中所需大小的內(nèi)存是根據(jù)工程的實(shí)際應(yīng)用領(lǐng)域確定的。
進(jìn)一步的,步驟3)中,將同一組內(nèi)存塊的地址存入映射表中的同一個(gè)單位區(qū)域。
一種實(shí)現(xiàn)內(nèi)存高速交互的系統(tǒng),包括內(nèi)存池創(chuàng)建模塊、內(nèi)存池管理模塊、匹配分析模塊和內(nèi)存池釋放模塊;
所述內(nèi)存池創(chuàng)建模塊用于當(dāng)檢測(cè)到程序運(yùn)行時(shí)通過內(nèi)核將所需大小的內(nèi)存一次申請(qǐng)到位形成內(nèi)存池,并將所述內(nèi)存池切片劃分為若干組不同大小的內(nèi)存塊;
所述匹配分析模塊用于將所需內(nèi)存與內(nèi)存池內(nèi)存儲(chǔ)的內(nèi)存塊進(jìn)行比較,選取比所需內(nèi)存大且與所需內(nèi)存大小最接近的一個(gè)內(nèi)存塊作為被調(diào)用的內(nèi)存塊;
所述內(nèi)存池管理模塊用于將劃分好的內(nèi)存塊的地址存入映射表,并建立內(nèi)存塊已使用和未使用兩種映射表,申請(qǐng)內(nèi)存時(shí),從內(nèi)存塊未使用的映射表里直接拿到內(nèi)存塊的地址,同時(shí)將所述地址放入到內(nèi)存塊已使用的映射表中,釋放內(nèi)存時(shí),將所述地址重新放入到內(nèi)存塊未使用的映射表里,同時(shí)從內(nèi)存塊已使用的映射表中將所述地址刪除;
所述內(nèi)存池釋放模塊用于監(jiān)測(cè)整個(gè)程序的運(yùn)行,當(dāng)整個(gè)程序運(yùn)行結(jié)束時(shí),釋放掉整個(gè)內(nèi)存池。
進(jìn)一步的,所述內(nèi)存池創(chuàng)建模塊申請(qǐng)的所需大小的內(nèi)存是根據(jù)工程的實(shí)際應(yīng)用領(lǐng)域確定的。
進(jìn)一步的,所述內(nèi)存池管理模塊通過其上的映射表創(chuàng)建模塊實(shí)現(xiàn)將劃分好的內(nèi)存塊的地址存入內(nèi)存塊已使用的映射表和內(nèi)存塊未使用的映射表內(nèi)。
進(jìn)一步的,所述映射表創(chuàng)建模塊將同一組內(nèi)存塊的地址存入映射表中的同一個(gè)單位區(qū)域。
進(jìn)一步的,所述內(nèi)存池管理模塊通過其上的內(nèi)存塊調(diào)用模塊實(shí)現(xiàn)申請(qǐng)內(nèi)存時(shí),從內(nèi)存塊未使用的映射表里直接拿到內(nèi)存塊的地址,同時(shí)將所述地址放入到內(nèi)存塊已使用的映射表中,釋放內(nèi)存時(shí),將所述地址重新放入到內(nèi)存塊未使用的映射表里,同時(shí)從內(nèi)存塊已使用的映射表中將所述地址刪除。
本發(fā)明的有益效果:
1、穩(wěn)定,同時(shí)避免內(nèi)存泄漏:由于內(nèi)存高速交互技術(shù)采用創(chuàng)建內(nèi)存池的方式申請(qǐng)內(nèi)存,減少了因數(shù)據(jù)耦合產(chǎn)生了內(nèi)存泄漏;而且內(nèi)存高速交互技術(shù)只需釋放一次內(nèi)存,避免了頻繁對(duì)內(nèi)存操作時(shí),因程序員本身的疏忽,忘記了釋放內(nèi)存而產(chǎn)生的內(nèi)存泄漏;
2、快速交互:因?yàn)樵趦?nèi)存片的申請(qǐng)與釋放過程中,采用了時(shí)空效率轉(zhuǎn)換方案,申請(qǐng)和釋放內(nèi)存片時(shí)不需要尋址,所以不會(huì)產(chǎn)生內(nèi)存碎片,并且大大提高了交互速度;
3、統(tǒng)一管理內(nèi)存:申請(qǐng)的內(nèi)存以內(nèi)存池的方式保存各個(gè)內(nèi)存片,方便程序進(jìn)行統(tǒng)一調(diào)度和管理;
4、內(nèi)存可復(fù)用:內(nèi)存池中的內(nèi)存片,具有可用性屬性,此屬性可標(biāo)識(shí)內(nèi)存片的使用狀態(tài)是空閑還是忙碌,從而保證了內(nèi)存片的復(fù)用。
附圖說明
圖1是根據(jù)本發(fā)明實(shí)施例所述的實(shí)現(xiàn)內(nèi)存高速交互的系統(tǒng)的結(jié)構(gòu)示意圖;
圖2是根據(jù)本發(fā)明實(shí)施例所述的實(shí)現(xiàn)內(nèi)存高速交互的方法的流程圖;
圖3是根據(jù)本發(fā)明實(shí)施例所述的內(nèi)存池劃分結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述。
如圖1所示,根據(jù)本發(fā)明的實(shí)施例所述的一種實(shí)現(xiàn)內(nèi)存高度交互的系統(tǒng),包括內(nèi)存池創(chuàng)建模塊、內(nèi)存池管理模塊、匹配分析模塊和內(nèi)存池釋放模塊。
所述內(nèi)存池創(chuàng)建模塊用于當(dāng)檢測(cè)到程序運(yùn)行時(shí)通過內(nèi)核將所需大小的內(nèi)存一次申請(qǐng)到位形成內(nèi)存池,并將所述內(nèi)存池切片劃分為若干組不同大小的內(nèi)存塊。
具體的,在一個(gè)具體的實(shí)施例中,所述內(nèi)存池交互技術(shù)是通過以下措施實(shí)現(xiàn)的;首先,使用者根據(jù)工程的實(shí)際應(yīng)用領(lǐng)域確定所需要的內(nèi)存大小以及內(nèi)存池的切分方式;提供用于初始化內(nèi)存塊的接口函數(shù),此函數(shù)入?yún)⑹怯糜谂渲盟璧膬?nèi)存塊的大??;在構(gòu)造函數(shù)中將內(nèi)存按照入?yún)⒌闹祵?nèi)存進(jìn)行分塊,將固定大小的內(nèi)存,按照一定比例預(yù)先分配出來(lái),此過程分配的內(nèi)存即是所需的全部?jī)?nèi)存,之后不再申請(qǐng)。
所述匹配分析模塊用于將所需內(nèi)存與內(nèi)存池內(nèi)存儲(chǔ)的內(nèi)存塊進(jìn)行比較,選取比所需內(nèi)存大且與所需內(nèi)存大小最接近的一個(gè)內(nèi)存塊作為被調(diào)用的內(nèi)存塊。
具體的,在內(nèi)存使用時(shí),例如將內(nèi)存池劃分成有1K、5K、10k、15k……大小的內(nèi)存塊,當(dāng)程序需要調(diào)用大小為6K的內(nèi)存時(shí),匹配分析模塊就會(huì)遍歷內(nèi)存池內(nèi)的內(nèi)存塊,最終選擇大小為10K的內(nèi)存塊,當(dāng)需要調(diào)用大小為13K的內(nèi)存時(shí),相應(yīng)的最終就會(huì)選擇大小為15K的內(nèi)存塊。
所述內(nèi)存池管理模塊用于將劃分好的內(nèi)存塊的地址存入映射表,并建立內(nèi)存塊已使用和未使用兩種映射表,申請(qǐng)內(nèi)存時(shí),從內(nèi)存塊未使用的映射表里直接拿到內(nèi)存塊的地址,同時(shí)將所述地址放入到內(nèi)存塊已使用的映射表中,釋放內(nèi)存時(shí),將所述地址重新放入到內(nèi)存塊未使用的映射表里,同時(shí)從內(nèi)存塊已使用的映射表中將所述地址刪除。按照上述內(nèi)存塊的調(diào)用和釋放方式,可以將內(nèi)存塊排列的不規(guī)律性變?yōu)橐?guī)律性。此種方式雖然犧牲掉部分空間,但是可以提升內(nèi)存片申請(qǐng)和釋放速度。采用本方案,從根本上解決了內(nèi)存碎片問題。同時(shí),采用內(nèi)存地址直接映射的方式,使得內(nèi)存片釋放時(shí)不再需要尋址和遍歷,提高了交互速度。
所述內(nèi)存池釋放模塊用于監(jiān)測(cè)整個(gè)程序的運(yùn)行,當(dāng)整個(gè)程序運(yùn)行結(jié)束時(shí),釋放掉整個(gè)內(nèi)存池。
具體的,在一個(gè)具體的實(shí)施例中,上述整個(gè)內(nèi)存池的釋放是在析構(gòu)函數(shù)中進(jìn)行的。
在上述實(shí)施例中,所述內(nèi)存池管理模塊通過其上的映射表創(chuàng)建模塊實(shí)現(xiàn)將劃分好的內(nèi)存塊的地址存入內(nèi)存塊已使用的映射表和內(nèi)存塊未使用的映射表內(nèi)。
優(yōu)選的,所述映射表創(chuàng)建模塊將同一組內(nèi)存塊的地址存入映射表中的同一個(gè)單位區(qū)域。
在上述實(shí)施例中,所述內(nèi)存池管理模塊通過其上的內(nèi)存塊調(diào)用模塊實(shí)現(xiàn)申請(qǐng)內(nèi)存時(shí),從內(nèi)存塊未使用的映射表里直接拿到內(nèi)存塊的地址,同時(shí)將所述地址放入到內(nèi)存塊已使用的映射表中,釋放內(nèi)存時(shí),將所述地址重新放入到內(nèi)存塊未使用的映射表里,同時(shí)從內(nèi)存塊已使用的映射表中將所述地址刪除。
如圖2所示,本發(fā)明還公開了一種實(shí)現(xiàn)內(nèi)存高速交互的方法,包括以下步驟:
1)當(dāng)程序開始運(yùn)行時(shí),通過內(nèi)核將所需大小的內(nèi)存一次申請(qǐng)到位形成內(nèi)存池;
2)將所述內(nèi)存池切片劃分為若干組不同大小的內(nèi)存塊;
3)將劃分好的內(nèi)存塊的地址存入映射表,并建立內(nèi)存塊已使用和未使用兩種映射表;
4)申請(qǐng)內(nèi)存時(shí),從內(nèi)存塊未使用的映射表里直接拿到比所需內(nèi)存大且與所需內(nèi)存大小最接近的一個(gè)內(nèi)存塊的地址,同時(shí)將所述地址放入到內(nèi)存塊已使用的映射表中,釋放內(nèi)存時(shí),將所述地址重新放入到內(nèi)存塊未使用的映射表里,同時(shí)從內(nèi)存塊已使用的映射表中將所述地址刪除;
5)待整個(gè)程序運(yùn)行完成,直接釋放掉整個(gè)內(nèi)存池。
在一個(gè)具體的實(shí)施例中,采用如下方法實(shí)現(xiàn)內(nèi)存的高速交互:
配置過程:
配置過程處理很簡(jiǎn)單,如圖3所示,為了解決分片的合理性,需要用戶手動(dòng)分配各個(gè)內(nèi)存片數(shù)量,采用字符串的配置方式,可根據(jù)工程的實(shí)際應(yīng)用領(lǐng)域進(jìn)行合理劃分。
示例:“1000,2000,1000,500,200,100”
字符串中每個(gè)逗號(hào)間隔的數(shù)字代表該單位內(nèi)存片的個(gè)數(shù)。
創(chuàng)建內(nèi)存池:
通過配置計(jì)算出整體內(nèi)存池的大小,一次申請(qǐng)到位,后續(xù)將不再通過內(nèi)核進(jìn)行申請(qǐng)。
分割內(nèi)存片:
根據(jù)配置參數(shù),對(duì)內(nèi)存池進(jìn)行切片劃分,并將劃分好的地址存入映射表,同時(shí)建立兩種映射關(guān)系-內(nèi)存片已使用和未使用。
內(nèi)存管理:
內(nèi)存的管理主要是申請(qǐng)釋放內(nèi)存片操作,在程序工作時(shí)需要運(yùn)行時(shí)內(nèi)存申請(qǐng)和釋放,可以通過我們的內(nèi)存池進(jìn)行申請(qǐng)和釋放內(nèi)存片操作,申請(qǐng)時(shí)只需從未使用的表里直接拿到地址,同時(shí)將該地址放入已被使用的映射表中即可。釋放只需將該地址重新放入未使用的表里,同時(shí)從已使用表里刪除即可,簡(jiǎn)單快速。
申請(qǐng)時(shí),內(nèi)存池會(huì)根據(jù)用戶需求的內(nèi)存片大小進(jìn)行自動(dòng)匹配,尋找合適的單位進(jìn)行分配。
釋放內(nèi)存池:
程序運(yùn)行結(jié)束,直接釋放掉整個(gè)內(nèi)存池。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。