內(nèi)存池管理方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機應(yīng)用領(lǐng)域,尤其是一種內(nèi)存池管理方法。
【背景技術(shù)】
[0002]現(xiàn)今的操作系統(tǒng)中,對內(nèi)存的使用已經(jīng)成為是程序員最棘手的問題,對內(nèi)存的釋放與申請內(nèi)存長度不同等不當(dāng)使用往往會造成程序崩潰、內(nèi)存越界,也可能會出現(xiàn)由于內(nèi)存越界導(dǎo)致的數(shù)據(jù)不正確等各種詭異問題。各種語言的自動內(nèi)存回收等機制也被不斷開發(fā)出來。即便是能能正確的申請和釋放內(nèi)存,當(dāng)頻繁進行申請和釋放也可能會造成以下兩個問題。一是對效率的影響,申請和釋放內(nèi)存在操作系統(tǒng)能夠內(nèi)部需要做很多處理,效率往往不高。二是由于系統(tǒng)內(nèi)存分配機制問題造成,當(dāng)用戶請求一個內(nèi)存單元小于一個頁時,系統(tǒng)會在內(nèi)存頁上分配內(nèi)存,但當(dāng)另一個內(nèi)存請求大于上個頁的剩余空間時,系統(tǒng)會在新的頁上分配所請求的內(nèi)存空間,此時第一個頁的剩余空間就會形成碎片,形成大量內(nèi)存碎片后會導(dǎo)致系統(tǒng)運行效率下降,甚至導(dǎo)致程序不能運行。用于頻繁接收請求并發(fā)送處理結(jié)果的網(wǎng)絡(luò)服務(wù)器更容易出現(xiàn)問題,系統(tǒng)會很快的耗盡內(nèi)存使系統(tǒng)運行效率逐漸降低,最后不能處理請求。
[0003]頻繁申請和釋放內(nèi)存單元會對降低效率,增加CPU開銷,可以使用事先分配足夠多內(nèi)存單元方式降低申請和釋放的開銷,但事先分配內(nèi)存單元的缺點是我們并不確定我們將要使用的內(nèi)存單元大小,如果頻繁需求的內(nèi)存大小遠遠小于事先分配的內(nèi)存單元,則會造成內(nèi)存單元的巨大浪費,同時如果事先分配太多內(nèi)存到內(nèi)存池,當(dāng)用戶沒有頻繁的內(nèi)存請求時會造成系統(tǒng)和應(yīng)用程序也不能使用此部分內(nèi)存,同樣造成內(nèi)存的浪費。并且,在實際開發(fā)中經(jīng)常會出現(xiàn)的內(nèi)存重復(fù)釋放,內(nèi)存越界,內(nèi)存越界的問題,從而導(dǎo)致服務(wù)器不穩(wěn)定,崩潰,定位困難。
【發(fā)明內(nèi)容】
[0004]本發(fā)明的目的在于提供一種內(nèi)存池管理方法,以提高內(nèi)存的分配性能并同時判斷內(nèi)存的合法性。
[0005]為了達到上述目的,本發(fā)明提供了一種內(nèi)存池管理方法,包括:將內(nèi)存池劃分為多個大小不同的次級內(nèi)存池,各個次級內(nèi)存池按照不同的對齊長度對應(yīng)不同的內(nèi)存鏈表;
[0006]根據(jù)需要的內(nèi)存空間的大小選擇次級內(nèi)存池,按照與所選擇的次級內(nèi)存池對應(yīng)的對齊長度分配內(nèi)存;
[0007]在分配的內(nèi)存空間前加一頭結(jié)構(gòu),所述頭結(jié)構(gòu)用于記錄所述分配的內(nèi)存空間的大小以及使用狀態(tài)。
[0008]優(yōu)選的,在上述的內(nèi)存池管理方法中,將所述內(nèi)存池劃分為三個大小不同的次級內(nèi)存池,分別為:第一次級內(nèi)存池、第二次級內(nèi)存池和第三次級內(nèi)存池,所述第一次級內(nèi)存池的空間小于所述第二次級內(nèi)存池,所述第二次級內(nèi)存池小于所述第三次級內(nèi)存池。
[0009]優(yōu)選的,在上述的內(nèi)存池管理方法中,當(dāng)需要的內(nèi)存空間小于等于第一閾值時,選擇所述第一次級內(nèi)存池;當(dāng)需要的內(nèi)存空間大于所述第一閾值且小于等于第二閾值時,選擇所述第二次級內(nèi)存池;當(dāng)需要的內(nèi)存空間大于所述第二閾值時,選擇所述第三次級內(nèi)存池。
[0010]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述第一次級內(nèi)存池的對齊長度為16字節(jié)的自然數(shù)倍數(shù)。
[0011]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述第一次級內(nèi)存池的對齊長度為16字節(jié)。
[0012]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述第二次級內(nèi)存池的對齊長度為128字節(jié)的自然數(shù)倍數(shù)。
[0013]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述第二次級內(nèi)存池的對齊長度為128字
-K-
T O
[0014]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述頭結(jié)構(gòu)包括第一頭結(jié)構(gòu)和第二頭結(jié)構(gòu),所述第一頭結(jié)構(gòu)用于記錄所述分配的內(nèi)存空間的大小,所述第二頭結(jié)構(gòu)用于記錄所述分配的內(nèi)存空間的使用狀態(tài)。
[0015]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述第一頭結(jié)構(gòu)分配有4個字節(jié)。
[0016]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述第二頭結(jié)構(gòu)分配有I個字節(jié),當(dāng)所述分配的內(nèi)存空間在使用中時,所述第二頭結(jié)構(gòu)中的值設(shè)置為I;當(dāng)所述分配的內(nèi)存空間被釋放后,所述第二頭結(jié)構(gòu)中的值設(shè)置為O。
[0017]在本發(fā)明提供的內(nèi)存池管理方法中,將內(nèi)存池劃分為多個大小不同的次級內(nèi)存池,各個次級內(nèi)存池按照不同的對齊長度對應(yīng)不同的內(nèi)存鏈表。每個鏈表都是獨立線程安全的,同步顆粒更小,相應(yīng)減少了同步,提高了分配性能。根據(jù)需要的內(nèi)存空間的大小選擇次級內(nèi)存池,按照與所選擇的次級內(nèi)存池對應(yīng)的對齊長度分配內(nèi)存,并在分配的內(nèi)存空間前加一用于記錄所述分配的內(nèi)存空間的大小以及使用狀態(tài)的頭結(jié)構(gòu),并通過所述頭結(jié)構(gòu)中的值來判斷內(nèi)存使用的合法性,生成調(diào)用堆棧,并記錄日志,便于分析和定位問題代碼。
【附圖說明】
[0018]圖1為本發(fā)明實施例中內(nèi)存池管理方法的流程圖。
【具體實施方式】
[0019]下面將結(jié)合示意圖對本發(fā)明的【具體實施方式】進行更詳細的描述。根據(jù)下列描述和權(quán)利要求書,本發(fā)明的優(yōu)點和特征將更清楚。需說明的是,附圖均采用非常簡化的形式且均使用非精準(zhǔn)的比例,僅用以方便、明晰地輔助說明本發(fā)明實施例的目的。
[0020]本發(fā)明實施例提供了一種內(nèi)存池管理方法,具體的,如圖1所示,包括以下步驟:
[0021]S1:將內(nèi)存池劃分為多個大小不同的次級內(nèi)存池,各個次級內(nèi)存池按照不同的對齊長度對應(yīng)不同的內(nèi)存鏈表。
[0022]在本實施例中,將所述內(nèi)存池劃分為三個大小不同的次級內(nèi)存池,分別為:第一次級內(nèi)存池、第二次級內(nèi)存池和第三次級內(nèi)存池,所述第一次級內(nèi)存池的空間小于所述第二次級內(nèi)存池,所述第二次級內(nèi)存池小于所述第三次級內(nèi)存池。
[0023]所述第一次級內(nèi)存池的對齊長度為16字節(jié)的自然數(shù)倍數(shù)。較優(yōu)的,所述第一次級內(nèi)存池的對齊長度為16字節(jié)。當(dāng)然在本本發(fā)明的其他實施例中,所述第一次級內(nèi)存池的對齊長度還可以是32字節(jié)、48字節(jié)或者64字節(jié),但是考慮到在實際應(yīng)用過程中,對齊長度過長會造成資源浪費,因此在本實施例中所述第一次級內(nèi)存池的對齊長度選擇16字節(jié)。
[0024]所述第二次級內(nèi)存池的對齊長度為128字節(jié)的自然數(shù)倍數(shù)。較優(yōu)的,所述第二次級內(nèi)存池的對齊長度為128字節(jié)。在本發(fā)明的其他實施例中,所述第二次級內(nèi)存池的對齊長度還可以設(shè)置為其他長度,但是避免資源浪費,在本實施例中所述第二次級內(nèi)存池的對齊長度選擇128字節(jié)。
[0025]所述第三次級內(nèi)存池不設(shè)置對齊長度,也就是說,在所述第三次級內(nèi)存池中按照實際需要分配內(nèi)存。
[0026]S2:根據(jù)需要的內(nèi)存空間的大小選擇次級內(nèi)存池,按照與所選擇的次級內(nèi)存池對應(yīng)的對齊長度分配內(nèi)存。
[0027]具體的,當(dāng)需要的內(nèi)存空間小于等于第一閾值時,選擇所述第一次級內(nèi)存池;當(dāng)需要的內(nèi)存空間大于所述第一閾值且小于等于第二閾值時,選擇所述第二次級內(nèi)存池;當(dāng)需要的內(nèi)存空間大于所述第二閾值時,選擇所述第三次級內(nèi)存池。
[0028]在本實施例中,所述第一閾值為20KB,當(dāng)所需要的內(nèi)存空間小于等于20KB時,將按照所述第一次級內(nèi)存池的對齊長度16字節(jié)來分配內(nèi)存。所述對齊長度是指在分配內(nèi)存時每次分配的最小長度。例如,當(dāng)需要的內(nèi)存空間為12字節(jié)時,為其分配16字節(jié)的空間。當(dāng)需要的內(nèi)存空間為16字節(jié)時,為其分配的空間也是16字節(jié)。當(dāng)需要的內(nèi)存空間為29字節(jié)時,則為其分配2個16字節(jié)長度的空間,即32字節(jié)的空間。
[0029]所述第二閾值為1MB。當(dāng)所需要的內(nèi)存空間大于20KB時且小于等于IM