一種內(nèi)存塊合并方法與系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及Linux系統(tǒng)內(nèi)存管理領(lǐng)域,特別是涉及一種內(nèi)存塊合并方法與系統(tǒng)。
【背景技術(shù)】
[0002]現(xiàn)在服務(wù)器或PC機(jī)在運(yùn)行一段時(shí)間后,都會變得運(yùn)行緩慢,卡頓現(xiàn)象時(shí)常出現(xiàn)。這是由于系統(tǒng)給進(jìn)程分配運(yùn)行內(nèi)存的時(shí)候效率降低所致。而導(dǎo)致內(nèi)存分配效率降低的原因則是因?yàn)殚L時(shí)間的運(yùn)行后,系統(tǒng)內(nèi)的可用連續(xù)大內(nèi)存已經(jīng)變得極少了,基本上都是被分隔開的小內(nèi)存塊,當(dāng)進(jìn)程申請內(nèi)存的時(shí)候,系統(tǒng)不得不到處拼湊這些小內(nèi)存塊以滿足進(jìn)程的正常運(yùn)行。
[0003]原有的內(nèi)存塊合并方法為伙伴算法,兼?zhèn)湟韵聴l件的內(nèi)存塊才能相合并:(1)兩個(gè)內(nèi)存塊連續(xù);(2)兩個(gè)內(nèi)存塊大小相等;合并后再繼續(xù)迭代以上條件,直到?jīng)]有符合要求的為至。這樣的合并方法,如果出現(xiàn)lk 2k lk 4k的情況,伙伴算法將無法合并此內(nèi)存塊,合并效率較低。
【發(fā)明內(nèi)容】
[0004]有鑒于此,本發(fā)明的主要目的在于提供一種內(nèi)存合并方法與系統(tǒng),可以高效地合并內(nèi)存碎片。
[0005]為實(shí)現(xiàn)上述目的,本發(fā)明提供了一種內(nèi)存塊合并方法,包括:
[0006]步驟A:掃描內(nèi)存大小小于預(yù)設(shè)內(nèi)存閾值的內(nèi)存塊,將內(nèi)存小于或等于預(yù)設(shè)碎片內(nèi)存閾值的內(nèi)存塊確定為內(nèi)存碎片;
[0007]步驟B:獲取所述內(nèi)存碎片的地址;
[0008]步驟C:以所述內(nèi)存碎片的地址為起點(diǎn),判斷連續(xù)地址上的空閑塊的內(nèi)存之和是否可達(dá)到預(yù)設(shè)的合并內(nèi)存閾值,如果是,則將內(nèi)存之和達(dá)到預(yù)設(shè)的合并內(nèi)存閾值的空閑塊合并,得到大內(nèi)存塊,進(jìn)入步驟E,否則進(jìn)入步驟D ;
[0009]步驟D:將當(dāng)前合并內(nèi)存閾值一半的內(nèi)存值,視為新的合并內(nèi)存閾值,判斷當(dāng)前合并內(nèi)存閾值是否大于所述內(nèi)存碎片的內(nèi)存值,如果否,則進(jìn)入步驟E,如果是,則判斷連續(xù)地址上的空閑塊的內(nèi)存之和是否可達(dá)到當(dāng)前合并內(nèi)存閾值,如果是,則將內(nèi)存之和達(dá)到當(dāng)前合并內(nèi)存閾值的空閑塊合并,得到大內(nèi)存塊,進(jìn)入步驟E,否則返回步驟D;
[0010]步驟E:將全局中內(nèi)存大小且相鄰的內(nèi)存塊進(jìn)行合并。
[0011]優(yōu)選地,所述預(yù)設(shè)碎片內(nèi)存閾值為128k?256k。
[0012]優(yōu)選地,所述預(yù)設(shè)的合并內(nèi)存閾值為1024k。
[0013]優(yōu)選地,判斷連續(xù)地址上的空閑塊的內(nèi)存之和是否可達(dá)到預(yù)設(shè)的合并內(nèi)存閾值之前還包括:
[0014]確定以所述內(nèi)存碎片的地址為起點(diǎn)的連續(xù)地址上預(yù)設(shè)數(shù)量的空閑塊的內(nèi)存大小。
[0015]本發(fā)明還提供了一種內(nèi)存塊合并系統(tǒng),包括:內(nèi)存碎片確定模塊,碎片地址獲取模塊,第一合并模塊,第二合并模塊和伙伴合并模塊;
[0016]所述內(nèi)存碎片確定模塊用于掃描內(nèi)存大小小于預(yù)設(shè)內(nèi)存閾值的內(nèi)存塊,將內(nèi)存小于或等于預(yù)設(shè)碎片內(nèi)存閾值的內(nèi)存塊確定為內(nèi)存碎片;
[0017]所述碎片地址獲取模塊用于獲取所述內(nèi)存碎片的地址;
[0018]所述第一合并模塊用于以所述內(nèi)存碎片的地址為起點(diǎn),判斷連續(xù)地址上的空閑塊的內(nèi)存之和是否可達(dá)到預(yù)設(shè)的合并內(nèi)存閾值,如果是,則將內(nèi)存之和達(dá)到預(yù)設(shè)的合并內(nèi)存閾值的空閑塊合并,得到大內(nèi)存塊,所述伙伴合并模塊執(zhí)行操作,否則所述第二合并模塊執(zhí)行操作;
[0019]所述第二合并模塊用于將當(dāng)前合并內(nèi)存閾值一半的內(nèi)存值,視為新的合并內(nèi)存閾值,判斷當(dāng)前合并內(nèi)存閾值是否大于所述內(nèi)存碎片的內(nèi)存值,如果否,則所述伙伴合并模塊執(zhí)行操作,如果是,則判斷連續(xù)地址上的空閑塊的內(nèi)存之和是否可達(dá)到當(dāng)前合并內(nèi)存閾值,如果是,則將內(nèi)存之和達(dá)到當(dāng)前合并內(nèi)存閾值的空閑塊合并,得到大內(nèi)存塊,所述伙伴合并模塊執(zhí)行操作,否則所述第二合并模塊執(zhí)行操作;
[0020]所述伙伴合并模塊用于將全局中內(nèi)存大小且相鄰的內(nèi)存塊進(jìn)行合并。
[0021]優(yōu)選地,所述預(yù)設(shè)碎片內(nèi)存閾值為128k?256k。
[0022]優(yōu)選地,所述預(yù)設(shè)的合并內(nèi)存閾值為1024k。
[0023]優(yōu)選地,所述內(nèi)存塊合并系統(tǒng)還包括:
[0024]連續(xù)碎片大小確定模塊,用于確定以所述內(nèi)存碎片的地址為起點(diǎn)的連續(xù)地址上預(yù)設(shè)數(shù)量的空閑塊的內(nèi)存大小。
[0025]應(yīng)用本發(fā)明提供的一種內(nèi)存塊合并方法與系統(tǒng),掃描所有小于一定大小的內(nèi)存塊,并視為內(nèi)存碎片,從首地址開始,找到一個(gè)內(nèi)存碎片后就返回其地址。將返回的內(nèi)存碎片地址作為起點(diǎn),向后查看預(yù)設(shè)數(shù)量個(gè)塊是否都是空閑塊,如果是則合并為一塊,如果不是,則查找預(yù)設(shè)數(shù)量一半的塊是否都是空閑塊,如果是,則合并。以此類推,保證得到盡可能大的內(nèi)存塊以減小內(nèi)存碎片的數(shù)量,最后全局并合并相鄰且大小相同的內(nèi)存塊,可以盡可能地合并內(nèi)存碎片,得到盡可能大的可用空閑塊,提高了碎片合并效率。
【附圖說明】
[0026]為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
[0027]圖1為本發(fā)明一種內(nèi)存塊合并方法實(shí)施例的原理示意圖;
[0028]圖2為本發(fā)明一種內(nèi)存塊合并系統(tǒng)實(shí)施例的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0029]下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0030]實(shí)施例一:
[0031]本發(fā)明實(shí)施例提供了一種內(nèi)存塊合并方法,包括:
[0032]步驟A:掃描內(nèi)存大小小于預(yù)設(shè)內(nèi)存閾值的內(nèi)存塊,將內(nèi)存小于或等于預(yù)設(shè)碎片內(nèi)存閾值的內(nèi)存塊確定為內(nèi)存碎片;
[0033]如設(shè)定預(yù)設(shè)碎片閾值為1024k,小于1024k且為2的η次方值的內(nèi)存塊視為內(nèi)存碎片。
[0034]步驟Β:獲取所述內(nèi)存碎片的地址;
[0035]從首地址開始,找到一個(gè)內(nèi)存碎片后就返回其地址。
[0036]步驟C:以所述內(nèi)存碎片的地址為起點(diǎn),判斷連續(xù)地址上的空閑塊的內(nèi)存之和是否可達(dá)到預(yù)設(shè)的合并內(nèi)存閾值,如果是,則將內(nèi)存之和達(dá)到預(yù)設(shè)的合并內(nèi)存閾值的空閑塊合并,得到大內(nèi)存塊,進(jìn)入步驟Ε,否則進(jìn)入步驟D ;
[0037]步驟D:將當(dāng)前合并內(nèi)存閾值一半的內(nèi)存值,視為新的合并內(nèi)存閾值,判斷當(dāng)前合并內(nèi)存閾值是否大于所述內(nèi)存碎片的內(nèi)存值,如果否,則進(jìn)入步驟Ε,如果是,則判斷連續(xù)地址上的空閑塊的內(nèi)存之和是否可達(dá)到當(dāng)前合并內(nèi)存閾值,如果是,則將內(nèi)存之和達(dá)到當(dāng)前合并內(nèi)存閾值的空閑塊合并,得到大內(nèi)存塊,進(jìn)入步驟Ε,否則返回步驟D;
[0038]如圖1所示,每行的4Μ的數(shù)據(jù)塊為正在使用的內(nèi)存塊,其他為已經(jīng)釋放且可用的空閑塊。第一個(gè)內(nèi)存塊碎片的大小為128k,確定以所述內(nèi)存碎片的地址為起點(diǎn)的連續(xù)地址上預(yù)設(shè)數(shù)量的空閑塊的內(nèi)存大小,然后檢測其連續(xù)地址上的內(nèi)存碎片大小之和是否達(dá)到合并內(nèi)存閾值,如1024k,如圖1中第二行所示,將128k、256k、256k和128k合并為一個(gè)1024k的大內(nèi)存塊;如果這里沒有1024k,則檢測是否能達(dá)到1024k的一半,即512k,如果是,則將內(nèi)存之和達(dá)到預(yù)設(shè)的合并內(nèi)存閾值的空閑塊合并,得到大內(nèi)存塊,否則進(jìn)入步驟E,并以此迭代下去直到大小和第一個(gè)內(nèi)存碎片大小相同為至。
[0039]步驟E:將全局中內(nèi)存大小且相鄰的內(nèi)存塊進(jìn)行合并。
[0040]成功合并成大內(nèi)存塊后,再全局檢測相鄰內(nèi)存塊間是