一種內(nèi)存管理方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機存儲領(lǐng)域,尤其涉及一種內(nèi)存管理方法。
【背景技術(shù)】
[0002]Hash 一般又翻譯作“散列”或“哈?!?,是一種存儲結(jié)構(gòu),大數(shù)據(jù)存儲和大流量網(wǎng)絡(luò)數(shù)據(jù)分析等涉及快速查找的場景一般都會使用哈希存儲。使用哈希存儲的一般不是單一的值,所以在使用哈希存儲的場景中,除了哈希單元本身外,一般還需要存放于另一片內(nèi)存區(qū)域的另外的存儲單元。每個應(yīng)用場景對存儲單元的使用狀況不是恒定的,需要根據(jù)實際情況進行動態(tài)變化和調(diào)整,例如,在大并發(fā)大流量的情況下,存儲單元多占用一些內(nèi)存,在空閑的情況下,存儲單元少占用一些內(nèi)存。
[0003]但是,目前很多哈希的應(yīng)用場景涉及到的內(nèi)存管理方法,一般都是使用固定大小的存儲單元,這種方法的缺點是顯而易見的:
[0004]不易擴展:因為使用的是固定大小的存儲空間,即使在高壓情況下,也會因為存儲單元不能擴展無法申請到新的可用空間而不能對新的請求或應(yīng)答作出有效處理;
[0005]資源浪費:因為使用的是固定大小的存儲空間,即使在空閑、大量內(nèi)存單元都處于非使用狀態(tài)的情況下,也會因為無法釋放而導(dǎo)致大量資源的浪費。
【發(fā)明內(nèi)容】
[0006]有鑒于此,本發(fā)明實施例提出一種內(nèi)存管理方法,以實現(xiàn)對內(nèi)存的有效管理。
[0007]本發(fā)明實施例提供了一種內(nèi)存管理方法,包括:
[0008]申請獲得存儲單元;
[0009]設(shè)定所述存儲單元的結(jié)構(gòu),使所述存儲單元包含用于指向下一個空閑的存儲單元的鄰接單元指針和用于指向下一個處于使用狀態(tài)的存儲單元下一跳指針;
[0010]設(shè)定所述存儲單元所歸屬的內(nèi)存資源的結(jié)構(gòu),使所述內(nèi)存資源包含用于指向下一個內(nèi)存資源的鄰接內(nèi)存指針、用于指向所述內(nèi)存資源首個可用存儲單元的活躍指針和記錄內(nèi)存資源使用次數(shù)的計數(shù)元素;
[0011]初始化所述新的內(nèi)存資源所包含的存儲單元的鄰接單元指針,使所述新的內(nèi)存資源的所包含的存儲單元通過鄰接單元指針相連;
[0012]將申請到的所述新的內(nèi)存資源添加到已經(jīng)存在的內(nèi)存資源鏈表中;
[0013]初始化所述新的內(nèi)存資源,將所述新的內(nèi)存資源所包含的存儲單元全部賦值為O ;
[0014]調(diào)用所述新的內(nèi)存資源進行存儲。
[0015]通過采用上述技術(shù)方案,當(dāng)發(fā)現(xiàn)系統(tǒng)內(nèi)存不足時,能夠自動為系統(tǒng)申請新的存儲單元,從而可以在大使用量的情況下達到靈活擴展內(nèi)存的目的,有效地處理大并發(fā)大流量等突發(fā)場景。
【附圖說明】
[0016]通過閱讀參照以下附圖所作的對非限制性實施例所作的詳細描述,本發(fā)明的其它特征、目的和優(yōu)點將會變得更明顯:
[0017]圖1為本發(fā)明實施例一提供的一種內(nèi)存管理方法的流程示意圖;
[0018]圖2為本發(fā)明實施例二提供的一種內(nèi)存管理方法的流程示意圖;
[0019]圖3為本發(fā)明實施例三提供的一種內(nèi)存管理方法的流程示意圖;
[0020]圖4為本發(fā)明實施例四提供的一種內(nèi)存管理方法的流程示意圖;
【具體實施方式】
[0021]下面結(jié)合附圖和實施例對本發(fā)明作進一步的詳細說明??梢岳斫獾氖?,此處所描述的具體實施例僅僅用于解釋本發(fā)明,而非對本發(fā)明的限定。另外還需要說明的是,為了便于描述,附圖中僅示出了與本發(fā)明相關(guān)的部分而非全部內(nèi)容。
[0022]在更加詳細地討論示例性實施例之前應(yīng)當(dāng)提到的是,一些示例性實施例被描述成作為流程圖描繪的處理或方法。雖然流程圖將各項操作(或步驟)描述成順序的處理,但是其中的許多操作可以被并行地、并發(fā)地或者同時實施。此外,各項操作的順序可以被重新安排。當(dāng)其操作完成時所述處理可以被終止,但是還可以具有未包括在附圖中的附加步驟。所述處理可以對應(yīng)于方法、函數(shù)、規(guī)程、子例程、子程序等等。
[0023]實施例一
[0024]圖1為本發(fā)明實施例一提供的一種內(nèi)存管理方法的流程示意圖。本實施例的方法具體用于數(shù)據(jù)存儲空間不足時需對存儲空間進行擴展的情況。該方法可以由系統(tǒng)來執(zhí)行,也可以由服務(wù)器來執(zhí)行。如圖1所示,該方法包括:
[0025]S110、申請獲得存儲單元。
[0026]S120、設(shè)定所述存儲單元的結(jié)構(gòu),使所述存儲單元包含用于指向下一個空閑的存儲單元的鄰接單元指針和用于指向下一個處于使用狀態(tài)的存儲單元下一跳指針;設(shè)定所述存儲單元所歸屬的內(nèi)存資源的結(jié)構(gòu),使所述內(nèi)存資源包含用于指向下一個內(nèi)存資源的鄰接內(nèi)存指針、用于指向所述內(nèi)存資源首個可用存儲單元的活躍指針和記錄內(nèi)存資源使用次數(shù)的計數(shù)元素。
[0027]所述存儲單元的結(jié)構(gòu)可以為buf {source,val,next_alive,prev,next},其中,source為內(nèi)存資源指針,指向當(dāng)前存儲單元所歸屬的內(nèi)存資源;val為真正存儲的對象;next_alive為鄰接單元指針,指向下一個空閑的存儲單元;prev為前一跳指針,指向前一個也在使用狀態(tài)的存儲單元;next為下一跳指針,指向后一個也在使用狀態(tài)的存儲單元。
[0028]所述內(nèi)存資源的結(jié)構(gòu)可以為source {buf,next,alive,use},其中,buf為存儲單元指針,指向該內(nèi)存資源所包含的存儲單元的開始地址;next為鄰接內(nèi)存指針,指向下一個內(nèi)存資源;alive為活躍指針,指向當(dāng)前內(nèi)存資源首個可用的存儲單元;USe為計數(shù)元素,記錄內(nèi)存資源的使用次數(shù),每使用一個內(nèi)存資源里面的存儲單元,計數(shù)元素use加I。
[0029]S130、初始化所述新的內(nèi)存資源所包含的存儲單元的鄰接單元指針,使所述新的內(nèi)存資源的所包含的存儲單元通過鄰接單元指針相連。
[0030]初始化所述新的內(nèi)存資源所包含的存儲單元的鄰接單元指針具體可以為:首先申請若干個存儲單元并讓內(nèi)存資源里的存儲單元指針指向存儲單元的開始地址,然后使用每個存儲單元里面的鄰接單元指針將所有申請的存儲單元前后連接起來。
[0031]S140、將申請到的所述新的內(nèi)存資源添加到已經(jīng)存在的內(nèi)存資源鏈表中。
[0032]將申請到的所述新的內(nèi)存資源添加到已經(jīng)存在的內(nèi)存資源鏈表中可以通過內(nèi)存資源的指針來實現(xiàn),即將使用中的已存在內(nèi)存資源的鄰接內(nèi)存指針指向該新的內(nèi)存資源。
[0033]可以把申請到的所述新的內(nèi)存資源添加到已經(jīng)存在的內(nèi)存資源鏈表的起始位置、結(jié)尾位置或是鏈表中間的任意位置。優(yōu)選的,可以把申請到的所述新的內(nèi)存資源添加到已經(jīng)存在的內(nèi)存資源鏈表的結(jié)尾位置,即讓已經(jīng)存在的內(nèi)存資源的鄰接內(nèi)存指針指向申請到的所述新的內(nèi)存資源。把新的內(nèi)存資源添加到已存在內(nèi)存資源鏈表的結(jié)尾處不會打亂已經(jīng)存在的內(nèi)存資源鏈表的存儲順序,添加比較方便快捷,可以減少添加時系統(tǒng)所需運行的步驟。
[0034]S150、初始化所述新的內(nèi)存資源,將所述新的內(nèi)存資源所包含的存儲單元全部賦值為O。
[0035]向系統(tǒng)申請新的內(nèi)存資源時,內(nèi)存資源里面的原始值有可能是比較雜亂的,所以需要初始化新申請的內(nèi)存資源,將新申請的內(nèi)存資源所包含的存儲單元全部賦值為0,以方便后續(xù)的調(diào)用和存儲。
[0036]S160、調(diào)用所述新的內(nèi)存資源進行存儲。
[0037]調(diào)用所述新的內(nèi)存資源進行存儲可以為:系統(tǒng)通過新的內(nèi)存資源的活躍指針調(diào)用該內(nèi)存系統(tǒng)