本發(fā)明涉及通信技術(shù)領(lǐng)域,尤其涉及一種內(nèi)存管理的方法及裝置。
背景技術(shù):內(nèi)存是目前通信設(shè)備中標(biāo)準(zhǔn)硬件的配置之一,并且隨著業(yè)務(wù)的發(fā)展,內(nèi)存的需求越來越多,內(nèi)存容量也越來越大,隨之而來的內(nèi)存管理策略也越來越復(fù)雜。所謂的內(nèi)存管理,就是對一塊可供各業(yè)務(wù)模塊共享使用的內(nèi)存進(jìn)行切割、分片管理,確保每個業(yè)務(wù)能及時獲取到相應(yīng)的內(nèi)存空間,同時又不影響其他業(yè)務(wù)的運行。目前,常用的內(nèi)存管理方法主要將內(nèi)存分為2個區(qū)域:slice內(nèi)存區(qū)及raw內(nèi)存區(qū)。其中,Slice內(nèi)存區(qū)將內(nèi)存分成大量的小塊內(nèi)存,例如:16字節(jié)、32字節(jié)、64字節(jié)、128字節(jié)、256字節(jié)、512字節(jié)、1K字節(jié)、2K字節(jié)等。這個內(nèi)存區(qū)主要用于業(yè)務(wù)模塊申請的內(nèi)存不大于相應(yīng)slice內(nèi)存塊,比如某模塊需要申請一個250字節(jié)的內(nèi)存塊,那么就可以直接申請一個256字節(jié)的slice內(nèi)存塊。Raw內(nèi)存區(qū)用于業(yè)務(wù)模塊申請的內(nèi)存大于slice內(nèi)存塊的需求,尤其是大塊內(nèi)存。比如某模塊要申請一個4M的內(nèi)存,那么就可以考慮直接從raw內(nèi)存中申請。然而,現(xiàn)有內(nèi)存管理方案最大的問題就是比較容易產(chǎn)生內(nèi)存碎片,這會導(dǎo)致內(nèi)存空間不必要的浪費。例如:一、raw內(nèi)存區(qū)沒有了空間,但是slice內(nèi)存區(qū)還有較多剩余內(nèi)存。比如:還有10片1M的slice內(nèi)存塊空閑,但是raw內(nèi)存已全部被占用,此時有業(yè)務(wù)模塊需要申請1個8M的內(nèi)存,則無法申請成功。二、raw內(nèi)存區(qū)本身存在較小碎片。比如:raw內(nèi)存目前有2個不連續(xù)的4M內(nèi)存塊,此時如果有業(yè)務(wù)模塊需要8M內(nèi)存也是無法申請到的。
技術(shù)實現(xiàn)要素:有鑒于此,本發(fā)明提供一種內(nèi)存管理的方法及裝置,以解決現(xiàn)有技術(shù)方案中存在的問題與不足。本發(fā)明是通過如下技術(shù)方案實現(xiàn)的:一種內(nèi)存管理裝置,用于實現(xiàn)對內(nèi)存碎片的有效管理,包括連續(xù)內(nèi)存管理單元、空閑內(nèi)存管理單元和空閑內(nèi)存塊關(guān)聯(lián)單元,其中,連續(xù)內(nèi)存管理單元:用于完成對連續(xù)內(nèi)存空間的管理;空閑內(nèi)存管理單元:用于完成對地址非連續(xù)的空閑內(nèi)存塊的管理;內(nèi)存塊關(guān)聯(lián)單元,用于當(dāng)所述各空閑內(nèi)存塊和連續(xù)內(nèi)存空間均小于業(yè)務(wù)模塊請求分配的內(nèi)存空間時,將所述非連續(xù)的空閑內(nèi)存塊通過尾指針關(guān)聯(lián)起來形成大塊滿足業(yè)務(wù)模塊內(nèi)存要求的內(nèi)存空間。進(jìn)一步地,所述內(nèi)存塊關(guān)聯(lián)單元在將空閑內(nèi)存塊關(guān)聯(lián)起來之前,還需判斷空閑內(nèi)存管理單元所管理的所有空閑內(nèi)存塊的內(nèi)存空間之和,能否滿足當(dāng)前業(yè)務(wù)模塊申請的內(nèi)存空間要求。進(jìn)一步地,如果空閑內(nèi)存塊地址指針與另一空閑內(nèi)存塊彼此連續(xù),則所述空閑內(nèi)存管理單元在該空閑內(nèi)存塊釋放內(nèi)存空間時需要將該空閑內(nèi)存塊與地址連續(xù)的內(nèi)存塊合并形成一個大的空閑內(nèi)存塊。本發(fā)明同時提供一種內(nèi)存管理方法,用于實現(xiàn)對內(nèi)存碎片的有效管理,其中當(dāng)業(yè)務(wù)模塊請求分配內(nèi)存空間時,所述方法包括:查詢所記錄的空閑內(nèi)存塊,確定其中是否有滿足內(nèi)存分配要求的空閑內(nèi)存塊,如果否,則進(jìn)行下一步;查詢所記錄的連續(xù)內(nèi)存空間,確定連續(xù)內(nèi)存空間是否滿足業(yè)務(wù)模塊請求分配的內(nèi)存要求,如果否,則進(jìn)行下一步;將所述非連續(xù)的空閑內(nèi)存塊通過尾指針關(guān)聯(lián)起來形成大塊滿足業(yè)務(wù)模塊內(nèi)存要求的內(nèi)存空間。進(jìn)一步地,在將空閑內(nèi)存塊關(guān)聯(lián)起來之前,還需判斷所有空閑內(nèi)存塊的空間之和,能否滿足當(dāng)前業(yè)務(wù)模塊請求分配的內(nèi)存空間要求。進(jìn)一步地,如果空閑內(nèi)存塊地址指針與另一空閑內(nèi)存塊彼此連續(xù),則在該空閑內(nèi)存塊釋放其內(nèi)存空間時,將該空閑內(nèi)存塊與地址連續(xù)的內(nèi)存塊合并形成一個大的空閑內(nèi)存塊。與現(xiàn)有的技術(shù)相比,本發(fā)明在空閑內(nèi)存管理單元所管理的各空閑內(nèi)存塊空間以及連續(xù)內(nèi)存管理單元管理的連續(xù)內(nèi)存空間均小于業(yè)務(wù)模塊請求分配的內(nèi)存空間時,將空閑內(nèi)存管理單元所管理的各空閑內(nèi)存塊借由尾指針關(guān)聯(lián)起來形成大塊空閑的內(nèi)存空間,以供分配給業(yè)務(wù)模塊使用。通過本發(fā)明,可以實現(xiàn)對現(xiàn)有內(nèi)存碎片的充分利用,不會因內(nèi)存碎片導(dǎo)致設(shè)備無內(nèi)存可用的情況出現(xiàn)。附圖說明圖1是典型的內(nèi)存塊結(jié)構(gòu)示意圖;圖2是本發(fā)明內(nèi)存管理的裝置結(jié)構(gòu)示意圖;圖3是地址彼此不相連的空閑內(nèi)存塊關(guān)聯(lián)后的結(jié)構(gòu)示意圖;圖4是存在部分地址相連的空閑內(nèi)存塊關(guān)聯(lián)后的結(jié)構(gòu)示意圖;圖5是本發(fā)明為業(yè)務(wù)模塊分配內(nèi)存的流程示意圖;圖6是應(yīng)用本發(fā)明將空閑內(nèi)存塊通過尾指針關(guān)聯(lián)起來后為業(yè)務(wù)模塊分配的內(nèi)存塊結(jié)構(gòu)示意圖。具體實施方式為使本領(lǐng)域技術(shù)人員更加清楚和明白,以下結(jié)合附圖和實施例詳細(xì)描述本發(fā)明。如圖1所示,一個完整的內(nèi)存塊結(jié)構(gòu),通常分為3個部分:內(nèi)存塊頭:在內(nèi)存塊頭中,通常需要包含本內(nèi)存塊的一些基本屬性,比如內(nèi)存塊被哪個業(yè)務(wù)模塊ID申請、內(nèi)存塊類型、內(nèi)存塊長度等。為描述簡便起見,此處僅列出與本發(fā)明有關(guān)的屬性:類型及長度。其中,類型(T)用以區(qū)分內(nèi)存的長度是否需要加上2的冪次方。比如:如果T=0,LEN=16,則表示內(nèi)存塊的長度為16字節(jié)。T=1,LEN=16,則表示內(nèi)存塊的長度為2^16=64K字節(jié)。內(nèi)存塊體:此為該內(nèi)存塊實際保存數(shù)據(jù)(DATA)的內(nèi)容。內(nèi)存塊尾:此為一個地址指針內(nèi)容。該指針用于當(dāng)一個業(yè)務(wù)模塊請求分配的內(nèi)存空間大于各空閑內(nèi)存塊和連續(xù)內(nèi)存空間時,通過其將2個或多個不連續(xù)的空閑內(nèi)存塊彼此關(guān)聯(lián)起來,也可以用于記錄各內(nèi)存塊所在的位置。如圖2所示,本發(fā)明提供的內(nèi)存塊管理裝置,用于實現(xiàn)對內(nèi)存碎片的有效管理,包括連續(xù)內(nèi)存管理單元、空閑內(nèi)存管理單元和空閑內(nèi)存塊關(guān)聯(lián)單元。其中,連續(xù)內(nèi)存管理單元:用于完成對連續(xù)剩余內(nèi)存空間的管理。在系統(tǒng)初始狀態(tài)下,本發(fā)明內(nèi)存硬件中僅存在一個連續(xù)內(nèi)存空間,此時,所述連續(xù)內(nèi)存管理單元實現(xiàn)對內(nèi)存硬件的通盤管理。當(dāng)經(jīng)過業(yè)務(wù)模塊多次申請和釋放內(nèi)存塊以后,則原本連續(xù)的內(nèi)存空間可能會出現(xiàn)不相連的情形,此時,連續(xù)內(nèi)存管理單元則繼續(xù)管理剩余的連續(xù)內(nèi)存空間,而地址與連續(xù)內(nèi)存空間不相連的空閑內(nèi)存塊則由空閑內(nèi)存管理單元接管。需要說明的是,上述兩種情形均是通過記錄連續(xù)內(nèi)存空間的起始地址、結(jié)束地址、內(nèi)存空間大小等屬性信息來實現(xiàn)對連續(xù)內(nèi)存空間的管理。另外,在本發(fā)明中,如果業(yè)務(wù)模塊釋放的內(nèi)存塊與剩余連續(xù)內(nèi)存空間彼此相連,亦即,業(yè)務(wù)模塊釋放的內(nèi)存塊和連續(xù)內(nèi)存空間之間沒有其他已被占用的內(nèi)存塊,所述連續(xù)內(nèi)存管理單元還需將該釋放的內(nèi)存塊合并到連續(xù)的剩余內(nèi)存空間中,同時變更連續(xù)內(nèi)存管理單元所記錄的該連續(xù)內(nèi)存空間的起始地址、結(jié)束地址及內(nèi)存空間大小等屬性信息??臻e內(nèi)存管理單元:用于完成對地址非連續(xù)的空閑內(nèi)存塊的管理。如前所述,當(dāng)業(yè)務(wù)模塊多次申請及釋放內(nèi)存塊以后,此時就可能出現(xiàn)釋放的內(nèi)存塊與連續(xù)剩余內(nèi)存空間不相連的情形。此時,空閑內(nèi)存管理單元就開始接管這部分釋放的內(nèi)存塊。具體地,將該空閑內(nèi)存塊將掛接到空閑內(nèi)存管理單元所記錄的內(nèi)存塊鏈表中(具體是在內(nèi)存塊鏈表中記錄各空閑內(nèi)存塊的起始地址、結(jié)束地址、內(nèi)存塊的長度等信息來實現(xiàn)空閑內(nèi)存塊的掛接),在本發(fā)明優(yōu)選的實施方式中,掛接的順序是進(jìn)一步按各空閑內(nèi)存塊的大小順序從大到小排列。如果釋放的空閑內(nèi)存塊與空閑內(nèi)存管理單元所管理的某個空閑內(nèi)存塊地址是相連的,則在釋放內(nèi)存空間時,空閑內(nèi)存管理單元需要將該地址連續(xù)的兩個空閑內(nèi)存塊進(jìn)行合并以形成內(nèi)存空間更大的空閑內(nèi)存塊,然后重新按照內(nèi)存空間大小順序掛接到其記錄的內(nèi)存塊鏈表中去。內(nèi)存塊關(guān)聯(lián)單元,用于當(dāng)所述空閑內(nèi)存塊和連續(xù)內(nèi)存空間均不滿足業(yè)務(wù)模塊申請的內(nèi)存空間要求時,將所述非連續(xù)的空閑內(nèi)存塊通過尾指針關(guān)聯(lián)起來形成大塊滿足業(yè)務(wù)模塊內(nèi)存要求的內(nèi)存空間。進(jìn)一步地,所述內(nèi)存塊關(guān)聯(lián)單元在將空閑內(nèi)存塊關(guān)聯(lián)起來之前,還需判斷空閑內(nèi)存管理單元所管理的所有空閑內(nèi)存塊的空間之和,是否能滿足當(dāng)前業(yè)務(wù)模塊申請的內(nèi)存空間要求,否則,返回業(yè)務(wù)模塊申請內(nèi)存空間失敗的響應(yīng)。例如:在某應(yīng)用場景下,內(nèi)存硬件中有3塊1M、2塊3M、1塊4M的不連續(xù)內(nèi)存是空閑的,內(nèi)存塊關(guān)聯(lián)單元通過尾指針將該等空閑內(nèi)存塊關(guān)聯(lián)起來的內(nèi)存鏈表結(jié)構(gòu)如圖3所示。如果3塊1M的內(nèi)存中的2塊地址是連續(xù)的,則在本發(fā)明中,空閑內(nèi)存管理單元需要事先合并該兩個1M的內(nèi)存塊以形成一個2M的內(nèi)存塊(為描述方便,此處忽略了2個內(nèi)存塊合并多出的1個內(nèi)存塊頭的大小,實際實現(xiàn)需要增加,比如內(nèi)存塊頭長度為64字節(jié),則2個1M內(nèi)存塊合并后的內(nèi)存塊大小為2M+64字節(jié)),具體如圖4所示。再請參照圖5所示,當(dāng)業(yè)務(wù)模塊向本發(fā)明裝置申請內(nèi)存空間時,本發(fā)明為業(yè)務(wù)模塊分配內(nèi)存的流程如下:當(dāng)某個業(yè)務(wù)模塊請求分配一個內(nèi)存空間時,會向本發(fā)明裝置發(fā)送內(nèi)存分配請求,本發(fā)明裝置接收到業(yè)務(wù)模塊發(fā)送的內(nèi)存分配請求后,優(yōu)先根據(jù)空閑內(nèi)存塊管理單元的記錄,查找是否有滿足業(yè)務(wù)模塊內(nèi)存分配請求的空閑內(nèi)存塊,如果存在,則將該內(nèi)存塊的尾指針賦值為空,同時將該內(nèi)存塊提供給業(yè)務(wù)模塊使用,如果同時存在多個空閑內(nèi)存塊均滿足業(yè)務(wù)模塊的內(nèi)存分配請求,在優(yōu)選的實施方式中,則從這多個空閑內(nèi)存塊中選擇能夠滿足業(yè)務(wù)模塊內(nèi)存分配請求的最小空閑內(nèi)存塊供其使用;如果否,則查找連續(xù)內(nèi)存管理單元的記錄,查看連續(xù)內(nèi)存空間是否能夠滿足業(yè)務(wù)模塊內(nèi)存分配的要求,如果滿足,則從連續(xù)內(nèi)存空間中為業(yè)務(wù)模塊分配相應(yīng)的內(nèi)存,同時變更連續(xù)內(nèi)存管理單元的起始地址、結(jié)束地址以及連續(xù)內(nèi)存空間等屬性信息;如果連續(xù)內(nèi)存空間也不滿足業(yè)務(wù)模塊的內(nèi)存分配要求,按照現(xiàn)有技術(shù),此時將返回內(nèi)存分配失敗的響應(yīng)給對應(yīng)的業(yè)務(wù)模塊。在本發(fā)明中,為了保證內(nèi)存碎片均能得到充分的利用,在空閑內(nèi)存管理單元所管理的各空閑內(nèi)存塊以及連續(xù)內(nèi)存管理單元管理的連續(xù)內(nèi)存均小于業(yè)務(wù)模塊請求分配的內(nèi)存空間時,并不返回內(nèi)存分配失敗的響應(yīng)給對應(yīng)的業(yè)務(wù)模塊,而是遍歷所述空閑內(nèi)存管理單元記錄的所有空閑內(nèi)存塊,確定所有空閑內(nèi)存塊的內(nèi)存空間之和是否滿足業(yè)務(wù)模塊請求分配的內(nèi)存空間要求,如果滿足,則所述內(nèi)存塊關(guān)聯(lián)單元逐個獲取空閑內(nèi)存管理單元記錄的內(nèi)存塊尾的地址指針,并依次各空閑內(nèi)存塊彼此關(guān)聯(lián)起來以形成一塊類似連續(xù)內(nèi)存空間的大塊空閑內(nèi)存空間。這樣,就可以繼續(xù)為業(yè)務(wù)模塊分配其申請的內(nèi)存空間了。例如:假設(shè)在某應(yīng)用場景下,業(yè)務(wù)模塊需要申請一個8M的內(nèi)存塊,但是目前僅有1個4M的、2個2M的空閑內(nèi)存塊,連續(xù)的剩余內(nèi)存小于1M了,則通過本發(fā)明,所述業(yè)務(wù)模塊新申請到的空閑內(nèi)存塊如圖6所示。為了屏蔽業(yè)務(wù)模塊對本發(fā)明中關(guān)聯(lián)的不連續(xù)空閑內(nèi)存塊的感知,本發(fā)明內(nèi)存管理裝置需對外統(tǒng)一提供一套完整的內(nèi)存封裝接口來實現(xiàn)對內(nèi)存數(shù)據(jù)的申請、釋放、拷貝和比較數(shù)據(jù)等操作。舉例如下:針對內(nèi)存申請的封裝函數(shù)實現(xiàn):查找連續(xù)剩余內(nèi)存塊管理單元所管理的內(nèi)存單元長度是否大于等于Len;以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。