一種內(nèi)存分配管理方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計(jì)算機(jī)內(nèi)存管理技術(shù)領(lǐng)域,特別是涉及一種內(nèi)存分配管理方法及系 統(tǒng)。
【背景技術(shù)】
[0002] 眾所周知,在應(yīng)用程序的運(yùn)行過(guò)程中,通常需要在其需要內(nèi)存的時(shí)候?yàn)槠浞峙鋬?nèi) 存,具體地,內(nèi)存分配是指在程序執(zhí)行的過(guò)程中分配或者回收存儲(chǔ)空間的分配內(nèi)存的方法。 常見(jiàn)的內(nèi)存分配方法有靜態(tài)內(nèi)存分配和動(dòng)態(tài)內(nèi)存分配兩種。所謂動(dòng)態(tài)內(nèi)存分配(Dynamic Memory Allocation)就是指在程序執(zhí)行的過(guò)程中動(dòng)態(tài)地分配或者回收存儲(chǔ)空間的分配內(nèi) 存的方法。動(dòng)態(tài)內(nèi)存分配不像數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲(chǔ)空間,而是 由系統(tǒng)根據(jù)程序的需要即時(shí)分配,且分配的大小就是程序要求的大小。
[0003] 然而,在實(shí)際應(yīng)用中,對(duì)于上述兩種內(nèi)存分配方式,當(dāng)內(nèi)存分配管理系統(tǒng)在應(yīng)用程 序運(yùn)行過(guò)程中要頻繁的申請(qǐng)和釋放內(nèi)存,現(xiàn)有技術(shù)通過(guò)系統(tǒng)調(diào)用來(lái)分配和釋放內(nèi)存的方式 容易出現(xiàn)內(nèi)存碎片,進(jìn)而導(dǎo)致內(nèi)存利用率低,如果長(zhǎng)期運(yùn)行會(huì)導(dǎo)致系統(tǒng)不穩(wěn)定,并且運(yùn)行時(shí) 間越長(zhǎng),系統(tǒng)越容易出現(xiàn)問(wèn)題,甚至?xí)絹?lái)越慢。
【發(fā)明內(nèi)容】
[0004] 有鑒于此,本發(fā)明提供了一種內(nèi)存分配管理方法及系統(tǒng),以合理管理內(nèi)存分配過(guò) 程中產(chǎn)生的內(nèi)存碎片,進(jìn)而提高內(nèi)存利用率。
[0005] 為解決上述技術(shù)問(wèn)題,本發(fā)明提供一種內(nèi)存分配管理方法,包括:
[0006] 接收來(lái)自應(yīng)用程序的攜帶所需內(nèi)存大小的內(nèi)存分配請(qǐng)求;
[0007] 在針對(duì)所述應(yīng)用程序的內(nèi)存塊鏈表集中,查找節(jié)點(diǎn)內(nèi)存大小與所述所需內(nèi)存大小 相適應(yīng)的內(nèi)存塊鏈表;
[0008] 其中,與所述所需內(nèi)存大小相適應(yīng)的節(jié)點(diǎn)內(nèi)存大小大于所述所需內(nèi)存大小且與所 述所需內(nèi)存大小差值最??;所述內(nèi)存塊鏈表集包括至少一個(gè)內(nèi)存塊鏈表,所述內(nèi)存塊鏈表 包括至少一個(gè)內(nèi)存塊節(jié)點(diǎn)且所述至少一個(gè)內(nèi)存塊節(jié)點(diǎn)中各內(nèi)存塊節(jié)點(diǎn)的節(jié)點(diǎn)內(nèi)存大小相 等;
[0009] 在查找到的內(nèi)存塊鏈表中,當(dāng)其節(jié)點(diǎn)內(nèi)存相較所需內(nèi)存的剩余內(nèi)存的大小不低于 預(yù)設(shè)節(jié)點(diǎn)內(nèi)存下限值時(shí),將其中一內(nèi)存塊節(jié)點(diǎn)的內(nèi)存中與所述所需內(nèi)存大小相等的內(nèi)存分 配給所述應(yīng)用程序,并將所述剩余內(nèi)存歸入目的內(nèi)存塊鏈表;
[0010] 其中,所述目的內(nèi)存塊鏈表的節(jié)點(diǎn)內(nèi)存大小與所述剩余內(nèi)存的大小相等。
[0011] 上述方法中,優(yōu)選的,在所述將其中一內(nèi)存塊節(jié)點(diǎn)的內(nèi)存中與所述所需內(nèi)存大小 相等的內(nèi)存分配給所述應(yīng)用程序,并將所述剩余內(nèi)存歸入目的內(nèi)存塊鏈表之后,還包括:
[0012] 當(dāng)檢測(cè)到所述應(yīng)用程序的釋放內(nèi)存時(shí),將所述釋放內(nèi)存歸入節(jié)點(diǎn)內(nèi)存大小與其相 等的內(nèi)存塊鏈表。
[0013] 上述方法中,優(yōu)選的,在所述查找節(jié)點(diǎn)內(nèi)存大小與所述所需內(nèi)存大小相適應(yīng)的內(nèi) 存塊鏈表之后,還包括:
[0014] 在所述查找到的內(nèi)存塊鏈表中,當(dāng)其節(jié)點(diǎn)內(nèi)存相較所述所需內(nèi)存的剩余內(nèi)存的大 小低于所述節(jié)點(diǎn)內(nèi)存下限值時(shí),將其中一內(nèi)存塊節(jié)點(diǎn)的內(nèi)存都分配給所述應(yīng)用程序。
[0015] 上述方法中,優(yōu)選的,所述內(nèi)存塊鏈表中各內(nèi)存塊節(jié)點(diǎn)按其內(nèi)存地址線性排序,且 各所述內(nèi)存塊節(jié)點(diǎn)之間的內(nèi)存地址離散;
[0016] 在將所述剩余內(nèi)存歸入所述目的內(nèi)存塊鏈表之后,當(dāng)所述剩余內(nèi)存的內(nèi)存地址與 所述目的內(nèi)存塊鏈表中某個(gè)內(nèi)存塊節(jié)點(diǎn)的內(nèi)存地址連續(xù)時(shí),還包括:
[0017] 合并所述剩余內(nèi)存和與其內(nèi)存地址連續(xù)的內(nèi)存塊節(jié)點(diǎn);
[0018] 將合并得到的內(nèi)存塊節(jié)點(diǎn)歸入節(jié)點(diǎn)內(nèi)存大小與之內(nèi)存大小相等的內(nèi)存塊鏈表。
[0019] 上述方法中,優(yōu)選的,所述查找節(jié)點(diǎn)內(nèi)存大小與所述所需內(nèi)存大小相適應(yīng)的內(nèi)存 塊鏈表,包括:
[0020] 在表頭鏈表中,查找所述節(jié)點(diǎn)內(nèi)存大小與所述所需內(nèi)存大小相適應(yīng)的內(nèi)存塊鏈表 標(biāo)識(shí);其中,所述表頭鏈表包括所述內(nèi)存塊鏈表標(biāo)識(shí)和與所述內(nèi)存塊鏈表標(biāo)識(shí)相對(duì)應(yīng)的內(nèi) 存塊鏈表的節(jié)點(diǎn)內(nèi)存大??;
[0021 ] 將查找到的內(nèi)存塊鏈表標(biāo)識(shí),確定所述節(jié)點(diǎn)內(nèi)存大小與所述所需內(nèi)存大小相適應(yīng) 的內(nèi)存塊鏈表。
[0022] 本發(fā)明還提供了一種內(nèi)存分配管理系統(tǒng),包括:
[0023] 接收單元,用于接收來(lái)自應(yīng)用程序的攜帶所需內(nèi)存大小的內(nèi)存分配請(qǐng)求;
[0024] 查找單元,用于在針對(duì)所述應(yīng)用程序的內(nèi)存塊鏈表集中,查找節(jié)點(diǎn)內(nèi)存大小與所 述所需內(nèi)存大小相適應(yīng)的內(nèi)存塊鏈表;
[0025] 其中,與所述所需內(nèi)存大小相適應(yīng)的節(jié)點(diǎn)內(nèi)存大小大于所述所需內(nèi)存大小且與所 述所需內(nèi)存大小差值最??;所述內(nèi)存塊鏈表集包括至少一個(gè)內(nèi)存塊鏈表,所述內(nèi)存塊鏈表 包括至少一個(gè)內(nèi)存塊節(jié)點(diǎn)且所述至少一個(gè)內(nèi)存塊節(jié)點(diǎn)中各內(nèi)存塊節(jié)點(diǎn)的節(jié)點(diǎn)內(nèi)存大小相 等;
[0026] 分配單元,用于在查找到的內(nèi)存塊鏈表中,當(dāng)其節(jié)點(diǎn)內(nèi)存相較所需內(nèi)存的剩余內(nèi) 存的大小不低于預(yù)設(shè)節(jié)點(diǎn)內(nèi)存下限值時(shí),將其中一內(nèi)存塊節(jié)點(diǎn)的內(nèi)存中與所述所需內(nèi)存大 小相等的內(nèi)存分配給所述應(yīng)用程序,并將所述剩余內(nèi)存歸入目的內(nèi)存塊鏈表;
[0027] 其中,所述目的內(nèi)存塊鏈表的節(jié)點(diǎn)內(nèi)存大小與所述剩余內(nèi)存的大小相等。
[0028] 上述系統(tǒng)中,優(yōu)選的,還包括:
[0029] 歸入單元,用于在所述將其中一內(nèi)存塊節(jié)點(diǎn)的內(nèi)存中與所述所需內(nèi)存大小相等的 內(nèi)存分配給所述應(yīng)用程序,并將所述剩余內(nèi)存歸入目的內(nèi)存塊鏈表之后,當(dāng)檢測(cè)到所述應(yīng) 用程序的釋放內(nèi)存時(shí),將所述釋放內(nèi)存歸入節(jié)點(diǎn)內(nèi)存大小與其相等的內(nèi)存塊鏈表。
[0030] 上述系統(tǒng)中,優(yōu)選的,所述分配單元還用于:
[0031] 在所述查找節(jié)點(diǎn)內(nèi)存大小與所述所需內(nèi)存大小相適應(yīng)的內(nèi)存塊鏈表之后,在所述 查找到的內(nèi)存塊鏈表中,當(dāng)其節(jié)點(diǎn)內(nèi)存相較所述所需內(nèi)存的剩余內(nèi)存的大小低于所述節(jié)點(diǎn) 內(nèi)存下限值時(shí),將其中一內(nèi)存塊節(jié)點(diǎn)的內(nèi)存都分配給所述應(yīng)用程序。
[0032] 上述系統(tǒng)中,優(yōu)選的,所述內(nèi)存塊鏈表中各內(nèi)存塊節(jié)點(diǎn)按其內(nèi)存地址線性排序,且 各所述內(nèi)存塊節(jié)點(diǎn)之間的內(nèi)存地址離散;
[0033] 該系統(tǒng)還包括:
[0034] 合并單元,用于在將所述剩余內(nèi)存歸入所述目的內(nèi)存塊鏈表之后,當(dāng)所述剩余內(nèi) 存的內(nèi)存地址與所述目的內(nèi)存塊鏈表中某個(gè)內(nèi)存塊節(jié)點(diǎn)的內(nèi)存地址連續(xù)時(shí),合并所述剩余 內(nèi)存和與其內(nèi)存地址連續(xù)的內(nèi)存塊節(jié)點(diǎn);
[0035] 以及所述歸入單元還用于將合并得到的內(nèi)存塊節(jié)點(diǎn)歸入節(jié)點(diǎn)內(nèi)存大小與之內(nèi)存 大小相等的內(nèi)存塊鏈表。
[0036] 上述系統(tǒng)中,優(yōu)選的,所述查找單元包括:
[0037] 查找子單元,用于在表頭鏈表中,查找所述節(jié)點(diǎn)內(nèi)存大小與所述所需內(nèi)存大小相 適應(yīng)的內(nèi)存塊鏈表標(biāo)識(shí);其中,所述表頭鏈表包括所述內(nèi)存塊鏈表標(biāo)識(shí)和與所述內(nèi)存塊鏈 表標(biāo)識(shí)相對(duì)應(yīng)的內(nèi)存塊鏈表的節(jié)點(diǎn)內(nèi)存大?。?br>[0038] 確定子單元,用于將查找到的內(nèi)存塊鏈表標(biāo)識(shí),確定所述節(jié)點(diǎn)內(nèi)存大小與所述所 需內(nèi)存大小相適應(yīng)的內(nèi)存塊鏈表。
[0039] 以上本發(fā)明提供的一種內(nèi)存分配管理方法及系統(tǒng)中,在應(yīng)用程序初始申請(qǐng)內(nèi)存 時(shí),為其分配一塊足夠大的大小為N內(nèi)存并利用這塊內(nèi)存建立一內(nèi)存塊鏈表,后續(xù)會(huì)由于 應(yīng)用程序的頻繁申請(qǐng)釋放內(nèi)存,形成很多大小小于N的內(nèi)存塊組成的鏈表,以上所有鏈表 形成內(nèi)存塊鏈表集,該內(nèi)存塊鏈表集