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