嵌入式系統(tǒng)靜態(tài)內(nèi)存池的分配方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明設(shè)及一種靜態(tài)內(nèi)存分配方法,尤其是一種應(yīng)用于移動(dòng)終端系統(tǒng)靜態(tài)內(nèi)存池 的分配方法。
【背景技術(shù)】
[0002] 當(dāng)前嵌入式系統(tǒng)的應(yīng)用非常廣泛,嵌入式系統(tǒng)受體積、功耗等限制,所集成的內(nèi)存 往往較小,因此在嵌入式系統(tǒng)設(shè)計(jì)中如何提高內(nèi)存使用效率成為人們非常關(guān)屯、問(wèn)題。嵌入 式系統(tǒng)一般使用在實(shí)時(shí)性比較高的場(chǎng)合,一般情況下會(huì)集成一個(gè)實(shí)時(shí)操作系統(tǒng),下面W應(yīng) 用于移動(dòng)終端(手機(jī)終端或衛(wèi)星終端)的操作系統(tǒng)NucleusPlus為例進(jìn)行說(shuō)明。
[0003] NucleusPlus操作系統(tǒng)是對(duì)物理內(nèi)存進(jìn)行管理,內(nèi)存分配分為動(dòng)態(tài)內(nèi)存分配和靜 態(tài)內(nèi)存分配。動(dòng)態(tài)內(nèi)存分配是從一塊足夠大的內(nèi)存中動(dòng)態(tài)地分配或回收請(qǐng)求大小內(nèi)存塊; 而靜態(tài)內(nèi)存分配是從已分配好的內(nèi)存池的單塊內(nèi)存(各單塊內(nèi)存大小相等)中的申請(qǐng)一塊 內(nèi)存。在系統(tǒng)初始化過(guò)程中,需要根據(jù)系統(tǒng)申請(qǐng)靜態(tài)內(nèi)存的情況來(lái)確定初始內(nèi)存池個(gè)數(shù)M、 內(nèi)存池的單塊內(nèi)存大小YW及單塊內(nèi)存?zhèn)€數(shù)L。初始內(nèi)存池個(gè)數(shù)越多,內(nèi)存碎片越少,內(nèi)存 管理也越復(fù)雜。在實(shí)際嵌入式操作系統(tǒng)中,通常為了靜態(tài)內(nèi)存管理方便,而嚴(yán)格控制初始內(nèi) 存池個(gè)數(shù),從而造成大量靜態(tài)內(nèi)存碎片,因此需要采用靜態(tài)內(nèi)存池分配算法將系統(tǒng)總內(nèi)存 碎片控制在一定范圍內(nèi)。
[0004] 靜態(tài)內(nèi)存池分配方法評(píng)估準(zhǔn)則為;在內(nèi)存池個(gè)數(shù)一定情況下,總內(nèi)存碎片是否最 小。當(dāng)前靜態(tài)內(nèi)存池分配方法為枚舉法和矢量量化法。枚舉法是;對(duì)申請(qǐng)的靜態(tài)內(nèi)存塊X按 照從小到大順序排序;根據(jù)內(nèi)存塊X的最小、最大值確定內(nèi)存池單塊內(nèi)存大小所有可能值 Y,共N個(gè);計(jì)算在N個(gè)值中取M個(gè)內(nèi)存池的所有組合數(shù);每個(gè)組合數(shù)可W確定1組內(nèi)存池, 將申請(qǐng)的靜態(tài)內(nèi)存塊X根據(jù)在該組內(nèi)存池按照其單塊內(nèi)存池大小進(jìn)行分組,計(jì)算各內(nèi)存池 的總內(nèi)存碎片;當(dāng)總內(nèi)存碎片最小時(shí),其對(duì)應(yīng)組合數(shù)所確定的M個(gè)內(nèi)存池為最優(yōu)內(nèi)存池分 配。其計(jì)算復(fù)雜度巧
其中N!表示N的階乘。
[0005] 矢量量化法是首先在申請(qǐng)的靜態(tài)內(nèi)存塊X的最小、最大值之間,隨機(jī)選取M個(gè)值G, 將申請(qǐng)內(nèi)存塊X按照與G之間距離最小,分為M個(gè)內(nèi)存池;計(jì)算每個(gè)內(nèi)存池內(nèi)所有內(nèi)存塊與 其均值的均方誤差并求和;用各內(nèi)存池的內(nèi)存塊均值更新G并再次進(jìn)行上述計(jì)算;當(dāng)最近 兩次迭代得到的內(nèi)存塊均方誤差和之間的誤差足夠小時(shí),則由G確定的M個(gè)內(nèi)存池作為最 終分配的內(nèi)存池。其計(jì)算復(fù)雜度與迭代次數(shù)有關(guān)。
[0006] 使用枚舉法進(jìn)行靜態(tài)內(nèi)存池分配可W得到最小的內(nèi)存碎片值,然而當(dāng)靜態(tài)內(nèi)存塊 X的最大值較大(大于1〇5字節(jié)),內(nèi)存池個(gè)數(shù)M較大(大于20)時(shí),其計(jì)算復(fù)雜度為幾乎 不可計(jì)算值。使用矢量量化法進(jìn)行靜態(tài)內(nèi)存分配很難得到較小的總內(nèi)存碎片值,該方法精 度與初始M個(gè)內(nèi)存池分布有關(guān),并且該方法收斂性不好,因此算法精度很難提高。
【發(fā)明內(nèi)容】
[0007] 鑒于W上問(wèn)題,本發(fā)明的目的在于提供一種適應(yīng)于移動(dòng)終端系統(tǒng)的嵌入式系統(tǒng)靜 態(tài)內(nèi)存池分配方法。本方法采用內(nèi)存池裂變思想進(jìn)行內(nèi)存池分配,即通過(guò)內(nèi)存池的逐次裂 變,根據(jù)內(nèi)存池的不同裂變方式下總內(nèi)存碎片最小,選擇最佳的內(nèi)存池裂變方式,由此將原 內(nèi)存池中的一個(gè)內(nèi)存池裂變?yōu)閮蓚€(gè)內(nèi)存池。依次按照上述方式進(jìn)行內(nèi)存池裂變,內(nèi)存池的 每次裂變引入一個(gè)新內(nèi)存池,當(dāng)引入的內(nèi)存池個(gè)數(shù)滿足嵌入式系統(tǒng)即終止內(nèi)存池裂變。本 發(fā)明算法精度顯著高于矢量量化法,而其算法復(fù)雜度僅為〇(NM)。
[0008] 本發(fā)明提供的靜態(tài)內(nèi)存池的分配方法為遞推過(guò)程,包含W下主要過(guò)程:
[0009] A.利用嵌入式操作系統(tǒng)統(tǒng)計(jì),當(dāng)前系統(tǒng)中靜態(tài)內(nèi)存塊個(gè)數(shù)I及每個(gè)靜態(tài)內(nèi)存塊大 小X(i),同時(shí)初始化內(nèi)存池個(gè)數(shù)M;
[0010] B.計(jì)算內(nèi)存池的所有可能邊界值;
[0011] C.計(jì)算第1個(gè)內(nèi)存池的邊界值;
[0012] D.將所述第1個(gè)內(nèi)存池裂變?yōu)閮蓚€(gè),并確定第2個(gè)內(nèi)存池的邊界值;
[0013] E.將D中得到的所述兩個(gè)內(nèi)存池裂變?yōu)镾個(gè),并確定第3個(gè)內(nèi)存池的邊界值;
[0014] F.逐次進(jìn)行上述內(nèi)存池裂變過(guò)程,當(dāng)總內(nèi)存池個(gè)數(shù)為M時(shí),則靜態(tài)內(nèi)存池分配過(guò) 程結(jié)束。
[0015] 進(jìn)一步的,所述計(jì)算內(nèi)存池的所有可能邊界值,具體為;假定內(nèi)存池分配的最小單 位值為S(其取值范圍為字或字的整數(shù)倍);則內(nèi)存池的最小邊界值為K〇) =[尤(ly>5,其 中H表示向下取整,其最大邊界值為y(0=「義-0)-|*s,其中「?]表示向上取整;在內(nèi)存池 的最小和最大邊界值之間,W步長(zhǎng)S為間隔的所有內(nèi)存值為內(nèi)存池的所有可能邊界值,見(jiàn) 公式(1)。內(nèi)存池則由其單塊內(nèi)存的最大邊界值唯一決定。X(l)表示靜態(tài)內(nèi)存塊大小。
[0016] 進(jìn)一步的,所述計(jì)算第一個(gè)內(nèi)存池的邊界值,具體為;最大邊界值為第一個(gè)內(nèi)存池 的最大邊界值,即所有申請(qǐng)的靜態(tài)內(nèi)存塊都小于或等于該最大邊界值。按照公式(2)計(jì)算 此時(shí)總內(nèi)存碎片值,即所有申請(qǐng)的靜態(tài)內(nèi)存塊與最大邊界值之差的絕對(duì)值并累加。
[0017] 進(jìn)一步的,所述將第一內(nèi)存池裂變?yōu)閮蓚€(gè),并確定第2個(gè)內(nèi)存池邊界值,具體為: 在最小邊界值與最大邊界值之間,W步長(zhǎng)為S,不包括最大邊界值的所有邊界值中,依次取 1個(gè)邊界值作為新邊界值,將小于新邊界值的所有申請(qǐng)靜態(tài)內(nèi)存塊作為第2個(gè)內(nèi)存池的最 大邊界值,將大于新邊界值并且小于或等于最大邊界值的所有申請(qǐng)靜態(tài)內(nèi)存塊作為第1個(gè) 內(nèi)存池的最大邊界值,按照公式(3)計(jì)算此時(shí)總內(nèi)存碎片值,即各內(nèi)存池的最大邊界值與 其中靜態(tài)內(nèi)存塊之差的絕對(duì)值并累加。由于新邊界值取值范圍不同,因此可W得到若干個(gè) 總內(nèi)存碎片,取最小總內(nèi)存碎片所在新邊界值作為第2個(gè)內(nèi)存池邊界值。為方便描述,假定 已確定的2個(gè)內(nèi)存池的最大邊界值按照從小到大順序排序并進(jìn)行更新。
[0018] 進(jìn)一步的,所述將兩個(gè)內(nèi)存池裂變?yōu)?個(gè),并確定第3個(gè)內(nèi)存池邊界值,具體為: 根據(jù)新邊界值小于第1個(gè)內(nèi)存池的最大邊界值,還是大于第1個(gè)內(nèi)存池的最大邊界值并且 小于或等于第2個(gè)內(nèi)存池的最大邊界值,分為兩種情況。情況1中,將第1個(gè)內(nèi)存池由新邊 界值裂變?yōu)?個(gè)內(nèi)存池,將小于或等于此時(shí)3個(gè)內(nèi)存池最大邊界的靜態(tài)內(nèi)存塊與各自內(nèi)存 池最大邊界值之差的絕對(duì)值并累計(jì),得到總內(nèi)存碎片值,見(jiàn)公式(4)。情況2中,將第2個(gè)內(nèi) 存池由新邊界值裂變?yōu)?個(gè)內(nèi)存池,將小于或等于此時(shí)3個(gè)內(nèi)存池最大邊界的靜態(tài)內(nèi)存塊 與各自內(nèi)存池最大邊界值之差的絕對(duì)值并累計(jì),得到總內(nèi)存碎片值,見(jiàn)公式(4)。將情況1、 2中,所有新邊界值取值范圍得到的總內(nèi)存池碎片值最小所在新邊界值作為第3個(gè)內(nèi)存池 的最大邊界值。
[0019] 為了進(jìn)一步提高靜態(tài)內(nèi)存池劃分精度,在M-定情況下使總內(nèi)存池更好,可W采 取下述過(guò)程:
[0020] a、初始化內(nèi)存池個(gè)數(shù)為M1,使其滿足MDM;
[0021] b、按照所述B、C、D、E的方式使內(nèi)存池裂變后其個(gè)數(shù)為M1,并得到其各內(nèi)存池上邊 界值Y(ni),^n2),…,;
[0022]C、依次將內(nèi)存池上邊界值Y(叫),^叫),…,取消,分別根據(jù)新的M1-1個(gè)邊 界值^ni),Y(n2),…,Y(nMH)對(duì)靜態(tài)內(nèi)存塊X(i),i= 1:1劃分,得到為各內(nèi)存池的單塊內(nèi) 存,即X(i),i= 1:1。i=1:12,…,i= 則內(nèi)存池上邊界取消后總內(nèi)存碎片C(n) 為:
[0023]
[0024] 其中n= 取C(n)中最小值n所對(duì)應(yīng)的內(nèi)存池上邊界值,將其取消,從而 將Ml個(gè)內(nèi)存池減少為M1-1個(gè)內(nèi)存池;
[00巧]t依次進(jìn)行上述步驟C的內(nèi)存池的取消過(guò)程,每次取消1個(gè)內(nèi)存池,直到內(nèi)存池個(gè) 數(shù)為M時(shí),終止內(nèi)存池的取消過(guò)程,即最終完成M個(gè)靜態(tài)內(nèi)存池的分配過(guò)程。
[0026] 采用本申請(qǐng)方法,不但使內(nèi)存分配方法計(jì)算復(fù)雜度得到大幅度降低,而且盡可能 減少了內(nèi)存碎片,從而提高了內(nèi)存利用率。
【附圖說(shuō)明】
[0027]