本申請涉及內(nèi)存管理技術(shù)領(lǐng)域,特別涉及一種內(nèi)存分配的處理方法及裝置。
背景技術(shù):
隨著通信技術(shù)的發(fā)展,人們可以通過在終端與服務(wù)器之間建立網(wǎng)絡(luò)連接,實現(xiàn)數(shù)據(jù)、信息的交互傳輸。不僅如此,不同終端之間也可以采用數(shù)據(jù)傳輸?shù)姆绞竭M行交互溝通,人們便可以通過上述傳輸方式建立的互聯(lián)網(wǎng)絡(luò)獲取所需的信息。
通常情況下,在互聯(lián)網(wǎng)絡(luò)中,當通訊雙方有數(shù)據(jù)交互時,需要建立一個連接,數(shù)據(jù)傳輸完成后,則斷開此連接,即每次連接只完成一項業(yè)務(wù)的發(fā)送,這樣的連接稱為短連接。但是,就不同終端而言,用戶可能在短時間內(nèi)進行多次通信,如:運行在終端系統(tǒng)中的具有聯(lián)網(wǎng)功能的程序或線程,可以向服務(wù)器端發(fā)起多次訪問請求tcp(transmissioncontrolprotocol,傳輸控制協(xié)議)連接。如果每次通信都是先連接,再傳輸?shù)脑挘敲磾?shù)據(jù)傳輸?shù)奶幚硭俣缺貙⑹艿絿乐赜绊?。同時,頻繁的短連接創(chuàng)建,需要服務(wù)器端不斷監(jiān)聽,并不斷進行連接確認,不僅增加服務(wù)器的工作負擔,而且浪費了網(wǎng)絡(luò)帶寬資源。為解決上述tcp短連接的因頻繁建立和斷開鏈路產(chǎn)生的效率問題,可以采用tcp長連接通訊方式代替短連接通訊,tcp長連接可以在一個連接上可以連續(xù)發(fā)送多個數(shù)據(jù)包。雖然采用長連接的方式進行通信可以避免短時間內(nèi)重復的連接請求,但是,長連接一般是由終端建立,每一條長連接可以傳輸大量數(shù)據(jù),假設(shè)有大量請求連接的情況,服務(wù)器需要對外提供大批量的不間斷的進行數(shù)據(jù)傳輸?shù)拈L連接。此時,需要一種可以靈活分配內(nèi)存的方法,可以優(yōu)化資源分配機制,減輕服務(wù)器的負擔。
現(xiàn)有技術(shù)中,在長連接通訊過程中,服務(wù)器在接收到分配一定大小內(nèi)存的請求時,可以首先查找內(nèi)部維護的內(nèi)存空閑塊表,并且需要根據(jù)一定的算法(例如分配最先找到的不小于申請大小的內(nèi)存塊給請求者等)找到合適大小的空閑內(nèi)存塊。如果該空閑內(nèi)存塊過大,還需要切割成已分配的部分和較小的空閑塊。然后服務(wù)器更新所述內(nèi)存空閑塊表,完成一次內(nèi)存分配。但是,在上述內(nèi)存分配方法中,容易在分配后的空閑內(nèi)存塊中生成內(nèi)存碎片,內(nèi)存利用率不高,并且,由于長連接通訊過程中需要頻繁地調(diào)配內(nèi)存,但是空閑內(nèi)存塊的物理地址不連續(xù),服務(wù)器在調(diào)用過程中需要花費較多的時間搜索可用空閑內(nèi)存塊,內(nèi)存調(diào)配效率不高。
現(xiàn)有技術(shù)中長連接通信的內(nèi)存分配處理方法在有大量請求連接的情況下服務(wù)器需要不 斷的消耗資源進行計算,花費較多的時間搜索可用空閑內(nèi)存塊,并且容易在分配后的空閑內(nèi)存塊中生成內(nèi)存碎片,導致服務(wù)器系統(tǒng)內(nèi)存利用率較低,內(nèi)存分配效率低下。
技術(shù)實現(xiàn)要素:
本申請實施例的目的在于提供一種內(nèi)存分配的處理方法及裝置,可以減少內(nèi)存分配的時間,提高系統(tǒng)內(nèi)存利用率,優(yōu)化系統(tǒng)內(nèi)存分配效率。
本申請實施例提供一種內(nèi)存分配方法及裝置是這樣實現(xiàn)的:
一種內(nèi)存分配的處理方法,所述方法可以包括:
獲取內(nèi)存申請信息,判斷申請內(nèi)存是否小于建立的內(nèi)存池中內(nèi)存塊的最大可分配內(nèi)存;
當判斷所述申請內(nèi)存大于所述最大可分配內(nèi)存時,根據(jù)所述內(nèi)存塊數(shù)據(jù)頭中記錄的大塊內(nèi)存信息,從大塊內(nèi)存中分配內(nèi)存給申請內(nèi)存;
否則,判斷所述申請內(nèi)存是否大于當前內(nèi)存塊的空閑內(nèi)存,當判斷所述申請內(nèi)存小于當前內(nèi)存塊的空閑內(nèi)存時,判斷當前內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存的需求;
若所述當前內(nèi)存塊的當前剩余空間滿足所述申請內(nèi)存的需求,從所述當前內(nèi)存塊的當前剩余空間中分配內(nèi)存給所述申請內(nèi)存。
一種內(nèi)存分配的處理裝置,所述裝置可以包括:
最大內(nèi)存判斷模塊,用于獲取內(nèi)存申請信息,判斷申請內(nèi)存是否小于建立的內(nèi)存池中內(nèi)存塊的最大可分配內(nèi)存;
大塊內(nèi)存分配模塊,用于當所述最大內(nèi)存判斷模塊判斷所述申請內(nèi)存大于所述最大可分配內(nèi)存時,根據(jù)所述內(nèi)存塊數(shù)據(jù)頭中記錄的大塊內(nèi)存信息,從大塊內(nèi)存中分配內(nèi)存給申請內(nèi)存;
剩余空間判斷模塊,用于判斷所述申請內(nèi)存是否大于當前內(nèi)存塊的空閑內(nèi)存,當判斷所述申請內(nèi)存小于當前內(nèi)存塊的空閑內(nèi)存時,判斷當前內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存的需求;
剩余空間分配模塊,用于若所述剩余空間判斷模塊判斷當前內(nèi)存塊的當前剩余空間滿足所述申請內(nèi)存的需求時,從所述當前內(nèi)存塊的當前剩余空間中分配內(nèi)存給所述申請內(nèi)存。
本申請?zhí)峁┑膬?nèi)存分配的處理方法及裝置,可以根據(jù)申請內(nèi)存的大小分別從內(nèi)存池或者大塊內(nèi)存中分配內(nèi)存,在內(nèi)存池內(nèi)存分配中又根據(jù)判斷申請內(nèi)存和空閑內(nèi)存的大小分別分配空閑內(nèi)存或者新內(nèi)存塊,不僅可以滿足申請內(nèi)存空間的需求,還可以充分利用內(nèi)存塊的空間。所述內(nèi)存池有利于服務(wù)器對小內(nèi)存空間的集中管理,尤其針對小內(nèi)存空間頻繁申請的線程, 可以從內(nèi)存池中快速申請空間,并且大大減少內(nèi)存碎片,空間利用率大大提高。
附圖說明
為了更清楚地說明本申請實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請中記載的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是本申請?zhí)峁┑膬?nèi)存分配處理方法的一種實施例的方法流程圖示意圖;
圖2是本申請?zhí)峁┑膬?nèi)存塊的一種實施例的結(jié)構(gòu)示意圖;
圖3是本申請?zhí)峁┑纳暾垉?nèi)存大于空閑內(nèi)存時的內(nèi)存處理方法的一種實施例的流程圖;
圖4是本申請?zhí)峁┑慕⑿聝?nèi)存塊的一種實施例的結(jié)構(gòu)示意圖;
圖5是本申請?zhí)峁┑膹目臻e內(nèi)存分配內(nèi)存方法的一種實施例的流程圖;
圖6是本申請?zhí)峁┑膬?nèi)存釋放內(nèi)存的一種實施例的方法流程圖;
圖7是本申請?zhí)峁┑膬?nèi)存分配處理裝置的一種實施例的模塊結(jié)構(gòu)示意圖;
圖8是本申請?zhí)峁┑膬?nèi)存分配處理裝置的另一種實施例的模塊結(jié)構(gòu)示意圖;
圖9是本申請?zhí)峁┑膬?nèi)存分配處理裝置的另一種實施例的模塊結(jié)構(gòu)示意圖;
圖10是本申請?zhí)峁┑氖S嗫臻g分配模塊的一種實施例的模塊結(jié)構(gòu)示意圖;
圖11是本申請?zhí)峁┑膬?nèi)存分配處理裝置的另一種實施例的模塊結(jié)構(gòu)示意圖;
圖12是本申請?zhí)峁┑膬?nèi)存分配處理裝置的另一種實施例的模塊結(jié)構(gòu)示意圖;
圖13是本申請?zhí)峁┑囊厌尫艃?nèi)存鏈表更新模塊的另一種實施例的模塊結(jié)構(gòu)示意圖。
具體實施方式
為了使本技術(shù)領(lǐng)域的人員更好地理解本申請中的技術(shù)方案,下面將結(jié)合本申請實施例中的附圖,對本申請實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本申請一部分實施例,而不是全部的實施例?;诒旧暾堉械膶嵤├?,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應(yīng)當屬于本申請保護的范圍。
下面結(jié)合附圖對本申請所述的內(nèi)存分配的處理方法進行詳細的說明。圖1是本申請?zhí)峁┑膬?nèi)存分配的處理方法的一種實施例的方法流程圖示意圖。雖然本申請?zhí)峁┝巳缦率鰧嵤├蚋綀D所示的方法操作步驟,但基于常規(guī)或者無需創(chuàng)造性的勞動在所述方法中可以包括更多或者更少的操作步驟。在邏輯性上不存在必要因果關(guān)系的步驟中,這些步驟的執(zhí)行順序不限于本申請實施例提供的執(zhí)行順序。所述方法在實際中的內(nèi)存分配處理過程中或者裝置執(zhí)行 時,可以按照實施例或者附圖所示的方法順序執(zhí)行或者并行執(zhí)行(例如并行處理器或者多線程處理的環(huán)境)。
具體的本申請?zhí)峁┑囊环N內(nèi)存分配的處理方法的一種實施例如圖1所示,所述方法可以包括:
s1:獲取內(nèi)存申請信息,判斷申請內(nèi)存是否小于建立的內(nèi)存池中內(nèi)存塊的最大可分配內(nèi)存。
在長連接進程中,一般會頻繁地向服務(wù)器申請小內(nèi)存空間,此時,服務(wù)器會在短時間內(nèi)連續(xù)接收到長連接進程發(fā)送的內(nèi)存申請信息,所述內(nèi)存申請信息可以是申請內(nèi)存空間的大小等信息。本申請實施例中,服務(wù)器可以在內(nèi)存中建立內(nèi)存池,所述內(nèi)存池可以在此類小內(nèi)存空間申請頻繁的進程中使用,直至所述進程完成。所述內(nèi)存池可以是位于服務(wù)器內(nèi)存中的預(yù)先劃分的內(nèi)存空間。所述建立的內(nèi)存池可以被設(shè)置成:
ss1:被劃分成包括至少一個預(yù)設(shè)固定大小的包括數(shù)據(jù)頭和數(shù)據(jù)存儲區(qū)域的內(nèi)存塊;
ss2:內(nèi)存池中的內(nèi)存塊被設(shè)置成按照內(nèi)存塊的空閑內(nèi)存從大到小的順序排列。
所述內(nèi)存池中可以劃分至少一個內(nèi)存塊,所述內(nèi)存塊的大小為預(yù)設(shè)值,比如10k、1m等。當所述內(nèi)存池中包括兩個或者兩個以上的內(nèi)存塊時,整個內(nèi)存池中的內(nèi)存塊之間形成內(nèi)存塊鏈表。圖2是本申請?zhí)峁┑膬?nèi)存塊的一種實施例的結(jié)構(gòu)示意圖,如圖2所示,所述內(nèi)存塊可以包括數(shù)據(jù)頭和數(shù)據(jù)存儲區(qū),其中,所述數(shù)據(jù)存儲區(qū)用于存儲數(shù)據(jù)存儲信息,所述數(shù)據(jù)頭用于存儲數(shù)據(jù)頭信息,所述數(shù)據(jù)頭信息可以包括:
當前內(nèi)存塊首地址信息;
上一個內(nèi)存塊首地址信息、下一個內(nèi)存塊首地址信息;
未分配內(nèi)存空間地址信息、空閑內(nèi)存大小信息;
大塊內(nèi)存首地址信息、大塊內(nèi)存大小信息;
已釋放內(nèi)存空間地址信息、已釋放內(nèi)存大小信息。
其中,所述當前內(nèi)存塊首地址信息可以存儲當前內(nèi)存塊的物理地址信息,比如當前內(nèi)存塊的首地址“0x8049320”。如前所述,當所述內(nèi)存池包括多個內(nèi)存塊時,內(nèi)存塊之間的物理地址為連續(xù)的,所述上一個內(nèi)存塊首地址信息、下一個內(nèi)存塊首地址信息可以分別存儲當前內(nèi)存塊的上一個、下一個內(nèi)存塊的首地址信息。所述下一個內(nèi)存塊首地址可以是在當前內(nèi)存塊首地址上偏移內(nèi)存塊的預(yù)設(shè)固定大小后得到的地址。如圖2所示,內(nèi)存塊的空閑內(nèi)存可以包括未分配內(nèi)存以及已釋放內(nèi)存,所述未分配內(nèi)存為內(nèi)存塊中還未存儲過任何數(shù)據(jù)信息的數(shù)據(jù)存儲區(qū),所述已釋放內(nèi)存為內(nèi)存塊中已存儲過數(shù)據(jù),但是存儲數(shù)據(jù)已經(jīng)被標記為釋放的數(shù)據(jù)存儲區(qū)。所述大塊內(nèi)存可以是在內(nèi)存池之外的一個或者多個內(nèi)存空間,本實施例中的大 塊內(nèi)存的內(nèi)存空間不固定,一般大于內(nèi)存塊的最大可分配內(nèi)存,所述最大可分配內(nèi)存可以包括內(nèi)存塊的已分配內(nèi)存和可分配內(nèi)存。當存在多個大塊內(nèi)存時,可以采用鏈表的形式將所述多個大塊內(nèi)存串聯(lián)起來,如圖2所示,大塊內(nèi)存1的下一個內(nèi)存地址指向大塊內(nèi)存2。所述大塊內(nèi)存首地址信息可以存儲內(nèi)存池之外的大塊內(nèi)存的首地址信息,所述大塊內(nèi)存大小信息可以存儲相應(yīng)的大塊內(nèi)存的內(nèi)存空間信息,通過所述大塊內(nèi)存的首地址信息可以遍歷可以申請使用的大塊內(nèi)存,并了解對應(yīng)的大塊內(nèi)存的內(nèi)存大小。
在小內(nèi)存空間申請使用較頻繁的進程中,偶爾也會申請較大的內(nèi)存,此時,內(nèi)存池的內(nèi)存塊已經(jīng)不能滿足進程申請內(nèi)存的需求。本實施例中,可以通過判斷申請內(nèi)存是否小于內(nèi)存塊的最大可分配內(nèi)存,確定分配內(nèi)存塊內(nèi)存還是大塊內(nèi)存。
s2:當判斷所述申請內(nèi)存大于所述最大可分配內(nèi)存時,根據(jù)所述內(nèi)存塊的數(shù)據(jù)頭中記錄的大塊內(nèi)存信息,從大塊內(nèi)存中分配內(nèi)存給申請內(nèi)存。
本實施例中的所述最大可分配內(nèi)存一般是內(nèi)存塊的數(shù)據(jù)存儲區(qū)的大小,一般情況下,所述最大可分配內(nèi)存大小為固定預(yù)設(shè)值。當判斷結(jié)果為所述申請內(nèi)存大于內(nèi)存塊的最大可分配內(nèi)存時,可以根據(jù)當前內(nèi)存塊的數(shù)據(jù)頭中記錄的大塊內(nèi)存信息,從所述大塊內(nèi)存中分配內(nèi)存給申請內(nèi)存。所述數(shù)據(jù)頭信息存儲內(nèi)存池外部可用的大塊內(nèi)存的地址和對應(yīng)的大塊內(nèi)存的大小信息。根據(jù)申請內(nèi)存的大小,遍歷所述大塊內(nèi)存,確定可以分配內(nèi)存給申請內(nèi)存的大塊內(nèi)存,例如,大塊內(nèi)存首地址鏈表中第一個內(nèi)存大于所述申請內(nèi)存的大塊內(nèi)存。
需要說明的是,在將大塊內(nèi)存的部分內(nèi)存分配給申請內(nèi)存后,所述大塊內(nèi)存的內(nèi)存空間減少,所述大塊內(nèi)存的首地址也相應(yīng)偏移。本實施例中,在所述從所述大塊內(nèi)存中分配內(nèi)存給申請內(nèi)存之后,可以包括以下步驟:
更新所述大塊內(nèi)存的首地址;
將所述大塊內(nèi)存的首地址信息以及大小信息更新至所述內(nèi)存池中內(nèi)存塊的數(shù)據(jù)頭。
從內(nèi)存池之外的大塊內(nèi)存分配申請內(nèi)存,解決了內(nèi)存池中小內(nèi)存塊偶爾不能滿足申請內(nèi)存需求的問題。另外,在從大內(nèi)存塊分配內(nèi)存后,將大內(nèi)存塊的地址和大小信息更新至每個內(nèi)存塊中,可以保證內(nèi)存塊存儲最新的大內(nèi)存塊地址和大小信息。
s3:否則,判斷所述申請內(nèi)存是否大于當前內(nèi)存塊的空閑內(nèi)存,當判斷所述申請內(nèi)存小于當前內(nèi)存塊的空閑內(nèi)存時,判斷當前內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存的需求。
當判斷結(jié)果為所述申請內(nèi)存小于所述最大可分配內(nèi)存時,可以確定在內(nèi)存池中申請內(nèi) 存。這里需要分兩種情況,一種是所述申請內(nèi)存小于當前內(nèi)存塊的空閑內(nèi)存,另一種是所述申請內(nèi)存大于或等于當前內(nèi)存塊的空閑內(nèi)存。上述兩種不同情況下,分配內(nèi)存的方式不同。
圖3是本申請?zhí)峁┑纳暾垉?nèi)存大于空閑內(nèi)存時的內(nèi)存處理方法的一種實施例的流程圖,如圖3所示,包括:
s11:當判斷所述申請內(nèi)存大于或等于當前內(nèi)存塊的空閑內(nèi)存時,基于當前內(nèi)存塊數(shù)據(jù)頭記錄的內(nèi)存塊鏈表依次在所述內(nèi)存池中查找空閑內(nèi)存大于或等于所述申請內(nèi)存的可用內(nèi)存塊。
當所述當前內(nèi)存塊的空閑內(nèi)存不能滿足所述申請內(nèi)存時,可以基于當前內(nèi)存塊數(shù)據(jù)頭記錄的內(nèi)存塊鏈表信息在所述內(nèi)存池中查找下一塊空閑內(nèi)存大于或等于所述申請內(nèi)存的可用內(nèi)存塊。
在本申請的另一個實施場景中,當所述內(nèi)存池中內(nèi)存塊的內(nèi)存塊鏈表被設(shè)置成按照內(nèi)存塊的空閑內(nèi)存從大到小的順序排列時,可以基于當前內(nèi)存塊數(shù)據(jù)頭記錄的內(nèi)存塊鏈表信息判斷當前內(nèi)存塊的上一塊內(nèi)存塊的空閑內(nèi)存是否大于或等于所述申請內(nèi)存。本實施例在已經(jīng)排序的內(nèi)存塊鏈表中查找空閑內(nèi)存大于或等于所述申請內(nèi)存的可用內(nèi)存塊,可以節(jié)省可用內(nèi)存的查找時間,提高查找效率。
s12:相應(yīng)地,若查找到所述可用內(nèi)存塊,則所述判斷當前內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存需求包括判斷所述可用內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存的需求。
若查找到空閑內(nèi)存大于或等于所述申請內(nèi)存可用內(nèi)存塊,可以判斷所述可用內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存需求。
如圖3所示,在本申請的另一個實施例中,所述方法還可以包括:
s21:若在所述內(nèi)存池中未查找到空閑內(nèi)存大于或等于所述申請內(nèi)存的可用內(nèi)存塊,則在所述內(nèi)存池中創(chuàng)建新內(nèi)存塊,以及使用所述新內(nèi)存塊為所述申請內(nèi)存分配內(nèi)存。
如果在所述內(nèi)存池中沒有查找到空閑內(nèi)存大于或等于所述申請內(nèi)存的可用內(nèi)存塊時,可以在所述內(nèi)存池中創(chuàng)建新內(nèi)存塊,并使用所述新內(nèi)存塊為所述申請內(nèi)存分配內(nèi)存。本實施例中的新內(nèi)存塊可以建立于所述內(nèi)存池的末端,所述內(nèi)存池的最后一個內(nèi)存塊指向所述新內(nèi)存塊。圖4是本申請?zhí)峁┑慕⑿聝?nèi)存塊的一種實施例的結(jié)構(gòu)示意圖,如圖4所示,在建立新內(nèi)存塊時,首先將所述新內(nèi)存塊的數(shù)據(jù)存儲區(qū)的部分內(nèi)存分配給所述申請內(nèi)存,再將剩余的部分內(nèi)存作為未分配內(nèi)存,保證新內(nèi)存塊的最大可分配內(nèi)存與其他的內(nèi)存塊的大小一致。所述新內(nèi)存塊數(shù)據(jù)頭中的大塊內(nèi)存首地址信息、大塊內(nèi)存大小信息可以復制前一個內(nèi)存塊的對應(yīng)存儲信息。本實施中在創(chuàng)建新內(nèi)存塊的同時完成對所述申請內(nèi)存的內(nèi)存分配,減少操作步驟, 提高分配效率。
如圖3所示,在本申請的另一個實施例中,所述方法還可以包括:
s31:基于內(nèi)存塊的數(shù)據(jù)頭所指示的下一個內(nèi)存塊,依次比較內(nèi)存池中內(nèi)存塊的空閑內(nèi)存與所述新內(nèi)存塊的空閑內(nèi)存的大小,將所述新內(nèi)存塊的鏈表插入到所述內(nèi)存池中空閑內(nèi)存大于所述新內(nèi)存塊的空閑內(nèi)存的前一個內(nèi)存塊與空閑內(nèi)存小于所述新內(nèi)存塊的空閑內(nèi)存的后一個內(nèi)存塊之間。
在本申請的另一個實施例中,當完成新內(nèi)存塊的建立和申請內(nèi)存的內(nèi)存分配后,可以將所述新內(nèi)存塊在所述內(nèi)存池中的相應(yīng)位置插入,保證所述內(nèi)存池中的內(nèi)存塊按照空閑內(nèi)存的從大到小排列,具體可以通過下述方式實現(xiàn):依次比較內(nèi)存池中內(nèi)存塊的空閑內(nèi)存與所述新內(nèi)存塊的空閑內(nèi)存的大小,將所述新內(nèi)存塊的鏈表插入到前一個空閑內(nèi)存大于、后一個空閑內(nèi)存小于所述新內(nèi)存塊的空閑內(nèi)存的相鄰內(nèi)存塊之間。
s4:若所述當前內(nèi)存塊的當前剩余空間滿足所述申請內(nèi)存的需求,從所述當前內(nèi)存塊的當前剩余空間中分配內(nèi)存給所述申請內(nèi)存。
若所述當前內(nèi)存塊的當前剩余空間滿足所述申請內(nèi)存的需求,也就是當前內(nèi)存塊的當前剩余空間大于或等于所述空閑內(nèi)存時,可以從所述當前內(nèi)存塊的當前剩余空間中分配內(nèi)存給申請內(nèi)存。具體地,圖5是本申請?zhí)峁┑膹目臻e內(nèi)存分配內(nèi)存方法的一種實施例的流程圖,如圖5所示,所述若所述當前內(nèi)存塊的當前剩余空間滿足所述申請內(nèi)存的需求,從所述當前內(nèi)存塊的當前剩余空間中分配內(nèi)存給所述申請內(nèi)存可以包括:
s101:若所述當前內(nèi)存塊的當前剩余空間滿足所述申請內(nèi)存的需求,優(yōu)先從當前內(nèi)存塊的當前未分配內(nèi)存空間分配內(nèi)存給申請內(nèi)存。
若所述當前內(nèi)存塊的當前剩余空間滿足所述申請內(nèi)存的需求時,可以優(yōu)先從當前內(nèi)存塊的當前未分配內(nèi)存空間分配內(nèi)存給申請內(nèi)存。具體地,首先可以判斷所述申請內(nèi)存是否小于或等于所述空閑內(nèi)存中的未分配內(nèi)存。
若所述申請內(nèi)存小于或者等于所述空閑內(nèi)存中的未分配內(nèi)存,可以從所述未分配內(nèi)存空間分配內(nèi)存給申請內(nèi)存。所述未分配內(nèi)存為內(nèi)存塊空閑內(nèi)存中從未存儲過數(shù)據(jù)的存儲區(qū),而空閑內(nèi)存塊中的已釋放內(nèi)存雖然可以使用,但是所述已釋放內(nèi)存中保留著釋放的存儲數(shù)據(jù),若要在已釋放內(nèi)存中存儲數(shù)據(jù),需要先擦除所述存儲數(shù)據(jù),再分配存儲空間。因此,在本實施例中,可以優(yōu)先將所述空閑內(nèi)存中的未分配內(nèi)存分配給所述申請內(nèi)存。
s102:若當前內(nèi)存塊的當前未分配內(nèi)存不滿足所述申請內(nèi)存的需求,則從當前內(nèi)存塊數(shù)據(jù)頭記錄的已釋放內(nèi)存的空間地址信息中查找滿足所述申請內(nèi)存的需求的內(nèi)存空間進行分 配。
若當前內(nèi)存塊的當前未分配內(nèi)存不滿足所述申請內(nèi)存的空間大小,可以從當前內(nèi)存塊數(shù)據(jù)頭記錄的已釋放內(nèi)存中查找滿足所述申請內(nèi)存需求的內(nèi)存空間進行分配。具體地,可以判斷所述空閑內(nèi)存中的已釋放內(nèi)存中是否包含內(nèi)存大于等于所述申請內(nèi)存的已釋放子內(nèi)存。本實施例中,由于內(nèi)存的使用、釋放是隨機的,時間也不一致,因此,已釋放內(nèi)存一般是不連續(xù)的,所述已釋放內(nèi)存可以包含多個已釋放子內(nèi)存。所述已釋放子內(nèi)存的內(nèi)存大小一般也是不相同的,可以從已釋放內(nèi)存中搜索是否包含內(nèi)存大于等于所述申請內(nèi)存的已釋放子內(nèi)存。
需要說明的是,當所述已釋放內(nèi)存包含多個已釋放子內(nèi)存時,所述已釋放內(nèi)存空間地址信息可以包含多個已釋放子內(nèi)存的首地址信息。
如圖5所示,在本申請的另一個實施例中,所述方法還可以包括:
s201:若未能從當前內(nèi)存塊數(shù)據(jù)頭記錄的已釋放內(nèi)存中查找到滿足所述申請內(nèi)存需求的內(nèi)存空間,基于當前內(nèi)存塊數(shù)據(jù)頭記錄的地址信息依次在所述內(nèi)存池中查找空閑內(nèi)存大于或等于所述申請內(nèi)存的可用內(nèi)存塊。
由于已釋放子內(nèi)存之間可以是不連續(xù)的,而申請內(nèi)存需要是連續(xù)的內(nèi)存空間,因此所述已釋放內(nèi)存包含的已釋放子內(nèi)存可能均不能滿足申請內(nèi)存的需求。因此,當判斷結(jié)果為所述可用內(nèi)存中的已釋放內(nèi)存中不包含內(nèi)存大于或者等于所述申請內(nèi)存的已釋放子內(nèi)存時,可以基于當前內(nèi)存塊數(shù)據(jù)頭記錄的內(nèi)存塊鏈表在所述內(nèi)存池中查找下一塊空閑內(nèi)存大于或等于所述申請內(nèi)存的可用內(nèi)存塊。
s202:相應(yīng)的,若查找到所述可用內(nèi)存塊,則所述判斷當前內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存需求包括判斷所述可用內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存的需求。
如果查找到所述可用內(nèi)存塊,可以判斷所述可用內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存需求。若所述可用內(nèi)存塊的當前剩余空間滿足所述申請內(nèi)存需求,可以重復步驟s101-s102,若所述可用內(nèi)存塊的當前剩余空間不能滿足所述申請內(nèi)存需求,可以重復步驟s11-s12,具體實施例方式在此不再贅述。
如圖5所示,在本申請的另一個實施例中,所述方法還可以包括:
s301:若在所述內(nèi)存池中未查找到空閑內(nèi)存大于或等于所述申請內(nèi)存的可用內(nèi)存塊,則在所述內(nèi)存池中創(chuàng)建新內(nèi)存塊,以及使用所述新內(nèi)存塊為所述申請內(nèi)存分配內(nèi)存。
s301的實施方式可以參考s21的實施方式,在此不再贅述。
在本申請的另一個實施例中,可以對大塊內(nèi)存以及內(nèi)存池中的內(nèi)存塊進行內(nèi)存釋放,圖 6是本申請?zhí)峁┑膬?nèi)存釋放內(nèi)存的一種實施例的方法流程圖,如圖6所示,包括:
s1001:獲取內(nèi)存釋放請求信息,判斷釋放內(nèi)存是否大于所述最大可分配內(nèi)存。
所述內(nèi)存釋放請求信息可以包括請求釋放內(nèi)存的地址信息和大小,由于內(nèi)存池的內(nèi)存分配、釋放和工作線程是同步存在,工作線程需要釋放某塊內(nèi)存時,當然首先判斷是不是內(nèi)存池中的內(nèi)存塊的內(nèi)存。具體地可以首先判斷釋放內(nèi)存是否大于所述最大可分配內(nèi)存。
s1002:當判斷結(jié)果為釋放內(nèi)存大于所述最大可分配內(nèi)存時,根據(jù)所述內(nèi)存釋放請求信息以及數(shù)據(jù)頭記錄的大塊內(nèi)存信息定位所述釋放內(nèi)存對應(yīng)的大塊內(nèi)存的首地址。
當判斷所述釋放內(nèi)存大于所述最大可分配內(nèi)存時,可以確定請求釋放的是大塊內(nèi)存。此時,可以根據(jù)所述內(nèi)存釋放請求信息中的釋放內(nèi)存的地址信息以及數(shù)據(jù)頭記錄的大塊內(nèi)存信息,在所述數(shù)據(jù)頭中的大塊內(nèi)存首地址信息鏈接并定位到所述大塊內(nèi)存的首地址。
s1003:釋放定位得到的大塊內(nèi)存的數(shù)據(jù)信息,刪除內(nèi)存塊數(shù)據(jù)頭中記錄的大塊內(nèi)存地址鏈表中所述釋放內(nèi)存對應(yīng)的大塊內(nèi)存的首地址信息。
在定位到所述大塊內(nèi)存的首地址后,根據(jù)所述釋放內(nèi)存的大小信息釋放定位得到的大塊內(nèi)存的數(shù)據(jù)信息。當所述大塊內(nèi)存釋放內(nèi)存后,可以刪除內(nèi)存塊數(shù)據(jù)頭中記錄的大塊內(nèi)存地址鏈表中所述釋放內(nèi)存對應(yīng)的大塊內(nèi)存的首地址信息,保持所述數(shù)據(jù)頭記錄的是最新的大塊內(nèi)存地址信息。
如圖6所述,在本申請的另一個實施例中,所述方法還可以包括:
s2001:當判斷結(jié)果為釋放內(nèi)存小于所述最大可分配內(nèi)存時,根據(jù)內(nèi)存釋放請求信息定位所述釋放內(nèi)存在所述內(nèi)存池對應(yīng)的待釋放內(nèi)存塊中的地址,并釋放所述待釋放內(nèi)存塊的所述釋放內(nèi)存的內(nèi)存空間。
當判斷所述釋放內(nèi)存小于所述最大可分配內(nèi)存時,可以根據(jù)所述內(nèi)存釋放請求信息中的地址信息定位所述釋放內(nèi)存在所述內(nèi)存池對應(yīng)的待釋放內(nèi)存塊中的地址,并釋放所述待釋放內(nèi)存塊的所述釋放內(nèi)存的內(nèi)存空間。
s2002:獲取所述待釋放內(nèi)存塊釋放內(nèi)存后生成的已釋放內(nèi)存的內(nèi)存空間地址,將所述內(nèi)存空間地址插入到所述待釋放內(nèi)存塊數(shù)據(jù)頭記錄的已釋放內(nèi)存的空間地址信息中。
在定位到所述釋放內(nèi)存在所述內(nèi)存池中的待釋放內(nèi)存塊中的地址,可以將所述定位得到的釋放內(nèi)存劃分為已釋放內(nèi)存。需要說明的是,由于內(nèi)存池中的內(nèi)存塊是預(yù)設(shè)大小的,內(nèi)存塊中的內(nèi)存不能像大塊內(nèi)存中的存儲信息一樣被服務(wù)器擦除,只能被覆蓋,因此,所述待釋放內(nèi)存可以被標記為已釋放內(nèi)存,等下次利用所述已釋放內(nèi)存時,可以對所述已釋放內(nèi)存中的存儲信息進行覆蓋。
在本實施例中,所述將所述內(nèi)存空間地址插入到所述待釋放內(nèi)存塊數(shù)據(jù)頭記錄的已釋放 內(nèi)存的空間地址信息中可以包括:
判斷所述內(nèi)存空間地址所在的當前節(jié)點,與所述當前節(jié)點的前一個節(jié)點和當前節(jié)點后一個節(jié)點是否為連續(xù)內(nèi)存;
若判斷的結(jié)果為是連續(xù)內(nèi)存,則將所述當前節(jié)點、所述當前節(jié)點的前一個節(jié)點、所述當前節(jié)點的后一個節(jié)點合并為一個連續(xù)內(nèi)存的新節(jié)點記錄到所述待釋放內(nèi)存塊數(shù)據(jù)頭記錄的已釋放內(nèi)存的空間地址信息中;否則,將所述內(nèi)存空間地址作為新節(jié)點插入到所述待釋放內(nèi)存塊數(shù)據(jù)頭記錄的已釋放內(nèi)存的空間地址信息中。
本實施例中的當前節(jié)點是指當前釋放內(nèi)存,所述前一個節(jié)點、后一個節(jié)點分別指所述釋放內(nèi)存的前一個已釋放內(nèi)存和后一個釋放內(nèi)存。通過檢查當前釋放空間的地址是否與相鄰已釋放空間重復,若重復,將當前釋放空間與相鄰已釋放空間合并成一個連續(xù)的已釋放空間,可以方便在后續(xù)可以查找到準確的已釋放空間的信息。
如圖6所述,在本申請的另一個實施例中,所述方法還可以包括:
s3001:判斷所述新節(jié)點是否位于內(nèi)存池的首個內(nèi)存塊,若所述新節(jié)點不是位于內(nèi)存池的首個內(nèi)存塊,則判斷所述待釋放內(nèi)存塊的空閑內(nèi)存與最大可分配內(nèi)存是否相等;
s3002:若判斷的結(jié)果為所述待釋放內(nèi)存塊的空閑內(nèi)存與最大可分配內(nèi)存相等時,釋放所述待釋放內(nèi)存塊的數(shù)據(jù)存儲區(qū)域內(nèi)存空間,刪除待釋放內(nèi)存塊節(jié)點。
當所述新節(jié)點是內(nèi)存池的首個內(nèi)存塊時,內(nèi)存釋放流程結(jié)束。當所述新節(jié)點位于內(nèi)存池的節(jié)點內(nèi)存塊中時,可以判斷所述待釋放內(nèi)存塊的空閑內(nèi)存塊與最大可分配內(nèi)存是否相等。當所述待釋放內(nèi)存塊的空閑內(nèi)存與最大可分配內(nèi)存相等時,可以確定在本次內(nèi)存釋放之后,該內(nèi)存塊的內(nèi)存處于閑置狀態(tài)。此時,可以將所述釋放內(nèi)存塊的數(shù)據(jù)存儲區(qū)的空間釋放,并刪除所述待釋放內(nèi)存塊節(jié)點,即,例如將所述待釋放內(nèi)存塊k的前一個內(nèi)存塊k-1中指向下一個內(nèi)存塊的地址設(shè)置為指向所述待釋放內(nèi)存塊k的下一個內(nèi)存塊k+1。
如圖6所述,在本申請的另一個實施例中,所述方法還可以包括:
s4001:若判斷的結(jié)果為所述待釋放內(nèi)存塊的空閑內(nèi)存與最大可分配內(nèi)存不相等時,對所述內(nèi)存池中內(nèi)存塊的空閑內(nèi)存進行大小判斷后將內(nèi)存塊設(shè)置成按照空閑內(nèi)存從大到小的順序排序。
當所述釋放內(nèi)存塊的空閑內(nèi)存與最大可分配內(nèi)存不相等,可以對所述內(nèi)存池中內(nèi)存塊的空閑內(nèi)存進行大小判斷后將內(nèi)存塊設(shè)置成按照空閑內(nèi)存從大到小的順序排序,保證內(nèi)存池中內(nèi)存塊的空閑內(nèi)存按照從大到小順序排列。
在本申請的實施例中,當檢測到內(nèi)存池的首個內(nèi)存塊指向下一個內(nèi)存塊的頭部地址為空時,且所述首個內(nèi)存塊的空閑內(nèi)存與所述內(nèi)存塊的最大可分配內(nèi)存相等時,執(zhí)行銷毀所述內(nèi) 存池,釋放內(nèi)存池空間。
本申請?zhí)峁┑膬?nèi)存分配的處理方法,可以根據(jù)申請內(nèi)存的大小分別從內(nèi)存池或者大塊內(nèi)存中分配內(nèi)存,在內(nèi)存池內(nèi)存分配中又根據(jù)判斷申請內(nèi)存和空閑內(nèi)存的大小分別分配空閑內(nèi)存或者新內(nèi)存塊,不僅可以滿足申請內(nèi)存空間的需求,還可以充分利用內(nèi)存塊的空間。所述內(nèi)存池有利于服務(wù)器對小內(nèi)存空間的集中管理,尤其針對小內(nèi)存空間頻繁申請的線程,可以從內(nèi)存池中快速申請空間,并且大大減少內(nèi)存碎片,空間利用率大大提高。
本申請另一方面還提供一種內(nèi)存分配裝置,圖7是本申請?zhí)峁┑膬?nèi)存分配的處理裝置的一種實施例的模塊結(jié)構(gòu)示意圖,如圖7所示,所述裝置70可以包括:
最大內(nèi)存判斷模塊71,用于獲取內(nèi)存申請信息,判斷申請內(nèi)存是否小于建立的內(nèi)存池中內(nèi)存塊的最大可分配內(nèi)存;
大塊內(nèi)存分配模塊72,用于當所述最大內(nèi)存判斷模塊判斷所述申請內(nèi)存大于所述最大可分配內(nèi)存時,根據(jù)所述內(nèi)存塊數(shù)據(jù)頭中記錄的大塊內(nèi)存信息,從大塊內(nèi)存中分配內(nèi)存給申請內(nèi)存;
剩余空間判斷模塊73,用于判斷所述申請內(nèi)存是否大于當前內(nèi)存塊的空閑內(nèi)存,當判斷所述申請內(nèi)存小于當前內(nèi)存塊的空閑內(nèi)存時,判斷當前內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存的需求;
剩余空間分配模塊74,用于若所述剩余空間判斷模塊判斷當前內(nèi)存塊的當前剩余空間滿足所述申請內(nèi)存的需求時,從所述當前內(nèi)存塊的當前剩余空間中分配內(nèi)存給所述申請內(nèi)存。
需要說明的是,本實施例中的所述建立的內(nèi)存池可以被設(shè)置成:
被劃分成包括至少一個預(yù)設(shè)固定大小的包括數(shù)據(jù)頭和數(shù)據(jù)存儲區(qū)域的內(nèi)存塊;
內(nèi)存池中內(nèi)存塊被設(shè)置成按照內(nèi)存塊的空閑內(nèi)存從大到小的順序排列。
圖8是本申請?zhí)峁┑膬?nèi)存分配裝置的另一種實施例的模塊結(jié)構(gòu)示意圖,如圖8所示,裝置80還可以包括:
第一剩余內(nèi)存塊查找模塊81,用于當所述剩余空間判斷模塊判斷所述申請內(nèi)存大于或等于當前內(nèi)存塊的空閑內(nèi)存時,基于當前內(nèi)存塊數(shù)據(jù)頭記錄的內(nèi)存塊鏈表依次在所述內(nèi)存池中查找空閑內(nèi)存大于或等于所述申請內(nèi)存的可用內(nèi)存塊;
第一剩余內(nèi)存塊判斷模塊82,用于若查找到所述可用內(nèi)存塊,則所述判斷當前內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存需求包括判斷所述可用內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存的需求。
圖9是本申請?zhí)峁┑膬?nèi)存分配裝置的另一種實施例的模塊結(jié)構(gòu)示意圖,如圖9所示,裝置90還可以包括:
第一新內(nèi)存塊創(chuàng)建模塊91,用于若在所述內(nèi)存池中未查找到空閑內(nèi)存大于或等于所述申請內(nèi)存的可用內(nèi)存塊,則在所述內(nèi)存池中創(chuàng)建新內(nèi)存塊,以及使用所述新內(nèi)存塊為所述申請內(nèi)存分配內(nèi)存。
第一內(nèi)存塊排序模塊92,用于基于內(nèi)存塊的數(shù)據(jù)頭所指示的下一個內(nèi)存塊,依次比較內(nèi)存池中內(nèi)存塊的空閑內(nèi)存與所述新內(nèi)存塊的空閑內(nèi)存的大小,將所述新內(nèi)存塊的鏈表插入到所述內(nèi)存池中空閑內(nèi)存大于所述新內(nèi)存塊的空閑內(nèi)存的前一個內(nèi)存塊與空閑內(nèi)存小于所述新內(nèi)存塊的空閑內(nèi)存的后一個內(nèi)存塊之間。
圖10是本申請?zhí)峁┑氖S嗫臻g分配模塊74的一種實施例的模塊結(jié)構(gòu)示意圖,在本申請的一個實施例場景中,所述剩余空間分配模塊74可以包括:
未分配內(nèi)存分配模塊101,用于若所述當前內(nèi)存塊的當前剩余空間滿足所述申請內(nèi)存的需求,優(yōu)先從當前內(nèi)存塊的當前未分配內(nèi)存空間分配內(nèi)存給申請內(nèi)存;
已釋放內(nèi)存分配模塊102,用于若當前內(nèi)存塊的當前未分配內(nèi)存不滿足所述申請內(nèi)存的需求,則從當前內(nèi)存塊數(shù)據(jù)頭記錄的已釋放內(nèi)存的空間地址信息中查找滿足所述申請內(nèi)存的需求的內(nèi)存空間進行分配。
如圖10所示,在本申請另一個實施例中,所述剩余空間分配模塊74還可以包括:
第二剩余內(nèi)存塊查找模塊103,用于若未能從當前內(nèi)存塊數(shù)據(jù)頭記錄的已釋放內(nèi)存中查找到滿足所述申請內(nèi)存需求的內(nèi)存空間,基于當前內(nèi)存塊數(shù)據(jù)頭記錄的地址信息依次在所述內(nèi)存池中查找空閑內(nèi)存大于或等于所述申請內(nèi)存的可用內(nèi)存塊;
第二剩余內(nèi)存塊判斷模塊104,用于若查找到所述可用內(nèi)存塊,則判斷所述可用內(nèi)存塊的當前剩余空間是否滿足所述申請內(nèi)存需求。
如圖10所示,在本申請另一個實施例中,所述剩余空間分配模塊74還可以包括:
第二新內(nèi)存塊創(chuàng)建單元105,用于當?shù)诙S鄡?nèi)存塊判斷模塊判斷結(jié)果為在所述內(nèi)存池中未查找到空閑內(nèi)存大于或等于所述申請內(nèi)存的可用內(nèi)存塊,則在所述內(nèi)存池中創(chuàng)建新內(nèi)存塊,以及使用所述新內(nèi)存塊為所述申請內(nèi)存分配內(nèi)存。
圖11是本申請?zhí)峁┑膬?nèi)存分配處理裝置的另一種實施例的模塊結(jié)構(gòu)示意圖,如圖11所示,裝置110還可以包括:
釋放內(nèi)存判斷模塊1101,用于獲取內(nèi)存釋放請求信息,判斷釋放內(nèi)存是否大于所述最大可分配內(nèi)存;
大塊內(nèi)存定位模塊1102,用于當所述釋放內(nèi)存判斷單元的判斷結(jié)果為釋放內(nèi)存大于所述 最大可分配內(nèi)存時,根據(jù)所述內(nèi)存釋放請求信息以及數(shù)據(jù)頭記錄的大塊內(nèi)存信息定位所述釋放內(nèi)存對應(yīng)的大塊內(nèi)存的首地址;
大塊內(nèi)存釋放模塊1103,用于釋放定位得到的大塊內(nèi)存的數(shù)據(jù)信息,刪除內(nèi)存塊數(shù)據(jù)頭中記錄的大塊內(nèi)存地址鏈表中所述釋放內(nèi)存對應(yīng)的大塊內(nèi)存的首地址信息。
圖12是本申請?zhí)峁┑膬?nèi)存分配處理裝置的另一種實施例的模塊結(jié)構(gòu)示意圖,如圖12所示,裝置120還可以包括:
釋放內(nèi)存定位模塊1201,用于當釋放內(nèi)存判斷單元的判斷結(jié)果為釋放內(nèi)存小于所述最大可分配內(nèi)存時,根據(jù)內(nèi)存釋放請求信息定位所述釋放內(nèi)存在所述內(nèi)存池對應(yīng)的待釋放內(nèi)存塊中的地址,并釋放所述待釋放內(nèi)存塊的所述釋放內(nèi)存的內(nèi)存空間;
已釋放內(nèi)存鏈表更新模塊1202,用于獲取所述待釋放內(nèi)存塊釋放內(nèi)存后生成的已釋放內(nèi)存的內(nèi)存空間地址,將所述內(nèi)存空間地址插入到所述待釋放內(nèi)存塊數(shù)據(jù)頭記錄的已釋放內(nèi)存的空間地址信息中。
圖13是本申請?zhí)峁┑囊厌尫艃?nèi)存鏈表更新模塊的另一種實施例的模塊結(jié)構(gòu)示意圖,如圖13所示,已釋放內(nèi)存鏈表更新模塊1202可以包括:
連續(xù)內(nèi)存判斷模塊1301,用于判斷所述內(nèi)存空間地址所在的當前節(jié)點,與所述當前節(jié)點的前一個節(jié)點和當前節(jié)點后一個節(jié)點是否為連續(xù)內(nèi)存;
內(nèi)存合并模塊1302,用于若所述連續(xù)內(nèi)存判斷模塊的判斷結(jié)果為是連續(xù)內(nèi)存,則將所述當前節(jié)點、所述當前節(jié)點的前一個節(jié)點、所述當前節(jié)點的后一個節(jié)點合并為一個連續(xù)內(nèi)存的新節(jié)點記錄到所述待釋放內(nèi)存塊數(shù)據(jù)頭記錄的已釋放內(nèi)存的空間地址信息中;否則,將所述內(nèi)存空間地址作為新節(jié)點插入到所述待釋放內(nèi)存塊數(shù)據(jù)頭記錄的已釋放內(nèi)存的空間地址信息中。
如圖13所示,在本申請另一個實施例中,所述已釋放內(nèi)存鏈表更新模塊1202還可以包括:
新節(jié)點判斷模塊1303,用于判斷所述新節(jié)點是否位于內(nèi)存池的首個內(nèi)存塊,若所述新節(jié)點不是位于內(nèi)存池的首個內(nèi)存塊,則判斷所述待釋放內(nèi)存塊的空閑內(nèi)存與最大可分配內(nèi)存是否相等;
節(jié)點釋放模塊1304,用于若所述新節(jié)點判斷模塊的判斷結(jié)果為所述待釋放內(nèi)存塊的空閑內(nèi)存與最大可分配內(nèi)存相等時,釋放所述待釋放內(nèi)存塊的數(shù)據(jù)存儲區(qū)域內(nèi)存空間,刪除待釋放內(nèi)存塊節(jié)點。
如圖13所示,在本申請另一個實施例中,所述已釋放內(nèi)存鏈表更新模塊1202還可以包括:
第一內(nèi)存塊排序模塊1305,用于若所述新節(jié)點判斷模塊的判斷結(jié)果為所述待釋放內(nèi)存塊的空閑內(nèi)存與最大可分配內(nèi)存不相等時,對所述內(nèi)存池中內(nèi)存塊的空閑內(nèi)存進行大小判斷后將內(nèi)存塊設(shè)置成按照空閑內(nèi)存從大到小的順序排序。
在本申請的一個實施例中,所述裝置還包括:
內(nèi)存池銷毀模塊,用于當檢測到內(nèi)存池的首個內(nèi)存塊指向下一個內(nèi)存塊的頭部地址為空,且所述首個內(nèi)存塊的空閑內(nèi)存與所述內(nèi)存塊的最大可分配內(nèi)存相等時,執(zhí)行銷毀所述內(nèi)存池,釋放內(nèi)存池空間。
本申請?zhí)峁┑膬?nèi)存分配的處理裝置,可以根據(jù)申請內(nèi)存的大小分別從內(nèi)存池或者大塊內(nèi)存中分配內(nèi)存,在內(nèi)存池內(nèi)存分配中又根據(jù)判斷申請內(nèi)存和空閑內(nèi)存的大小分別分配空閑內(nèi)存或者新內(nèi)存塊,不僅可以滿足申請內(nèi)存空間的需求,還可以充分利用內(nèi)存塊的空間。所述內(nèi)存池有利于服務(wù)器對小內(nèi)存空間的集中管理,尤其針對小內(nèi)存空間頻繁申請的線程,可以從內(nèi)存池中快速申請空間,并且大大減少內(nèi)存碎片,空間利用率大大提高。
盡管本申請內(nèi)容中提到內(nèi)存池內(nèi)存塊的劃分方式、內(nèi)存塊及內(nèi)存空間的地址信息記錄方式等之類的內(nèi)存信息數(shù)據(jù)設(shè)置、存儲、刪除方式描述,但是,本申請并不局限于必須是完全符合行業(yè)或某種計算機語言執(zhí)行標準或?qū)嵤├枋龅那闆r。某些標準化的計算機語言或?qū)嵤├枋龅幕A(chǔ)上略加修改后的實施方案也可以實行上述實施例相同、等同或相近、或變形后可預(yù)料的實施效果。當然,即使不采用上數(shù)據(jù)處理、判斷的方式,只要符合本申請上述各實施例的內(nèi)存數(shù)據(jù)處理、信息交互和信息判斷反饋方式,仍然可以實現(xiàn)相同的申請,在此不再贅述。
雖然本申請?zhí)峁┝巳鐚嵤├蛄鞒虉D所述的方法操作步驟,但基于常規(guī)或者無創(chuàng)造性的手段可以包括更多或者更少的操作步驟。實施例中列舉的步驟順序僅僅為眾多步驟執(zhí)行順序中的一種方式,不代表唯一的執(zhí)行順序。在實際中的裝置或客戶端產(chǎn)品執(zhí)行時,可以按照實施例或者附圖所示的方法順序執(zhí)行或者并行執(zhí)行(例如并行處理器或者多線程處理的環(huán)境)。
上述實施例闡明的模塊、裝置或模塊,具體可以由計算機芯片或?qū)嶓w實現(xiàn),或者由具有某種功能的產(chǎn)品來實現(xiàn)。為了描述的方便,描述以上裝置時以功能分為各種模塊分別描述。當然,在實施本申請時可以把各模塊的功能在同一個或多個軟件和/或硬件中實現(xiàn),也可以將實現(xiàn)同一功能的模塊由多個子模塊或子模塊的組合實現(xiàn)。
本領(lǐng)域技術(shù)人員也知道,除了以純計算機可讀程序代碼方式實現(xiàn)控制器以外,完全可以通過將方法步驟進行邏輯編程來使得控制器以邏輯門、開關(guān)、專用集成電路、可編程邏輯控 制器和嵌入微控制器等的形式來實現(xiàn)相同功能。因此這種控制器可以被認為是一種硬件部件,而對其內(nèi)部包括的用于實現(xiàn)各種功能的裝置也可以視為硬件部件內(nèi)的結(jié)構(gòu)?;蛘呱踔粒梢詫⒂糜趯崿F(xiàn)各種功能的裝置視為既可以是實現(xiàn)方法的軟件模塊又可以是硬件部件內(nèi)的結(jié)構(gòu)。
本申請可以在由計算機執(zhí)行的計算機可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)、類等等。也可以在分布式計算環(huán)境中實踐本申請,在這些分布式計算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠程處理設(shè)備來執(zhí)行任務(wù)。在分布式計算環(huán)境中,程序模塊可以位于包括存儲設(shè)備在內(nèi)的本地和遠程計算機存儲介質(zhì)中。
通過以上的實施方式的描述可知,本領(lǐng)域的技術(shù)人員可以清楚地了解到本申請可借助軟件加必需的通用硬件平臺的方式來實現(xiàn)?;谶@樣的理解,本申請的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品可以存儲在存儲介質(zhì)中,如rom/ram、磁碟、光盤等,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,移動終端,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本申請各個實施例或者實施例的某些部分所述的方法。
本說明書中的各個實施例采用遞進的方式描述,各個實施例之間相同或相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。本申請可用于眾多通用或?qū)S玫挠嬎銠C系統(tǒng)環(huán)境或配置中。例如:個人計算機、服務(wù)器計算機、手持設(shè)備或便攜式設(shè)備、平板型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、置頂盒、可編程的電子設(shè)備、網(wǎng)絡(luò)pc、小型計算機、大型計算機、包括以上任何系統(tǒng)或設(shè)備的分布式計算環(huán)境等等。
雖然通過實施例描繪了本申請,本領(lǐng)域普通技術(shù)人員知道,本申請有許多變形和變化而不脫離本申請的精神,希望所附的權(quán)利要求包括這些變形和變化而不脫離本申請的精神。