基于多路處理器的共享內(nèi)存的優(yōu)化處理方法及裝置的制造方法
【專利摘要】本發(fā)明提供了一種基于多路處理器的共享內(nèi)存的優(yōu)化處理方法及裝置。優(yōu)化處理方法包括:基于多路處理器的共享內(nèi)存的優(yōu)化處理方法,其特征在于,優(yōu)化處理方法包括:對(duì)多路處理器環(huán)境下的Linux內(nèi)核進(jìn)行數(shù)據(jù)結(jié)構(gòu)修改,數(shù)據(jù)結(jié)構(gòu)修改包括在free_area數(shù)據(jù)結(jié)構(gòu)中新增數(shù)據(jù)結(jié)構(gòu)鏈表;根據(jù)修改后的free_area數(shù)據(jù)結(jié)構(gòu),對(duì)多路處理器環(huán)境下的共享物理內(nèi)存的塊分配算法進(jìn)行塊分配優(yōu)化;根據(jù)修改后的free_area數(shù)據(jù)結(jié)構(gòu),對(duì)塊釋放函數(shù)進(jìn)行塊釋放優(yōu)化。相比于現(xiàn)有伙伴算法而言,本發(fā)明的上述技術(shù)能夠減小時(shí)間開銷,提升物理內(nèi)存的使用效率,以及降低內(nèi)存碎片率。
【專利說明】
基于多路處理器的共享內(nèi)存的優(yōu)化處理方法及裝置
技術(shù)領(lǐng)域
[0001] 本發(fā)明涉及計(jì)算機(jī)技術(shù),尤其涉及一種基于多路處理器的共享內(nèi)存的優(yōu)化處理方 法及裝置。
【背景技術(shù)】
[0002] 隨著大數(shù)據(jù)的流行,在多路處理器的內(nèi)存優(yōu)化方面還有很多工作要做,然而在當(dāng) 前的底層物理內(nèi)存管理無論是從內(nèi)存碎片還是使用效率來說都存在不足,針對(duì)于大數(shù)據(jù)處 理時(shí),往往會(huì)需要小而多的物理內(nèi)存,這樣頻繁的使用物理內(nèi)存,勢(shì)必會(huì)導(dǎo)致內(nèi)存管理的低 效。為了提高系統(tǒng)的內(nèi)存使用效率,在Linux內(nèi)核中使用了伙伴(Buddy)算法,以提高物理內(nèi) 存的使用效率,然而,伙伴算法在多路處理器的環(huán)境下,其內(nèi)存使用效率較低,且內(nèi)存碎片 率較高。
【發(fā)明內(nèi)容】
[0003] 在下文中給出了關(guān)于本發(fā)明的簡(jiǎn)要概述,以便提供關(guān)于本發(fā)明的某些方面的基本 理解。應(yīng)當(dāng)理解,這個(gè)概述并不是關(guān)于本發(fā)明的窮舉性概述。它并不是意圖確定本發(fā)明的關(guān) 鍵或重要部分,也不是意圖限定本發(fā)明的范圍。其目的僅僅是以簡(jiǎn)化的形式給出某些概念, 以此作為稍后論述的更詳細(xì)描述的前序。
[0004] 鑒于此,本發(fā)明提供了一種基于多路處理器的共享內(nèi)存的優(yōu)化處理方法及裝置, 以至少解決目前多路處理器環(huán)境下的內(nèi)存使用率較低、且內(nèi)存碎片率較高的問題。
[0005] 根據(jù)本發(fā)明的一個(gè)方面,提供了一種基于多路處理器的共享內(nèi)存的優(yōu)化處理方 法,其特征在于,優(yōu)化處理方法包括:對(duì)多路處理器環(huán)境下的Linux內(nèi)核進(jìn)行數(shù)據(jù)結(jié)構(gòu)修改, 數(shù)據(jù)結(jié)構(gòu)修改包括在f ree_area數(shù)據(jù)結(jié)構(gòu)中新增數(shù)據(jù)結(jié)構(gòu)鏈表;根據(jù)修改后的free_area數(shù) 據(jù)結(jié)構(gòu),對(duì)多路處理器環(huán)境下的共享物理內(nèi)存的塊分配算法進(jìn)行塊分配優(yōu)化;根據(jù)修改后 的free_area數(shù)據(jù)結(jié)構(gòu),對(duì)塊釋放函數(shù)進(jìn)行塊釋放優(yōu)化。
[0006] 進(jìn)一步地,數(shù)據(jù)結(jié)構(gòu)修改包括在free_area數(shù)據(jù)結(jié)構(gòu)中增加新的free_list_delay 數(shù)據(jù)結(jié)構(gòu)鏈表。
[0007]進(jìn)一步地,塊分配優(yōu)化包括:優(yōu)先在新增的free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中查找 空閑內(nèi)存;當(dāng)在新增的free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中查找到空閑內(nèi)存時(shí),確定完成塊分 配優(yōu)化;當(dāng)在新增的free jist_delay數(shù)據(jù)結(jié)構(gòu)鏈表中未查找到空閑內(nèi)存時(shí),在原始的 free_list數(shù)據(jù)結(jié)構(gòu)鏈表中繼續(xù)查找空閑內(nèi)存,在找到空閑內(nèi)存之后,確定完成塊分配優(yōu) 化。
[0008]進(jìn)一步地,塊釋放優(yōu)化包括:將原始的free_l ist數(shù)據(jù)結(jié)構(gòu)鏈表中的伙伴塊合并時(shí) 機(jī)轉(zhuǎn)移到新增的f ree_l i s t_de lay數(shù)據(jù)結(jié)構(gòu)鏈表中。
[0009]根據(jù)本發(fā)明的另一方面,還提供了一種基于多路處理器的共享內(nèi)存的優(yōu)化處理裝 置,該優(yōu)化處理裝置包括:數(shù)據(jù)結(jié)構(gòu)修改模塊,其被配置用于對(duì)多路處理器環(huán)境下的Linux 內(nèi)核進(jìn)行數(shù)據(jù)結(jié)構(gòu)修改,數(shù)據(jù)結(jié)構(gòu)修改包括在free_area數(shù)據(jù)結(jié)構(gòu)中新增數(shù)據(jù)結(jié)構(gòu)鏈表;塊 分配優(yōu)化模塊,其被配置用于根據(jù)修改后的free_area數(shù)據(jù)結(jié)構(gòu),對(duì)多路處理器環(huán)境下的共 享物理內(nèi)存的塊分配算法進(jìn)行塊分配優(yōu)化;塊釋放優(yōu)化模塊,其被配置用于根據(jù)修改后的 free_area數(shù)據(jù)結(jié)構(gòu),對(duì)塊釋放函數(shù)進(jìn)行塊釋放優(yōu)化。
[00?0]進(jìn)一步地,數(shù)據(jù)結(jié)構(gòu)修改模塊被配置用于在free_area數(shù)據(jù)結(jié)構(gòu)中增加新的free_ list_delay數(shù)據(jù)結(jié)構(gòu)鏈表。
[0011]進(jìn)一步地,塊分配優(yōu)化模塊被配置用于:優(yōu)先在新增的free_list_delay數(shù)據(jù)結(jié)構(gòu) 鏈表中查找空閑內(nèi)存;當(dāng)在新增的free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中查找到空閑內(nèi)存時(shí),確 定完成塊分配優(yōu)化;當(dāng)在新增的free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中未查找到空閑內(nèi)存時(shí),在 原始的free_list數(shù)據(jù)結(jié)構(gòu)鏈表中繼續(xù)查找空閑內(nèi)存,在找到空閑內(nèi)存之后,確定完成塊分 配優(yōu)化。
[0012] 進(jìn)一步地,塊釋放優(yōu)化模塊被配置用于:將原始的free_list數(shù)據(jù)結(jié)構(gòu)鏈表中的伙 伴塊合并時(shí)機(jī)轉(zhuǎn)移到新增的free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中。
[0013] 本發(fā)明的基于多路處理器的共享內(nèi)存的優(yōu)化處理方法及裝置,通過對(duì)多路處理器 環(huán)境下的Linux內(nèi)核進(jìn)行數(shù)據(jù)結(jié)構(gòu)修改、塊分配優(yōu)化以及塊釋放優(yōu)化,實(shí)現(xiàn)對(duì)共享物理內(nèi)存 的優(yōu)化,相比于現(xiàn)有伙伴算法而言,能夠減小時(shí)間開銷,提升物理內(nèi)存的使用效率,降低內(nèi) 存碎片率。
[0014]通過以下結(jié)合附圖對(duì)本發(fā)明的最佳實(shí)施例的詳細(xì)說明,本發(fā)明的這些以及其他優(yōu) 點(diǎn)將更加明顯。
【附圖說明】
[0015] 本發(fā)明可以通過參考下文中結(jié)合附圖所給出的描述而得到更好的理解,其中在所 有附圖中使用了相同或相似的附圖標(biāo)記來表示相同或者相似的部件。所述附圖連同下面的 詳細(xì)說明一起包含在本說明書中并且形成本說明書的一部分,而且用來進(jìn)一步舉例說明本 發(fā)明的優(yōu)選實(shí)施例和解釋本發(fā)明的原理和優(yōu)點(diǎn)。在附圖中:
[0016] 圖1是示意性地示出本發(fā)明的基于多路處理器的共享內(nèi)存的優(yōu)化處理方法的一個(gè) 示例性處理的流程圖;
[0017] 圖2是示意性地示出圖1所示的步驟S120中的塊分配優(yōu)化處理的一種可能處理的 流程圖;
[0018] 圖3是示意性地示出塊分配優(yōu)化的一種可能處理的流程圖;
[0019]圖4是示意性地示出塊釋放優(yōu)化的一種可能處理的流程圖;
[0020]圖5是示意性地示出本發(fā)明的基于多路處理器的共享內(nèi)存的優(yōu)化處理裝置的一個(gè) 示例的結(jié)構(gòu)框圖;
[0021]圖6是示意性地示出在一個(gè)例子中采用本發(fā)明的基于多路處理器的共享內(nèi)存的優(yōu) 化處理方法所得到的延遲合并算法與現(xiàn)有技術(shù)中的伙伴算法的時(shí)間開銷對(duì)比結(jié)果圖;
[0022]圖7是示意性地示出在一個(gè)例子中采用本發(fā)明的基于多路處理器的共享內(nèi)存的優(yōu) 化處理方法所得到的延遲合并算法與現(xiàn)有技術(shù)中的伙伴算法的內(nèi)存碎片率對(duì)比結(jié)果圖。 [0023]本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,附圖中的元件僅僅是為了簡(jiǎn)單和清楚起見而示出的, 而且不一定是按比例繪制的。例如,附圖中某些元件的尺寸可能相對(duì)于其他元件放大了,以 便有助于提高對(duì)本發(fā)明實(shí)施例的理解。
【具體實(shí)施方式】
[0024] 在下文中將結(jié)合附圖對(duì)本發(fā)明的示范性實(shí)施例進(jìn)行描述。為了清楚和簡(jiǎn)明起見, 在說明書中并未描述實(shí)際實(shí)施方式的所有特征。然而,應(yīng)該了解,在開發(fā)任何這種實(shí)際實(shí)施 例的過程中必須做出很多特定于實(shí)施方式的決定,以便實(shí)現(xiàn)開發(fā)人員的具體目標(biāo),例如,符 合與系統(tǒng)及業(yè)務(wù)相關(guān)的那些限制條件,并且這些限制條件可能會(huì)隨著實(shí)施方式的不同而有 所改變。此外,還應(yīng)該了解,雖然開發(fā)工作有可能是非常復(fù)雜和費(fèi)時(shí)的,但對(duì)得益于本公開 內(nèi)容的本領(lǐng)域技術(shù)人員來說,這種開發(fā)工作僅僅是例行的任務(wù)。
[0025] 在此,還需要說明的一點(diǎn)是,為了避免因不必要的細(xì)節(jié)而模糊了本發(fā)明,在附圖中 僅僅示出了與根據(jù)本發(fā)明的方案密切相關(guān)的裝置結(jié)構(gòu)和/或處理步驟,而省略了與本發(fā)明 關(guān)系不大的其他細(xì)節(jié)。
[0026]本發(fā)明的實(shí)施例提供了一種基于多路處理器的共享內(nèi)存的優(yōu)化處理方法,其特征 在于,優(yōu)化處理方法包括:對(duì)多路處理器環(huán)境下的Linux內(nèi)核進(jìn)行數(shù)據(jù)結(jié)構(gòu)修改,數(shù)據(jù)結(jié)構(gòu) 修改包括在free_area數(shù)據(jù)結(jié)構(gòu)中新增數(shù)據(jù)結(jié)構(gòu)鏈表;根據(jù)修改后的free_area數(shù)據(jù)結(jié)構(gòu), 對(duì)多路處理器環(huán)境下的共享物理內(nèi)存的塊分配算法進(jìn)行塊分配優(yōu)化;根據(jù)修改后的free_ area數(shù)據(jù)結(jié)構(gòu),對(duì)塊釋放函數(shù)進(jìn)行塊釋放優(yōu)化。
[0027]下面結(jié)合圖1描述本發(fā)明的基于多路處理器的共享內(nèi)存的優(yōu)化處理方法的一個(gè)示 例的處理流程100。
[0028] 如圖1所示,處理流程100開始于步驟S110。
[0029] 在步驟S110中,對(duì)多路處理器環(huán)境下的Linux內(nèi)核進(jìn)行數(shù)據(jù)結(jié)構(gòu)修改。然后,執(zhí)行 步驟S120。
[0030]其中,該數(shù)據(jù)結(jié)構(gòu)修改例如包括:在free_area數(shù)據(jù)結(jié)構(gòu)中新增數(shù)據(jù)結(jié)構(gòu)鏈表。 [0031]根據(jù)一種實(shí)現(xiàn)方式,步驟S110中的數(shù)據(jù)結(jié)構(gòu)修改可以為:在free_area數(shù)據(jù)結(jié)構(gòu)中 增加新的free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表。這樣,在修改后的free_area數(shù)據(jù)結(jié)構(gòu)中,存在新 增的free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表以及原始的free_list數(shù)據(jù)結(jié)構(gòu)鏈表。
[0032] 在步驟S120中,根據(jù)修改后的free_area數(shù)據(jù)結(jié)構(gòu),對(duì)多路處理器環(huán)境下的共享物 理內(nèi)存的塊分配算法進(jìn)行塊分配優(yōu)化。
[0033] 根據(jù)一種實(shí)現(xiàn)方式,步驟S120中的塊分配優(yōu)化可以包括如圖2所示的步驟S210和 S220〇
[0034] 如圖2所示,在步驟S210中,在新增的;1^66_1181:_(16137數(shù)據(jù)結(jié)構(gòu)鏈表中查找空閑 內(nèi)存。
[0035]當(dāng)步驟S210中在新增的free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中查找到空閑內(nèi)存時(shí),跳 出步驟S120,則步驟S120結(jié)束,繼續(xù)執(zhí)行步驟S130。
[0036]當(dāng)步驟S210中在新增的free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中未查找到空閑內(nèi)存時(shí), 繼續(xù)執(zhí)行步驟S220。
[0037]在步驟S220中,在原始的free_list數(shù)據(jù)結(jié)構(gòu)鏈表中繼續(xù)查找空閑內(nèi)存。這樣,能 夠在原始的free_l ist數(shù)據(jù)結(jié)構(gòu)鏈表中找到空閑內(nèi)存。步驟S120結(jié)束,然后執(zhí)行步驟S130。 [0038]此外,圖3還示出了塊分配優(yōu)化處理的另一個(gè)示例的處理流程。
[0039] 如圖3所示,塊分配優(yōu)化處理開始之后,執(zhí)行步驟S301。
[0040] 在步驟S301中,判斷當(dāng)前內(nèi)存是否充足?若充足,則執(zhí)行步驟S302;否則,執(zhí)行步驟 S303〇
[0041] 在步驟S303中,通過調(diào)用守護(hù)進(jìn)程釋放內(nèi)存,然后返回執(zhí)行步驟S301。
[0042] 在步驟S302中,通過階數(shù)order找到相應(yīng)的free_area數(shù)據(jù)結(jié)構(gòu)。然后執(zhí)行步驟 S304。
[0043] 在步驟S304中,通過迀移類型111丨8抑七6七7口6確定;1^66_1丨81:數(shù)據(jù)結(jié)構(gòu)鏈表。然后執(zhí) 行步驟S305。
[0044]在步驟S305中,判定在free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中是否有空閑內(nèi)存?若在 free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中有空閑內(nèi)存,執(zhí)行步驟S306;否則,執(zhí)行步驟S310。
[0045] 在步驟S306中,調(diào)用expand函數(shù)刪除已分配出去的內(nèi)存,然后執(zhí)行步驟S307。
[0046]在步驟S307中,將空閑塊分配到相應(yīng)的進(jìn)程(其中,相應(yīng)的進(jìn)程是指用戶請(qǐng)求空閑 內(nèi)存的那個(gè)進(jìn)程),然后執(zhí)行步驟S308。
[0047]在步驟S308中,將剩余內(nèi)存塊放入free jist數(shù)據(jù)結(jié)構(gòu)鏈表中。然后執(zhí)行步驟 S309〇
[0048] 在步驟S309中,返回內(nèi)存塊page地址。塊分配優(yōu)化處理結(jié)束。
[0049]在步驟S310中,判定在free jist數(shù)據(jù)結(jié)構(gòu)鏈表中是否有空閑內(nèi)存?若在free_ list數(shù)據(jù)結(jié)構(gòu)鏈表中有空閑內(nèi)存,執(zhí)行步驟S306;否則,執(zhí)行步驟S311。
[0050]在步驟S311中,階數(shù)order自加。然后執(zhí)行步驟S312。其中,"階數(shù)order自加"是指 更新當(dāng)前階數(shù)order,并且,更新后階數(shù)的值等于更新前階數(shù)的值加1。
[0051 ] 在步驟S312中,判定"current_order〈MAX_ORDER"是否成立?即,判定當(dāng)前order是 否小于最大order。若成立,則執(zhí)行步驟S305;否則,執(zhí)行步驟313。
[0052]在步驟S313中,縮減預(yù)留給系統(tǒng)的內(nèi)存。然后執(zhí)行步驟S301。
[0053] 如圖1所示,在步驟S130中,根據(jù)修改后的free_area數(shù)據(jù)結(jié)構(gòu),對(duì)塊釋放函數(shù)進(jìn)行 塊釋放優(yōu)化。
[0054]根據(jù)一種實(shí)現(xiàn)方式,步驟S130中的塊釋放優(yōu)化例如可為:將原始的free_list數(shù)據(jù) 結(jié)構(gòu)鏈表中的伙伴塊合并時(shí)機(jī)轉(zhuǎn)移到新增的free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中。
[0055]圖4示出了塊釋放優(yōu)化處理的另一個(gè)示例的處理流程。
[0056] 如圖4所示,塊釋放優(yōu)化處理開始之后,執(zhí)行步驟S401。
[0057] 在步驟S401中,通過當(dāng)前order確定對(duì)應(yīng)的鏈表的階數(shù)。然后執(zhí)行步驟S402。
[0058]在步驟S402中,通過迀移類型枚舉結(jié)構(gòu)找到相應(yīng)的鏈表。然后執(zhí)行步驟S403。
[0059]在步驟S403中,通過要釋放的內(nèi)存塊的地址(如id)得到該內(nèi)存塊的伙伴塊的地址 (如id)。然后執(zhí)行步驟S404。
[0060] 在步驟S404中,判定步驟S403中得到的伙伴塊是否空閑?若是,執(zhí)行步驟S405;否 貝丨J,執(zhí)行步驟S406。
[0061 ]在步驟S406中,將空閑內(nèi)存塊釋放到free jist鏈表中,然后結(jié)束塊釋放優(yōu)化處 理。
[0062]在步驟S405中,判定該伙伴塊是否在free_list數(shù)據(jù)結(jié)構(gòu)鏈表中?若是,執(zhí)行步驟 S407;否則,執(zhí)行步驟S408。
[0063]在步驟S407中,將空閑內(nèi)存塊釋放到free_liSt_delay數(shù)據(jù)結(jié)構(gòu)鏈表中。然后結(jié)束 塊釋放優(yōu)化處理。
[0064]在步驟S408中,在;^66_1丨81:_(16137數(shù)據(jù)結(jié)構(gòu)鏈表中尋找要釋放的內(nèi)存塊的伙伴 塊。然后執(zhí)彳丁步驟S409。
[0065]在步驟S409中,合并要釋放的內(nèi)存塊及其伙伴塊,并且當(dāng)前階數(shù)order自加。其中, "當(dāng)前階數(shù)order自加"是指更新當(dāng)前階數(shù)order,并且,更新后階數(shù)的值等于更新前階數(shù)的 值加1,即current_order++,然后執(zhí)行步驟S410。
[0066] 在步驟S410中,判定"current_order〈MAX_ORDER"是否成立?即,判定當(dāng)前order是 否小于最大order。若成立,則執(zhí)行步驟S404;否則,執(zhí)行步驟S411。
[0067] 在步驟S411中,將合并后所得的內(nèi)存塊鏈接至current_order(當(dāng)前階數(shù))對(duì)應(yīng)的 free_list鏈表中。然后結(jié)束塊釋放優(yōu)化處理。
[0068]通過以上描述可知,本發(fā)明的基于多路處理器的共享內(nèi)存的優(yōu)化處理方法,其通 過對(duì)多路處理器環(huán)境下的Linux內(nèi)核進(jìn)行數(shù)據(jù)結(jié)構(gòu)修改、塊分配優(yōu)化以及塊釋放優(yōu)化,實(shí)現(xiàn) 對(duì)共享物理內(nèi)存的優(yōu)化。實(shí)驗(yàn)結(jié)果表明,利用本發(fā)明的上述優(yōu)化處理方法所得到的延遲合 并算法,相比于現(xiàn)有伙伴算法而言,能夠減小時(shí)間開銷,提升物理內(nèi)存的使用效率,降低內(nèi) 存碎片率。
[0069]此外,本發(fā)明的實(shí)施例還提供了一種基于多路處理器的共享內(nèi)存的優(yōu)化處理裝 置,該優(yōu)化處理裝置包括:數(shù)據(jù)結(jié)構(gòu)修改模塊,其被配置用于對(duì)多路處理器環(huán)境下的Linux 內(nèi)核進(jìn)行數(shù)據(jù)結(jié)構(gòu)修改,數(shù)據(jù)結(jié)構(gòu)修改包括在free_area數(shù)據(jù)結(jié)構(gòu)中新增數(shù)據(jù)結(jié)構(gòu)鏈表;塊 分配優(yōu)化模塊,其被配置用于根據(jù)修改后的free_a rea數(shù)據(jù)結(jié)構(gòu),對(duì)多路處理器環(huán)境下的共 享物理內(nèi)存的塊分配算法進(jìn)行塊分配優(yōu)化;塊釋放優(yōu)化模塊,其被配置用于根據(jù)修改后的 free_area數(shù)據(jù)結(jié)構(gòu),對(duì)塊釋放函數(shù)進(jìn)行塊釋放優(yōu)化。
[0070] 下面結(jié)合圖5來描述本發(fā)明的基于多路處理器的共享內(nèi)存的優(yōu)化處理裝置300的 一個(gè)示例。
[0071] 如圖5所示,優(yōu)化處理裝置500包括數(shù)據(jù)結(jié)構(gòu)修改模塊510、塊分配優(yōu)化模塊520和 塊釋放優(yōu)化模塊530。
[0072]其中,數(shù)據(jù)結(jié)構(gòu)修改模塊510用于對(duì)多路處理器環(huán)境下的Linux內(nèi)核進(jìn)行數(shù)據(jù)結(jié)構(gòu) 修改,數(shù)據(jù)結(jié)構(gòu)修改包括在free_area數(shù)據(jù)結(jié)構(gòu)中新增數(shù)據(jù)結(jié)構(gòu)鏈表。
[0073]根據(jù)一種實(shí)現(xiàn)方式,數(shù)據(jù)結(jié)構(gòu)修改模塊510所執(zhí)行的"數(shù)據(jù)結(jié)構(gòu)修改"處理例如是 在free_area數(shù)據(jù)結(jié)構(gòu)中增加新的;1^66_1181:_(16137數(shù)據(jù)結(jié)構(gòu)鏈表。
[0074] 塊分配優(yōu)化模塊520用于根據(jù)修改后的free_area數(shù)據(jù)結(jié)構(gòu),對(duì)多路處理器環(huán)境下 的共享物理內(nèi)存的塊分配算法進(jìn)行塊分配優(yōu)化。
[0075]根據(jù)一種實(shí)現(xiàn)方式,塊分配優(yōu)化模塊520所執(zhí)行的"塊分配優(yōu)化"處理例如包括:優(yōu) 先在新增的free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中查找空閑內(nèi)存;當(dāng)在新增的free_list_delay 數(shù)據(jù)結(jié)構(gòu)鏈表中查找到空閑內(nèi)存時(shí),確定完成塊分配優(yōu)化;當(dāng)在新增的free_list_delay數(shù) 據(jù)結(jié)構(gòu)鏈表中未查找到空閑內(nèi)存時(shí),在原始的free_list數(shù)據(jù)結(jié)構(gòu)鏈表中繼續(xù)查找空閑內(nèi) 存,在找到空閑內(nèi)存之后,確定完成塊分配優(yōu)化。
[0076]塊釋放優(yōu)化模塊530用于根據(jù)修改后的free_area數(shù)據(jù)結(jié)構(gòu),對(duì)塊釋放函數(shù)進(jìn)行塊 釋放優(yōu)化。
[0077]根據(jù)一種實(shí)現(xiàn)方式,塊釋放優(yōu)化模塊530所執(zhí)行的"塊釋放優(yōu)化"處理例如為:將原 始的free_list數(shù)據(jù)結(jié)構(gòu)鏈表中的伙伴塊合并時(shí)機(jī)轉(zhuǎn)移到新增的free_list_delay數(shù)據(jù)結(jié) 構(gòu)鏈表中。
[0078]通過以上描述可知,本發(fā)明的基于多路處理器的共享內(nèi)存的優(yōu)化處理裝置,其通 過對(duì)多路處理器環(huán)境下的Linux內(nèi)核進(jìn)行數(shù)據(jù)結(jié)構(gòu)修改、塊分配優(yōu)化以及塊釋放優(yōu)化,實(shí)現(xiàn) 對(duì)共享物理內(nèi)存的優(yōu)化。實(shí)驗(yàn)結(jié)果表明,利用本發(fā)明的上述優(yōu)化處理裝置所得到的延遲合 并算法,相比于現(xiàn)有伙伴算法而言,能夠減小時(shí)間開銷,提升物理內(nèi)存的使用效率,降低內(nèi) 存碎片率。
[0079]優(yōu)選實(shí)施例
[0080]下面描述本發(fā)明的基于多路處理器的共享內(nèi)存的優(yōu)化處理方法的一個(gè)優(yōu)選實(shí)施 例。
[0081] 通過對(duì)多路處理器環(huán)境下的伙伴算法進(jìn)行分析,能夠發(fā)現(xiàn)其不足。
[0082] 首先,通過對(duì)Linux內(nèi)核中free_area數(shù)據(jù)結(jié)構(gòu)的修改,增加新的free_list_delay 數(shù)據(jù)結(jié)構(gòu)鏈表。
[0083]接著,通過修改后的free_area結(jié)構(gòu),對(duì)共享物理內(nèi)存的塊分配的算法進(jìn)行優(yōu)化 (即塊分配優(yōu)化)。塊分配優(yōu)化即:首先先到新增的free_l ist_delay數(shù)據(jù)結(jié)構(gòu)鏈表中查找空 閑內(nèi)存,在查找不到時(shí)再到原始的free_list數(shù)據(jù)結(jié)構(gòu)鏈表中查找空閑內(nèi)存,以保證最近頻 繁使用的空閑內(nèi)存能夠得以復(fù)用,從而能夠提升內(nèi)存分配的速度。
[0084]然后,通過修改后的free_area結(jié)構(gòu)以及延遲合并策略,對(duì)塊釋放函數(shù)進(jìn)行優(yōu)化 (即塊釋放優(yōu)化)。塊釋放優(yōu)化即:將合并時(shí)機(jī)移到新增的數(shù)據(jù)結(jié)構(gòu)鏈表中。
[0085]其中,延遲合并策略也即,在原始鏈表中不進(jìn)行伙伴塊合并,而是保留兩空閑伙伴 塊以提供下次的分配使用。這樣,能夠降低伙伴塊頻繁合并的時(shí)間,節(jié)省物理內(nèi)存管理的總 體時(shí)間,從而能夠提升效率。
[0086]下面,基于龍芯實(shí)驗(yàn)平臺(tái)對(duì)通過以上優(yōu)化處理方法所得到的延遲合并算法進(jìn)行測(cè) 試,分別從時(shí)間、內(nèi)存使用效率、內(nèi)存碎片等指標(biāo)來對(duì)本發(fā)明的優(yōu)化處理方法的有效性進(jìn)行 驗(yàn)證。
[0087] 其中,在時(shí)間指標(biāo)上,采用可移動(dòng)內(nèi)存池算法對(duì)內(nèi)存分配的時(shí)間進(jìn)行測(cè)試,內(nèi)核會(huì) 調(diào)用__get_free_pages入口函數(shù),其實(shí)際分配物理內(nèi)存的函數(shù)為__rmqueue_smallest,在 此函數(shù)進(jìn)行對(duì)物理內(nèi)存申請(qǐng)方式的優(yōu)化,通過測(cè)試可得,延遲合并算法的時(shí)間開銷明顯比 伙伴算法降低了,如附圖6所示。
[0088] 然后,對(duì)Linux系統(tǒng)的內(nèi)存碎片進(jìn)行測(cè)試,碎片分為外部碎片和內(nèi)部碎片,采用如 下公式計(jì)算內(nèi)存碎片中的內(nèi)部碎片率fi,
[0089] fi=ERi/EQi
[0090] 該式中,Ri為請(qǐng)求分配的頁框數(shù)量,頁框大小為4KB,Qi為系統(tǒng)實(shí)際分配的頁框數(shù) 量,兩者進(jìn)行比值,即為所得理論的內(nèi)部碎片率fi。外部碎片率f的計(jì)算如下公式,
[0091] f=mm_free/total
[0092] 其中mm_free表示沒有擁有的內(nèi)存量,total表示系統(tǒng)物理空間總量,f則表示外部 碎片率的大小,其與伙伴算法的對(duì)比如圖7所示。由圖7可以看出,利用本發(fā)明能夠降低內(nèi)存 碎片率。圖7中的縱坐標(biāo)對(duì)應(yīng)內(nèi)存碎片率。
[0093] 需要說明的是,優(yōu)化處理方法是在Linux內(nèi)核中完成的,從數(shù)據(jù)結(jié)構(gòu)、塊分配、塊釋 放函數(shù)采用延遲策略進(jìn)行對(duì)算法的優(yōu)化,在free_area數(shù)據(jù)結(jié)構(gòu)中的原始free_list鏈表的 基礎(chǔ)上增加了一個(gè)free_list_delay鏈表結(jié)構(gòu),并采用延遲合并的方式對(duì)內(nèi)存塊的申請(qǐng)進(jìn) 行控制,在函數(shù)__get_f ree_pages中進(jìn)行塊的請(qǐng)求,將其優(yōu)先申請(qǐng)f ree_l i st_de lay中的空 閑內(nèi)存,其優(yōu)化代碼的一個(gè)示例如下:
[0094]
[0099]然后在塊釋放時(shí)將伙伴塊的合并時(shí)機(jī)放入新增free_list_delay鏈表中,將原始 free_list鏈表中的空閑塊保留得以復(fù)用,從而降低內(nèi)存塊的合并與分裂時(shí)間,提升物理內(nèi) 存的使用效率。
[0100]與現(xiàn)有的伙伴算法對(duì)比,結(jié)果表明:利用本發(fā)明的優(yōu)化處理方法對(duì)多路處理器環(huán) 境下的共享內(nèi)存進(jìn)行優(yōu)化,所得到的延遲合并算法相比于現(xiàn)有的伙伴算法而言,從時(shí)間開 銷、內(nèi)存使用效率、內(nèi)存碎片等角度均更具有優(yōu)勢(shì),結(jié)果如圖6-7所示,由此表明本發(fā)明的優(yōu) 化處理方法的處理效果較好。
[0101]盡管根據(jù)有限數(shù)量的實(shí)施例描述了本發(fā)明,但是受益于上面的描述,本技術(shù)領(lǐng)域 內(nèi)的技術(shù)人員明白,在由此描述的本發(fā)明的范圍內(nèi),可以設(shè)想其它實(shí)施例。此外,應(yīng)當(dāng)注意, 本說明書中使用的語言主要是為了可讀性和教導(dǎo)的目的而選擇的,而不是為了解釋或者限 定本發(fā)明的主題而選擇的。因此,在不偏離所附權(quán)利要求書的范圍和精神的情況下,對(duì)于本 技術(shù)領(lǐng)域的普通技術(shù)人員來說許多修改和變更都是顯而易見的。對(duì)于本發(fā)明的范圍,對(duì)本 發(fā)明所做的公開是說明性的,而非限制性的,本發(fā)明的范圍由所附權(quán)利要求書限定。
【主權(quán)項(xiàng)】
1. 基于多路處理器的共享內(nèi)存的優(yōu)化處理方法,其特征在于,所述優(yōu)化處理方法包括: 對(duì)多路處理器環(huán)境下的Linux內(nèi)核進(jìn)行數(shù)據(jù)結(jié)構(gòu)修改,所述數(shù)據(jù)結(jié)構(gòu)修改包括在free_ area數(shù)據(jù)結(jié)構(gòu)中新增數(shù)據(jù)結(jié)構(gòu)鏈表; 根據(jù)修改后的free_area數(shù)據(jù)結(jié)構(gòu),對(duì)所述多路處理器環(huán)境下的共享物理內(nèi)存的塊分 配算法進(jìn)行塊分配優(yōu)化; 根據(jù)修改后的free_area數(shù)據(jù)結(jié)構(gòu),對(duì)塊釋放函數(shù)進(jìn)行塊釋放優(yōu)化。2. 根據(jù)權(quán)利要求1所述的基于多路處理器的共享內(nèi)存的優(yōu)化處理方法,其特征在于: 所述數(shù)據(jù)結(jié)構(gòu)修改包括在所述free_area數(shù)據(jù)結(jié)構(gòu)中增加新的;^66_1181:_(16137數(shù)據(jù) 結(jié)構(gòu)鏈表。3. 根據(jù)權(quán)利要求1或2所述的基于多路處理器的共享內(nèi)存的優(yōu)化處理方法,其特征在 于,所述塊分配優(yōu)化包括: 優(yōu)先在新增的f ree_l i st_de lay數(shù)據(jù)結(jié)構(gòu)鏈表中查找空閑內(nèi)存; 當(dāng)在新增的所述free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中查找到空閑內(nèi)存時(shí),確定完成所述 塊分配優(yōu)化; 當(dāng)在新增的所述free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中未查找到空閑內(nèi)存時(shí),在原始的 free_l i st數(shù)據(jù)結(jié)構(gòu)鏈表中繼續(xù)查找空閑內(nèi)存,在找到空閑內(nèi)存之后,確定完成所述塊分配 優(yōu)化。4. 根據(jù)權(quán)利要求1-3中任一項(xiàng)所述的基于多路處理器的共享內(nèi)存的優(yōu)化處理方法,其 特征在于,所述塊釋放優(yōu)化包括: 將原始的所述free_list數(shù)據(jù)結(jié)構(gòu)鏈表中的伙伴塊合并時(shí)機(jī)轉(zhuǎn)移到新增的所述free_ list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中。5. 基于多路處理器的共享內(nèi)存的優(yōu)化處理裝置,其特征在于,所述優(yōu)化處理裝置包括: 數(shù)據(jù)結(jié)構(gòu)修改模塊,其被配置用于對(duì)多路處理器環(huán)境下的Linux內(nèi)核進(jìn)行數(shù)據(jù)結(jié)構(gòu)修 改,所述數(shù)據(jù)結(jié)構(gòu)修改包括在free_area數(shù)據(jù)結(jié)構(gòu)中新增數(shù)據(jù)結(jié)構(gòu)鏈表; 塊分配優(yōu)化模塊,其被配置用于根據(jù)修改后的free_area數(shù)據(jù)結(jié)構(gòu),對(duì)所述多路處理器 環(huán)境下的共享物理內(nèi)存的塊分配算法進(jìn)行塊分配優(yōu)化; 塊釋放優(yōu)化模塊,其被配置用于根據(jù)修改后的free_area數(shù)據(jù)結(jié)構(gòu),對(duì)塊釋放函數(shù)進(jìn)行 塊釋放優(yōu)化。6. 根據(jù)權(quán)利要求5所述的基于多路處理器的共享內(nèi)存的優(yōu)化處理裝置,其特征在于,所 述數(shù)據(jù)結(jié)構(gòu)修改模塊被配置用于在所述free_area數(shù)據(jù)結(jié)構(gòu)中增加新的free_list_delay 數(shù)據(jù)結(jié)構(gòu)鏈表。7. 根據(jù)權(quán)利要求6所述的基于多路處理器的共享內(nèi)存的優(yōu)化處理裝置,其特征在于,所 述塊分配優(yōu)化模塊被配置用于: 優(yōu)先在新增的f ree_l i st_de lay數(shù)據(jù)結(jié)構(gòu)鏈表中查找空閑內(nèi)存; 當(dāng)在新增的所述free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中查找到空閑內(nèi)存時(shí),確定完成所述 塊分配優(yōu)化; 當(dāng)在新增的所述free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中未查找到空閑內(nèi)存時(shí),在原始的 free_l i st數(shù)據(jù)結(jié)構(gòu)鏈表中繼續(xù)查找空閑內(nèi)存,在找到空閑內(nèi)存之后,確定完成所述塊分配 優(yōu)化。8. 根據(jù)權(quán)利要求6或7所述的基于多路處理器的共享內(nèi)存的優(yōu)化處理方法,其特征在 于,所述塊釋放優(yōu)化模塊被配置用于: 將原始的所述free_list數(shù)據(jù)結(jié)構(gòu)鏈表中的伙伴塊合并時(shí)機(jī)轉(zhuǎn)移到新增的所述free_ list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中。9. 根據(jù)權(quán)利要求1-8中任一項(xiàng)所述的基于多路處理器的共享內(nèi)存的優(yōu)化處理方法,其 特征在于,所述塊分配優(yōu)化的步驟包括: 步驟S301、判斷當(dāng)前內(nèi)存是否充足:若充足,執(zhí)行步驟S302;否則,執(zhí)行步驟S303; 步驟S303、通過調(diào)用守護(hù)進(jìn)程釋放內(nèi)存,返回執(zhí)行步驟S301; 步驟S302、通過階數(shù)order找到相應(yīng)的free_area數(shù)據(jù)結(jié)構(gòu),執(zhí)行步驟S304; 步驟S304、通過迀移類型migratetype確定free_list數(shù)據(jù)結(jié)構(gòu)鏈表,執(zhí)行步驟S305; 步驟S305、判定在free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中是否有空閑內(nèi)存:若在free_list_ delay數(shù)據(jù)結(jié)構(gòu)鏈表中有空閑內(nèi)存,執(zhí)行步驟S306;否則,執(zhí)行步驟S310; 步驟S306、調(diào)用expand函數(shù)刪除已分配出去的內(nèi)存,執(zhí)行步驟S307; 步驟S307、將空閑塊分配到相應(yīng)的進(jìn)程,執(zhí)行步驟S308; 步驟S308、將剩余內(nèi)存塊放入free_list數(shù)據(jù)結(jié)構(gòu)鏈表中,執(zhí)行步驟S309; 步驟S309、返回內(nèi)存塊page地址,結(jié)束所述塊分配優(yōu)化; 步驟S310、判定在free_list數(shù)據(jù)結(jié)構(gòu)鏈表中是否有空閑內(nèi)存:若在free_list數(shù)據(jù)結(jié) 構(gòu)鏈表中有空閑內(nèi)存,執(zhí)行步驟S306;否則,執(zhí)行步驟S311; 步驟S311、階數(shù)order自加,執(zhí)行步驟S312; 步驟S312、判定"current_order〈MAX_ORDER"是否成立:若成立,執(zhí)行步驟S305;否則, 執(zhí)行步驟313; 步驟S313、縮減預(yù)留給系統(tǒng)的內(nèi)存,執(zhí)行步驟S301。10. 根據(jù)權(quán)利要求1-9中任一項(xiàng)所述的基于多路處理器的共享內(nèi)存的優(yōu)化處理方法,其 特征在于,所述塊釋放優(yōu)化的步驟包括: 步驟S401、通過當(dāng)前order確定對(duì)應(yīng)的鏈表的階數(shù),執(zhí)行步驟S402; 步驟S402、通過迀移類型枚舉結(jié)構(gòu)找到相應(yīng)的鏈表,執(zhí)行步驟S403; 步驟S403、通過要釋放的內(nèi)存塊的地址得到該內(nèi)存塊的伙伴塊的地址,執(zhí)行步驟S404; 步驟S404、判定步驟S403中得到的伙伴塊是否空閑:若是,執(zhí)行步驟S405;否則,執(zhí)行步 驟S406; 步驟S406、將空閑內(nèi)存塊釋放到free_l i st鏈表中,結(jié)束所述塊釋放優(yōu)化; 步驟S405、判定該伙伴塊是否在free jist數(shù)據(jù)結(jié)構(gòu)鏈表中:若是,執(zhí)行步驟S407;否 貝丨J,執(zhí)行步驟S408; 步驟S407、將空閑內(nèi)存塊釋放到free_list_delay數(shù)據(jù)結(jié)構(gòu)鏈表中,結(jié)束所述塊釋放優(yōu) 化處理; 步驟S408、在free_l ist_delay數(shù)據(jù)結(jié)構(gòu)鏈表中尋找要釋放的內(nèi)存塊的伙伴塊,執(zhí)行步 驟S409; 步驟S409、合并所述要釋放的內(nèi)存塊及其伙伴塊,并且當(dāng)前階數(shù)order自加,執(zhí)行步驟 S410; 步驟S410、判定"current_order〈MAX_ORDER"是否成立:若成立,執(zhí)行步驟S404;否則, 執(zhí)行步驟411; 步驟S411、將合并后所得的內(nèi)存塊鏈接至current_order對(duì)應(yīng)的free_list鏈表中,結(jié) 束所述塊釋放優(yōu)化。
【文檔編號(hào)】G06F9/50GK106095577SQ201610415936
【公開日】2016年11月9日
【申請(qǐng)日】2016年6月8日 公開號(hào)201610415936.X, CN 106095577 A, CN 106095577A, CN 201610415936, CN-A-106095577, CN106095577 A, CN106095577A, CN201610415936, CN201610415936.X
【發(fā)明人】景維鵬, 王月, 雷海軍, 劉亞秋, 隋正文
【申請(qǐng)人】東北林業(yè)大學(xué)