一種通過(guò)內(nèi)存塊實(shí)現(xiàn)內(nèi)存管理的方法及系統(tǒng)的制作方法
【專利摘要】本發(fā)明公開(kāi)了一種通過(guò)內(nèi)存塊實(shí)現(xiàn)內(nèi)存管理的方法及系統(tǒng),申請(qǐng)64KB大小的內(nèi)存塊,將此內(nèi)存塊分為內(nèi)存分配區(qū)和數(shù)據(jù)存放區(qū)兩個(gè)區(qū)域,將內(nèi)存分配區(qū)劃分為以鏈表形式連接的固定大小的子塊,將鏈表的頭指針和空閑子塊的數(shù)量寫(xiě)入數(shù)據(jù)存放區(qū),之后通過(guò)鏈表操作即可實(shí)現(xiàn)內(nèi)存的分配與回收。本發(fā)明通過(guò)申請(qǐng)64KB的內(nèi)存塊,以鏈表的形式進(jìn)行內(nèi)存單元的分配與回收,減少甚至消除了內(nèi)存分配時(shí)可能產(chǎn)生的碎片,鏈表方式,結(jié)構(gòu)比較簡(jiǎn)單,無(wú)論是分配還是回收內(nèi)存,省去了傳統(tǒng)方法中遍歷、查詢上的復(fù)雜操作,明顯提升了內(nèi)存的處理速度,有效提升了內(nèi)存管理的效率。
【專利說(shuō)明】一種通過(guò)內(nèi)存塊實(shí)現(xiàn)內(nèi)存管理的方法及系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及內(nèi)存信息技術(shù)管理領(lǐng)域,特別是一種通過(guò)內(nèi)存塊實(shí)現(xiàn)內(nèi)存管理的方法及系統(tǒng)。
【背景技術(shù)】
[0002]內(nèi)存管理在軟件開(kāi)發(fā)和應(yīng)用中占據(jù)十分重要的位置,對(duì)于軟件的性能有著十分重要的影響。由于操作系統(tǒng)要考慮到底層硬件管理、內(nèi)存有限、內(nèi)存碎片、多軟件同時(shí)運(yùn)行、多線程環(huán)境等情況,因此導(dǎo)致了內(nèi)存的分配和回收操作非常復(fù)雜,內(nèi)存操作所消耗的時(shí)間的限制成為軟件性能的瓶頸。對(duì)此一些傳統(tǒng)的方法是通過(guò)申請(qǐng)一塊大內(nèi)存,再劃分成各個(gè)子塊分配使用,但傳統(tǒng)方法忽略了子塊的組織結(jié)構(gòu),在分配和回收時(shí)都需要進(jìn)行大量的內(nèi)存塊結(jié)構(gòu)查詢,才能完成分配和回收操作,這就導(dǎo)致了內(nèi)存管理效率的低下。在多線程環(huán)境中這種影響尤其明顯,直接導(dǎo)致了應(yīng)用軟件的性能低下。在高性能軟件應(yīng)用領(lǐng)域,內(nèi)存管理是關(guān)鍵性的基礎(chǔ)功能,其性能直接影響了整個(gè)應(yīng)用軟件系統(tǒng)的運(yùn)行。
【發(fā)明內(nèi)容】
[0003]為解決上述問(wèn)題,本發(fā)明的目的在于提供一種通過(guò)內(nèi)存塊實(shí)現(xiàn)內(nèi)存管理的方法及系統(tǒng),簡(jiǎn)化內(nèi)存的分配與回收,減少內(nèi)存分配時(shí)碎片的產(chǎn)生,提高內(nèi)存管理效率,尤其是對(duì)于高性能軟件的應(yīng)用,提升整個(gè)軟件系統(tǒng)的運(yùn)行效率。
[0004]本發(fā)明解決其問(wèn)題所采用的技術(shù)方案是:
一種通過(guò)內(nèi)存塊實(shí)現(xiàn)內(nèi)存管理的方法,包括:
(1)以字節(jié)對(duì)齊方式申請(qǐng)64KB大小的內(nèi)存塊,
(2)將此內(nèi)存塊劃分為以鏈表形式連接的固定大小的子塊,同時(shí)劃分出一個(gè)單獨(dú)的數(shù)據(jù)存放區(qū),且數(shù)據(jù)存放區(qū)在內(nèi)存地的末端,將鏈表的頭指針和空間的子塊數(shù)量寫(xiě)入數(shù)據(jù)存放區(qū);
(3)通過(guò)鏈表操作對(duì)子塊空間進(jìn)行分配與回收:
分配時(shí),將鏈表頭指針指向的子塊分配出去,且空閑子塊數(shù)量減1,同時(shí)鏈表頭指針指向下一個(gè)空閑子塊,如果空閑子塊數(shù)量為零,則重新執(zhí)行步驟(I);
回收時(shí),將鏈表的頭指針存入要回收的子塊內(nèi),將此要回收的子塊的首地址作為鏈表的頭指針寫(xiě)入數(shù)據(jù)存放區(qū),并將空閑子塊數(shù)量加I。
[0005]一種通過(guò)內(nèi)存塊實(shí)現(xiàn)內(nèi)存管理的系統(tǒng),包括:
申請(qǐng)模塊,用于以對(duì)齊方式申請(qǐng)64KB大小的內(nèi)存塊;
拆分模塊,用于將此內(nèi)存塊劃分為內(nèi)存分配區(qū)和數(shù)據(jù)存放區(qū)兩個(gè)內(nèi)存區(qū)域,同時(shí)將內(nèi)存分配區(qū)劃分為鏈表形式連接的固定大小的子塊,并將空閑子塊的數(shù)量和鏈表頭指針寫(xiě)入數(shù)據(jù)存放區(qū);
操作模塊,用于通過(guò)鏈表操作對(duì)子塊空間進(jìn)行分配與回收。
[0006]所述操作模塊包括分配單元和回收單元,其中:分配單元用于通過(guò)鏈表操作對(duì)子塊空間進(jìn)行分配時(shí),將鏈表頭指針指向的子塊分配出去,且空閑子塊數(shù)量減1,同時(shí)鏈表頭指針指向下一個(gè)空閑子塊;
回收單元用于通過(guò)鏈表操作對(duì)子塊空間進(jìn)行回收時(shí),將要回收的子塊地址的低16位地址清零,得到該子塊在內(nèi)存塊中的首地址,將鏈表的頭指針存入要回收的子塊內(nèi),將此要回收的子塊的首地址作為鏈表的頭指針寫(xiě)入數(shù)據(jù)存放區(qū),并將空閑子塊數(shù)量加I。
[0007]本發(fā)明的有益效果是: 本發(fā)明采用一種通過(guò)內(nèi)存塊實(shí)現(xiàn)內(nèi)存管理的方法及系統(tǒng),申請(qǐng)64KB大小的內(nèi)存塊,將此內(nèi)存塊分為內(nèi)存分配區(qū)和數(shù)據(jù)存放區(qū)兩個(gè)區(qū)域,將內(nèi)存分配區(qū)劃分為以鏈表形式連接的固定大小的子塊,將鏈表的頭指針和空閑子塊的數(shù)量寫(xiě)入數(shù)據(jù)存放區(qū),之后通過(guò)鏈表操作即可實(shí)現(xiàn)內(nèi)存的分配與回收。本發(fā)明通過(guò)申請(qǐng)64KB的內(nèi)存塊,以鏈表的形式進(jìn)行內(nèi)存單元的分配與回收,減少甚至消除了內(nèi)存分配時(shí)可能產(chǎn)生的碎片,鏈表方式,結(jié)構(gòu)比較簡(jiǎn)單,無(wú)論是分配還是回收內(nèi)存,省去了傳統(tǒng)方法中遍歷、查詢上的復(fù)雜操作,明顯提升了內(nèi)存的處理速度,有效提升了內(nèi)存管理的效率。
【專利附圖】
【附圖說(shuō)明】
[0008]下面結(jié)合附圖和實(shí)例對(duì)本發(fā)明作進(jìn)一步說(shuō)明。
[0009]圖1是所述內(nèi)存塊劃分后的示意圖;
圖2是本發(fā)明所述方法流程圖;
圖3是本發(fā)明所述系統(tǒng)的結(jié)構(gòu)組成框圖;
圖4是分配子塊后的示意圖;
圖5是刪除子塊后的示意圖。
【具體實(shí)施方式】
[0010]實(shí)施例1:
本發(fā)明提供了一種通過(guò)內(nèi)存塊實(shí)現(xiàn)內(nèi)存管理的方法,每次以字節(jié)對(duì)齊的方式申請(qǐng)64KB大小的內(nèi)存塊,將此內(nèi)存塊劃分為兩個(gè)區(qū)域:內(nèi)存分配區(qū)和數(shù)據(jù)存放區(qū)。具體參照?qǐng)D1所示劃分后的示意圖,劃分后,內(nèi)存分配區(qū)與數(shù)據(jù)存放區(qū)的大小固定,之后,繼續(xù)對(duì)內(nèi)存分配區(qū)進(jìn)行劃分,將其劃分為以鏈表形式連接的具有固定大小的子塊,由于劃分時(shí),最后一個(gè)子塊的大小可能不足一個(gè)子塊的大小,將其歸為未使用區(qū)域,如圖中所示,每個(gè)子塊存放著下一個(gè)子塊的地址,形成一個(gè)鏈表。將鏈表的頭指針和鏈表中空閑子塊的數(shù)量寫(xiě)入數(shù)據(jù)存放區(qū)當(dāng)中,數(shù)據(jù)存放區(qū)所需要分配的空間比較小,只要滿足存放頭指針和空閑子塊的數(shù)量即可。
[0011]對(duì)內(nèi)存塊分配之后,便可通過(guò)鏈表操作實(shí)現(xiàn)子塊的分配與收回,具體方法參照?qǐng)D2所示的流程圖:
以字節(jié)對(duì)齊的方式申請(qǐng)64KB大小的內(nèi)存塊,由于是以字節(jié)對(duì)齊的方式申請(qǐng),因此內(nèi)存塊的首地址格式為:0x----0000,其中問(wèn)號(hào)表示十六進(jìn)制中的任意數(shù)字,即內(nèi)存塊的首地址低16位字節(jié)全為O ;
之后,對(duì)內(nèi)存塊進(jìn)行劃分和結(jié)構(gòu)組織操作,劃出一部分大小用于存儲(chǔ)內(nèi)存塊的數(shù)據(jù)信息,稱為塊數(shù)據(jù)存放區(qū),剩下部分被稱為內(nèi)存分配區(qū);數(shù)據(jù)存放區(qū)具備固定的大小,里面存放著第一個(gè)空閑子塊的地址(即鏈表頭指針),以及空閑子塊的數(shù)量以及其他數(shù)據(jù);為便于定位,數(shù)據(jù)存放區(qū)位于64KB內(nèi)存塊的末端,其位于內(nèi)存塊的地址可通過(guò)以下計(jì)算方法計(jì)算:64KB內(nèi)存塊的首地址加上64KB字節(jié)減去數(shù)據(jù)存放區(qū)大??;內(nèi)存分配區(qū)位于64KB內(nèi)存塊的起始地址,并按特定的大小平均劃分成多個(gè)子塊,而不足一個(gè)子塊大小的區(qū)域稱為未使用區(qū)域,各個(gè)子塊存放著下一個(gè)子塊的地址,形成一個(gè)鏈表;
當(dāng)需要使用子塊空間時(shí),如果數(shù)據(jù)存放區(qū)域記載的當(dāng)前空閑子塊的數(shù)量大于零,則將當(dāng)前鏈表頭指針指向的子塊分配出去,并將空閑子塊數(shù)量減1,鏈表頭指針指向下一個(gè)空閑子塊;否則,若空閑子塊數(shù)量為零,則重新向操作系統(tǒng)申請(qǐng)一塊64KB大小的內(nèi)存塊,進(jìn)行組織劃分和分配;
當(dāng)需要對(duì)子塊進(jìn)行回收時(shí),回收其在內(nèi)存塊中的內(nèi)存地址即可,將此需要回收的子塊的內(nèi)存地址的低16位清零,即得到其所在的64KB內(nèi)存塊的首地址,將當(dāng)前鏈表的頭指針存入要回收的子塊內(nèi),將此要回收的子塊的首地址作為鏈表的頭指針寫(xiě)入數(shù)據(jù)存放區(qū),并將空閑子塊數(shù)量加I。
[0012]本發(fā)明采用64KB固定大小的內(nèi)存塊申請(qǐng)策略,將子塊的鏈表組織及數(shù)據(jù)信息存放于此內(nèi)存塊中,使每一個(gè)內(nèi)存塊的首地址基于頁(yè)對(duì)齊,提聞了內(nèi)存申請(qǐng)的效率,并且所有操作都在一個(gè)64KB內(nèi)存塊中進(jìn)行,得以高效利用CPU緩存。在分配和回收過(guò)程中,通過(guò)訪問(wèn)和操作鏈表頭指針和空閑塊數(shù)量,即能完成分配和回收操作過(guò)程,省去了大量的內(nèi)存地址檢索和查詢,明顯的提高了內(nèi)存管理操作性能。
[0013]本發(fā)明提供了一種通過(guò)內(nèi)存塊實(shí)現(xiàn)內(nèi)存管理的系統(tǒng),參照?qǐng)D3所示,包括:
申請(qǐng)模塊,用于以對(duì)齊方式申請(qǐng)64KB大小的內(nèi)存塊;
拆分模塊,用于將此內(nèi)存塊劃分為內(nèi)存分配區(qū)和數(shù)據(jù)存放區(qū)兩個(gè)內(nèi)存區(qū)域,且數(shù)據(jù)存放區(qū)被劃分在內(nèi)存塊地址的末端,同時(shí)將內(nèi)存分配區(qū)劃分為鏈表形式連接的固定大小的子塊,并將空閑子塊的數(shù)量和鏈表頭指針寫(xiě)入數(shù)據(jù)存放區(qū);
操作模塊,用于通過(guò)鏈表操作對(duì)子塊空間進(jìn)行分配與回收。
[0014]其中,所述操作模塊包括分配單元和回收單元,且:
分配單元用于通過(guò)鏈表操作對(duì)子塊空間進(jìn)行分配時(shí),將鏈表頭指針指向的子塊分配出去,且空閑子塊數(shù)量減1,同時(shí)鏈表頭指針指向下一個(gè)空閑子塊;
回收單元用于通過(guò)鏈表操作對(duì)子塊空間進(jìn)行回收時(shí),將要回收的子塊地址的低16位地址清零,得到該子塊在內(nèi)存塊中的首地址,將鏈表的頭指針存入要回收的子塊內(nèi),將此要回收的子塊的首地址作為鏈表的頭指針寫(xiě)入數(shù)據(jù)存放區(qū),并將空閑子塊數(shù)量加I。
[0015]所述系統(tǒng)具體的實(shí)現(xiàn)方法與以上方法中所述相同,具體參考以上方法中所述內(nèi)容。
[0016]實(shí)施例2:
本實(shí)施例通過(guò)具有的實(shí)例對(duì)本發(fā)明進(jìn)行說(shuō)明。
[0017]參照?qǐng)D4所示,首先以字節(jié)對(duì)齊的方式向操作系統(tǒng)申請(qǐng)64KB (65536字節(jié))大小的內(nèi)存塊,內(nèi)存塊末端20個(gè)字節(jié)劃分為數(shù)據(jù)存放區(qū),其余的作為內(nèi)存分配區(qū),內(nèi)存分配區(qū)中每個(gè)子塊的大小設(shè)定為16字節(jié),則子塊的數(shù)量為(65536字節(jié)-數(shù)據(jù)存放區(qū)大小)/子塊大小,即:(65536字節(jié)-20字節(jié))/16字節(jié)=4094,則子塊數(shù)量為4094個(gè),剩余的12字節(jié)則不使用。
[0018]在確定了子塊數(shù)量之后,從第一個(gè)子塊開(kāi)始,將下一個(gè)子塊的內(nèi)存地址存放于其中,形成一個(gè)鏈表,再將鏈表的頭指針,即第一個(gè)子塊的地址存放于數(shù)據(jù)存放區(qū)中指定位置,并將子塊數(shù)量即4094存放于數(shù)據(jù)存放區(qū)中指定位置。至此,整個(gè)64KB內(nèi)存塊已經(jīng)劃分組織完成。
[0019]分配子塊時(shí),首先查詢數(shù)據(jù)存放區(qū)中的空閑子塊數(shù)量,如果等于0,則表示子塊已經(jīng)全部分配,需要重新再申請(qǐng)一個(gè)64KB內(nèi)存塊。如果子塊數(shù)量大于0,則此時(shí)頭指針指向的子塊就是要分配的子塊,稱為當(dāng)前分配塊,將頭指針指向當(dāng)前分配塊保存的子塊地址,即下一個(gè)子塊的地址,再將子塊數(shù)量減1,最后返回當(dāng)前分配塊,這樣就完成了整個(gè)分配過(guò)程。圖4中所分配的4個(gè)子塊即如此。
[0020]參照?qǐng)D4回收子塊I和4后的示意圖,回收子塊時(shí),此子塊稱為當(dāng)前回收塊,首先將當(dāng)前回收塊的內(nèi)存地址低16位清零,從而得到其在64KB內(nèi)存塊的首地址,由首地址得到末端數(shù)據(jù)存放區(qū)的計(jì)算公式為:首地址+65536字節(jié)-數(shù)據(jù)存放區(qū)大小。得到數(shù)據(jù)存放區(qū)之后,將頭指針指向的子塊地址存放于當(dāng)前回收塊中,再將當(dāng)前回收塊的首地址存放于頭指針,再將子塊數(shù)量加1,這樣就完成了整個(gè)回收過(guò)程。
[0021]以上實(shí)施例中本發(fā)明所述內(nèi)容,只是對(duì)本發(fā)明的一種客觀解釋,本發(fā)明不僅應(yīng)用于操作系統(tǒng)內(nèi)存的分配,對(duì)于其它移動(dòng)設(shè)備或具有大容量存儲(chǔ)單元的設(shè)備,本發(fā)明皆可實(shí)現(xiàn),本發(fā)明的內(nèi)容所要保護(hù)的不僅是本發(fā)明所述的【技術(shù)領(lǐng)域】,類似的可使用本發(fā)明實(shí)現(xiàn)其目的的其他領(lǐng)域或?qū)崿F(xiàn)方法,均在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種通過(guò)內(nèi)存塊實(shí)現(xiàn)內(nèi)存管理的方法,其特征在于,包括: (1)申請(qǐng)固定大小的內(nèi)存塊; (2)將此內(nèi)存塊劃分為以鏈表形式連接的固定大小的子塊; (3)通過(guò)鏈表操作對(duì)子塊空間進(jìn)行分配與回收。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟(2)中,所述內(nèi)存塊在被劃分時(shí),還被劃分出一個(gè)單獨(dú)的數(shù)據(jù)存放區(qū),用于存儲(chǔ)空閑子塊的數(shù)量和鏈表頭指針。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,步驟(3)中,通過(guò)鏈表操作對(duì)子塊空間進(jìn)行分配時(shí),將鏈表頭指針指向的子塊分配出去,且空閑子塊數(shù)量減1,同時(shí)鏈表頭指針指向下一個(gè)空閑子塊。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,當(dāng)空閑子塊數(shù)量為零時(shí),則重新執(zhí)行步驟(I)。
5.根據(jù)權(quán)利要求2所述的方法,其特征在于,步驟(3)中,通過(guò)鏈表操作對(duì)子塊空間進(jìn)行回收時(shí),將鏈表的頭指針存入要回收的子塊內(nèi),將此要回收的子塊的首地址作為鏈表的頭指針寫(xiě)入數(shù)據(jù)存放區(qū),并將空閑子塊數(shù)量加I。
6.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述數(shù)據(jù)存放區(qū)被劃分在內(nèi)存塊地址的末端。
7.根據(jù)權(quán)利要求1至6任一所述的方法,其特征在于,所述步驟(I)中,以字節(jié)對(duì)齊的方式申請(qǐng)64KB大小的內(nèi)存塊。
8.—種通過(guò)內(nèi)存塊實(shí)現(xiàn)內(nèi)存管理的系統(tǒng),其特征在于,包括: 申請(qǐng)模塊,用于以對(duì)齊方式申請(qǐng)64KB大小的內(nèi)存塊; 拆分模塊,用于將此內(nèi)存塊劃分為內(nèi)存分配區(qū)和數(shù)據(jù)存放區(qū)兩個(gè)內(nèi)存區(qū)域,同時(shí)將內(nèi)存分配區(qū)劃分為鏈表形式連接的固定大小的子塊,并將空閑子塊的數(shù)量和鏈表頭指針寫(xiě)入數(shù)據(jù)存放區(qū); 操作模塊,用于通過(guò)鏈表操作對(duì)子塊空間進(jìn)行分配與回收。
9.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于,所述操作模塊包括分配單元和回收單元,其中: 分配單元用于通過(guò)鏈表操作對(duì)子塊空間進(jìn)行分配時(shí),將鏈表頭指針指向的子塊分配出去,且空閑子塊數(shù)量減1,同時(shí)鏈表頭指針指向下一個(gè)空閑子塊; 回收單元用于通過(guò)鏈表操作對(duì)子塊空間進(jìn)行回收時(shí),將要回收的子塊地址的低16位地址清零,得到該子塊在內(nèi)存塊中的首地址,將鏈表的頭指針存入要回收的子塊內(nèi),將此要回收的子塊的首地址作為鏈表的頭指針寫(xiě)入數(shù)據(jù)存放區(qū),并將空閑子塊數(shù)量加I。
10.根據(jù)權(quán)利要求8或9所述的系統(tǒng),其特征在于,所述數(shù)據(jù)存放區(qū)被劃分在內(nèi)存塊地址的末端。
【文檔編號(hào)】G06F12/02GK103617123SQ201310590518
【公開(kāi)日】2014年3月5日 申請(qǐng)日期:2013年11月21日 優(yōu)先權(quán)日:2013年11月21日
【發(fā)明者】余欣 申請(qǐng)人:珠海金山網(wǎng)絡(luò)游戲科技有限公司, 成都西山居互動(dòng)娛樂(lè)科技有限公司