專利名稱:一種基于Linux內(nèi)核頁表替換的內(nèi)存訪問模型追蹤方法
技術(shù)領(lǐng)域:
本發(fā)明涉及操作系統(tǒng)和程序分析領(lǐng)域。
背景技術(shù):
現(xiàn)在,處理器速度與內(nèi)存訪問速度的差距越來越大,己經(jīng)達(dá)到了幾個(gè)數(shù)量級(jí),根據(jù) 最慢的部分決定系統(tǒng)的性能的原則,內(nèi)存系統(tǒng)成為性能的瓶頸,因此亟需優(yōu)化程序的內(nèi) 存行為。不同性質(zhì)的應(yīng)用程序具有不同類型的內(nèi)存訪問模型,優(yōu)化的方式也不一樣。因 此如果我們能確定程序的內(nèi)存訪問模型,就能對(duì)癥下藥,進(jìn)行預(yù)取優(yōu)化。
程序內(nèi)存訪問模型就是程序內(nèi)存行為的描述,現(xiàn)在已有文獻(xiàn)上并沒有明確的定義, 而且現(xiàn)有工具都不能高效的追蹤程序的內(nèi)存訪問,導(dǎo)致了程序性能分析的復(fù)雜性。國外對(duì) 于內(nèi)存訪問模型已經(jīng)進(jìn)行了初步的研究,Junghee等人的研究發(fā)現(xiàn),如果事先知道程序 的內(nèi)存訪問模型,就可以做進(jìn)一步的優(yōu)化,提高程序的性能。Mary等人使用MPAT工具 (a memory pattern analysis tool)分析了三種不同的內(nèi)存訪問模型,以評(píng)估內(nèi)存系統(tǒng) 的設(shè)計(jì)。他根據(jù)MPAT收集到的資料,用來分析軟件、硬件在哪些方面需要改進(jìn)以提高 內(nèi)存系統(tǒng)的性能。其在論文中用高速緩存命中率隨時(shí)間的變化這種形式來描述內(nèi)存訪問 模型。而且其未考慮多處理器、多核系統(tǒng)上,多線程程序的內(nèi)存訪問模型。Jonathan等 人則利用Chameleon框架軟件包里的工具捕獲應(yīng)用程序里的簡(jiǎn)明內(nèi)存簽名(memory signature),并產(chǎn)生人工內(nèi)存地址痕跡來模擬這個(gè)簽名。Chameleon同時(shí)模擬空間和時(shí) 間局部性,能提供精確的人工痕跡。在現(xiàn)有的各種不同內(nèi)存層次上,這個(gè)痕跡的cache 命中率和原來程序基本一樣。他將Chameleon應(yīng)用在高性能(HPC)程序上,通過使用抽 樣技術(shù)來捕獲到全面的、并行程序的內(nèi)存簽名,而且僅僅產(chǎn)生5倍的減速。國外也實(shí)現(xiàn) 了一些內(nèi)存訪問地址追蹤工具,如valgrind等,它們的實(shí)現(xiàn)并不需要更改Linux內(nèi)核, 而且追蹤的是內(nèi)存訪問地址,而不是頁面,這樣對(duì)于高性能計(jì)算程序,獲得的統(tǒng)計(jì)數(shù)據(jù) 量會(huì)出現(xiàn)存儲(chǔ)空間爆炸的情況。
本發(fā)明中的內(nèi)存訪問模型是指程序的虛擬內(nèi)存頁面訪問順序,以及每個(gè)頁面訪問的 持續(xù)時(shí)間(這樣就能估算出每個(gè)頁面的訪問次數(shù))。獲取了程序的內(nèi)存訪問模型后就能指 導(dǎo)對(duì)程序的內(nèi)存行為進(jìn)行優(yōu)化。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是克服現(xiàn)有技術(shù)不足,提出一種基于Linux內(nèi)核進(jìn)程頁 表替換的內(nèi)存訪問模型追蹤方法,該輕量級(jí)的追蹤方法以頁面地址為追蹤粒度,具有速度快,產(chǎn)生的追蹤數(shù)據(jù)量小的特點(diǎn),適合于高性能計(jì)算程序的內(nèi)存追蹤需求。
本發(fā)明采用的技術(shù)方案基于Linux內(nèi)核進(jìn)程頁表替換的內(nèi)存訪問模型追蹤方法, 其特征在于包括以下步驟
(1) 引導(dǎo)程序創(chuàng)建出 一個(gè)子進(jìn)程來執(zhí)行要統(tǒng)計(jì)內(nèi)存訪問模型的目標(biāo)程序,在目標(biāo)程序執(zhí)行 之前,父進(jìn)程通過向Linux內(nèi)核添加的系統(tǒng)調(diào)用a來啟動(dòng)統(tǒng)計(jì)過程,并將要統(tǒng)計(jì)的目標(biāo)進(jìn)程 號(hào)(—mt一pid—)傳遞進(jìn)內(nèi)核;
(2) 另外申請(qǐng)一個(gè)頁表,稱之為假頁表,假頁表中對(duì)于非代碼段的頁面只保留一項(xiàng),這樣 對(duì)非代碼段的每次內(nèi)存訪問都會(huì)產(chǎn)生缺頁中斷,除非一直訪問某個(gè)地址;在切換到目標(biāo)進(jìn)程 的時(shí)候?qū)⒓夙摫淼牡刂穫鬟f給cr3寄存器,使操作系統(tǒng)與假頁表建立聯(lián)系;
(3) 目標(biāo)進(jìn)程開始執(zhí)行,由于使用了假頁表,目標(biāo)程序的每次訪問內(nèi)存都會(huì)觸發(fā)缺頁中斷, 在處理缺頁中斷時(shí),記錄訪問的內(nèi)存頁號(hào)和訪問次數(shù),即內(nèi)存訪問模型;通過向Linux內(nèi)核 添加的系統(tǒng)調(diào)用c將內(nèi)存訪問模型數(shù)據(jù)取出到用戶態(tài);
(4) 目標(biāo)進(jìn)程執(zhí)行完后,通過向Linux內(nèi)核添加的調(diào)用系統(tǒng)調(diào)用b結(jié)束統(tǒng)計(jì)過程。 在所述步驟(l)中系統(tǒng)調(diào)用a為向Linux內(nèi)核中添加的新系統(tǒng)調(diào)用,用來啟動(dòng)統(tǒng)計(jì)過程和
變量初始化工作;系統(tǒng)調(diào)用a首先判斷我們要統(tǒng)計(jì)的目標(biāo)進(jìn)程號(hào)Cmt』idJ是否已經(jīng)設(shè)置, 如果己經(jīng)設(shè)置,說明另一個(gè)內(nèi)存訪問模型的統(tǒng)計(jì)正在進(jìn)行,則啟動(dòng)失敗;如果未設(shè)置,則設(shè) 置目標(biāo)進(jìn)程號(hào)(jnt一pid一)為引導(dǎo)程序傳遞給系統(tǒng)調(diào)用a的進(jìn)程號(hào);然后系統(tǒng)調(diào)用a初始化內(nèi) 存訪問模型追蹤所需要的變量并創(chuàng)建一個(gè)假頁表,將頁表地址(_mt_pgd_)設(shè)置為假頁表的地 址,同時(shí)備份真頁表的地址。
在所述步驟(2)中假頁表與真頁表的協(xié)作方式為在假頁表每次觸發(fā)缺頁中斷后,首先通 過真頁表判斷是否真正缺頁若不缺頁,則將真頁表中保存的物理頁信息復(fù)制到假頁表中; 若缺頁,則將要訪問的頁面加載入物理內(nèi)存中,同時(shí)將真頁表中對(duì)應(yīng)項(xiàng)的值復(fù)制到假頁表中; 最后將離開的頁面在假頁表中的表項(xiàng)值清零;這樣,假頁表中只有當(dāng)前進(jìn)程所處理的頁面有 對(duì)應(yīng)的物理頁信息。
在所述步驟(3)中系統(tǒng)調(diào)用c為向Linux內(nèi)核中添加的新系統(tǒng)調(diào)用,引導(dǎo)程序通過不斷調(diào) 用系統(tǒng)調(diào)用c將追蹤到的內(nèi)存訪問模型數(shù)據(jù)取出到用戶態(tài)。
在所述步驟(4)中系統(tǒng)調(diào)用b為向Lirmx內(nèi)核中添加的新系統(tǒng)調(diào)用,系統(tǒng)調(diào)用b負(fù)責(zé)終止 統(tǒng)計(jì)過程;其主要有2個(gè)工作, 一是將我們要統(tǒng)計(jì)的目標(biāo)進(jìn)程號(hào)Cmt—pidj歸0, 二是釋放 已經(jīng)沒用的假頁表。
本發(fā)明與現(xiàn)有技術(shù)相比的有益效果
(l)本發(fā)明以頁面為追蹤粒度,具有追蹤速度快的特點(diǎn),可以追蹤高性能計(jì)算等長(zhǎng)時(shí)間運(yùn) 行的程序,為程序優(yōu)化提供指導(dǎo)。(2)本發(fā)明由于采用頁面為粒度,還具有追蹤出的數(shù)據(jù)量小的特點(diǎn)。
圖1為本發(fā)明向Linux內(nèi)核添加的系統(tǒng)調(diào)用a的工作流程圖; 圖2為本發(fā)明的引導(dǎo)程序的工作流程圖; 圖3為本發(fā)明的Linux內(nèi)核缺頁中斷函數(shù)調(diào)用關(guān)系圖; 圖4為本發(fā)明的Linux內(nèi)核缺頁中斷函數(shù)代碼示例; 圖5為本發(fā)明的真、假頁表交互邏輯圖; 圖6為本發(fā)明的缺頁中斷處理工作流程圖。
具體實(shí)施例方式
本發(fā)明采用如下步驟 (l)主要變量設(shè)置
//目標(biāo)進(jìn)程的pid,為o表示沒有啟動(dòng) pid一t _mt—pid一;
〃是否已將假頁表的首地址傳給cr3寄存器 bool _mt_tran —cr3—;
〃假頁表的首地址 pgd—t * —mt_pgd—;
//用來備份真頁表的首地址 ■pgd—t永 —mt_gd_pgd—;
〃上次觸發(fā)缺頁中斷的地址 unsigned long—l_mt—add—; (2)添加系統(tǒng)調(diào)用
本發(fā)明向Linux內(nèi)核中添加了 3個(gè)新系統(tǒng)調(diào)用,系統(tǒng)調(diào)用a用來啟動(dòng)統(tǒng)計(jì)過程,系 統(tǒng)調(diào)用b用來結(jié)束統(tǒng)計(jì)過程,系統(tǒng)調(diào)用c用來將追蹤到的內(nèi)存訪問模型取出到用戶態(tài)。 這樣就可以在需要的時(shí)候?qū)μ囟ǖ哪繕?biāo)進(jìn)程啟動(dòng)統(tǒng)計(jì)過程,在不需要的時(shí)候結(jié)束統(tǒng)計(jì)過 程,最大限度的減少對(duì)原來系統(tǒng)運(yùn)行的影響。
其中系統(tǒng)調(diào)用a負(fù)責(zé)啟動(dòng)統(tǒng)計(jì)過程,如圖1所示。它首先判斷我們要統(tǒng)計(jì)的目標(biāo)進(jìn) 程號(hào)(—mt_pid—)是否己經(jīng)設(shè)置。如果已經(jīng)設(shè)置,說明另一個(gè)內(nèi)存訪問模型的統(tǒng)計(jì)正在進(jìn) 行,則啟動(dòng)失??;如果未設(shè)置,則設(shè)置_加—pid—為引導(dǎo)程序傳遞給系統(tǒng)調(diào)用a的進(jìn)程號(hào)。 然后系統(tǒng)調(diào)用a初始化內(nèi)存訪問模型追蹤所需要的變量并創(chuàng)建一個(gè)假頁表,將頁表地址 (_mt—pgd—)設(shè)置為假頁表的地址,同時(shí)備份真頁表的地址(—mt—gd—pgd_)。若假頁表創(chuàng) 建失敗,則無效返回。系統(tǒng)調(diào)用b負(fù)責(zé)終止統(tǒng)計(jì)過程。其主要有2個(gè)工作, 一是將我們要統(tǒng)計(jì)的進(jìn)程號(hào) (一mt一pid一)歸0, 二是釋放已經(jīng)沒用的假頁表。
系統(tǒng)調(diào)用c被引導(dǎo)程序調(diào)用,將從內(nèi)核獲取的內(nèi)存訪問模型數(shù)據(jù)不斷傳送到用戶態(tài)。 得到的內(nèi)存訪問模型,包括內(nèi)存訪問的地址和訪問持續(xù)時(shí)間,可以用來指導(dǎo)預(yù)取、I/O 等優(yōu)化。
(3) 引導(dǎo)程序
其過程如圖2所示,引導(dǎo)程序創(chuàng)建出一個(gè)子進(jìn)程來執(zhí)行要統(tǒng)計(jì)內(nèi)存訪問模型的目標(biāo) 程序,在目標(biāo)程序執(zhí)行之前,父進(jìn)程通過系統(tǒng)調(diào)用a來啟動(dòng)統(tǒng)計(jì)過程,并將要統(tǒng)計(jì)的目 標(biāo)進(jìn)程號(hào)(_mt—pid—)傳遞進(jìn)內(nèi)核。
(4) 將操作系統(tǒng)與假頁表建立關(guān)聯(lián),使之依靠假頁表進(jìn)行地址轉(zhuǎn)換 每個(gè)進(jìn)程都有自己的頁表,在進(jìn)程切換時(shí)會(huì)設(shè)置cr3寄存器的值告知MMU新進(jìn)程的
頁表首地址。因此在進(jìn)程切換時(shí),將假頁表的首地址傳給cr3即可將MMU與假頁表建 立聯(lián)系。對(duì)Linux內(nèi)核來說,就是在context—switch()函數(shù)調(diào)用switch—mm()函數(shù)之前 進(jìn)行判斷,如果要切換的進(jìn)程號(hào)是我們要統(tǒng)計(jì)的目標(biāo)程序,則將使用假頁表,否則就還 用真頁表。
(5) 缺頁中斷處理流程
這是本發(fā)明的重要部分,主要對(duì)Linux內(nèi)核的handle—mnufault()函數(shù)進(jìn)行修改。 其相關(guān)函數(shù)在Linux內(nèi)核中的調(diào)用關(guān)系如圖3所示,代碼調(diào)用示例如圖4所示。因?yàn)橐?經(jīng)使用本發(fā)明自己的假頁表,因此基本每次內(nèi)存訪問都產(chǎn)生缺頁中斷。只有在當(dāng)前進(jìn)程 是目標(biāo)進(jìn)程且頁表巳經(jīng)替換(—mt—tran —cr3—)的情況下,才進(jìn)行處理。更改過的 handlejiim一fault()函數(shù)每次處理缺頁中斷時(shí),首先判斷該缺頁地址是否在真頁表中缺 頁。如果真的缺頁,則調(diào)用原有的缺頁處理函數(shù)handle—pte—fault()來獲取物理內(nèi)存頁 面。之后判斷頁面是否為非代碼段頁面,如果是的話,也即我們要統(tǒng)計(jì)的內(nèi)存訪問行為。 因此要記錄其內(nèi)存訪問地址和系統(tǒng)時(shí)間進(jìn)行統(tǒng)計(jì),如果程序上次訪問的地址—1—mt—add— 為0,則這是第一次頁面訪問,只需設(shè)定_1—mt—add—的值為本次頁面訪問的值;如果 —1—mt—adcL不為0,則將此地址在假頁表中的值清0,并設(shè)定一l一mt—adcL為本次頁面訪 問的值,最后將本次訪問地址在真頁表中的值復(fù)制到假頁表中去。真、假頁表的邏輯關(guān) 系如圖5所示,本發(fā)明具體的缺頁中斷處理流程如圖6所示。
(6) 目標(biāo)進(jìn)程開始執(zhí)行后,每次內(nèi)存訪問都會(huì)觸發(fā)缺頁中斷,缺頁中斷的頁號(hào)和系統(tǒng) 時(shí)間將被記錄,引導(dǎo)程序通過調(diào)用系統(tǒng)調(diào)用c不斷將內(nèi)存訪問模型數(shù)據(jù)取出到用戶態(tài), 待目標(biāo)程序執(zhí)行完畢之后,我們的統(tǒng)計(jì)也獲得了相應(yīng)的內(nèi)存訪問數(shù)據(jù)。這時(shí)候,父進(jìn)程 通過調(diào)用系統(tǒng)諷甩b來結(jié)束統(tǒng)計(jì)過程。
權(quán)利要求
1.一種基于Linux內(nèi)核進(jìn)程頁表替換的內(nèi)存訪問模型追蹤方法,其特征在于包括以下步驟(1)引導(dǎo)程序創(chuàng)建出一個(gè)子進(jìn)程來執(zhí)行要統(tǒng)計(jì)內(nèi)存訪問模型的目標(biāo)程序,在目標(biāo)程序執(zhí)行之前,父進(jìn)程通過向Linux內(nèi)核添加的系統(tǒng)調(diào)用a來啟動(dòng)統(tǒng)計(jì)過程,并將要統(tǒng)計(jì)的目標(biāo)進(jìn)程號(hào)傳遞進(jìn)內(nèi)核;(2)另外申請(qǐng)一個(gè)頁表,稱之為假頁表,假頁表中對(duì)于非代碼段的頁面只保留一項(xiàng),這樣對(duì)非代碼段的每次內(nèi)存訪問都會(huì)產(chǎn)生缺頁中斷,除非一直訪問某個(gè)地址;在切換到目標(biāo)進(jìn)程的時(shí)候?qū)⒓夙摫淼牡刂穫鬟f給cr3寄存器,使操作系統(tǒng)與假頁表建立聯(lián)系;(3)目標(biāo)進(jìn)程開始執(zhí)行,由于使用了假頁表,目標(biāo)程序的每次訪問內(nèi)存都會(huì)觸發(fā)缺頁中斷,在處理缺頁中斷時(shí),記錄訪問的內(nèi)存頁號(hào)和訪問次數(shù),即內(nèi)存訪問模型;通過向Linux內(nèi)核添加的系統(tǒng)調(diào)用c將內(nèi)存訪問模型數(shù)據(jù)取出到用戶態(tài);(4)目標(biāo)進(jìn)程執(zhí)行完后,通過向Linux內(nèi)核添加的調(diào)用系統(tǒng)調(diào)用b結(jié)束統(tǒng)計(jì)過程。
2. 根據(jù)權(quán)利要求1所述的一種基于Lirmx內(nèi)核進(jìn)程頁表替換的內(nèi)存訪問模型追蹤方法, 其特征在于在所述步驟(l)中系統(tǒng)調(diào)用a為向Linux內(nèi)核中添加的新系統(tǒng)調(diào)用,用來啟動(dòng) 統(tǒng)計(jì)過程和變量初始化工作;系統(tǒng)調(diào)用a首先判斷我們要統(tǒng)計(jì)的目標(biāo)進(jìn)程號(hào)是否已經(jīng)設(shè)置, 如果已經(jīng)設(shè)置,說明另一個(gè)內(nèi)存訪問模型的統(tǒng)計(jì)正在進(jìn)行,則啟動(dòng)失??;如果未設(shè)置,則設(shè) 置目標(biāo)進(jìn)程號(hào)為引導(dǎo)程序傳遞給系統(tǒng)調(diào)用a的進(jìn)程號(hào);然后系統(tǒng)調(diào)用a初始化內(nèi)存訪問模型 追蹤所需要的變量并創(chuàng)建一個(gè)假頁表,將頁表地址設(shè)置為假頁表的地址,同時(shí)備份真頁表的 地址。
3. 根據(jù)權(quán)利要求1所述的一種基于Linux內(nèi)核進(jìn)程頁表替換的內(nèi)存訪問模型追蹤方法, 其特征在于在所述步驟(2)中假頁表與真頁表的協(xié)作方式為在假頁表每次觸發(fā)缺頁中斷 后,首先通過真頁表判斷是否真正缺頁若不缺頁,則將真頁表中保存的物理頁信息復(fù)制到 假頁表中;若缺頁,則將要訪問的頁面加載入物理內(nèi)存中,同時(shí)將真頁表中對(duì)應(yīng)項(xiàng)的值復(fù)制 到假頁表中;最后將離開的頁面在假頁表中的表項(xiàng)值清零;這樣,假頁表中只有當(dāng)前進(jìn)程所 處理的頁面有對(duì)應(yīng)的物理頁信息。
4. 根據(jù)權(quán)利要求1所述的一種基于Linux內(nèi)核進(jìn)程頁表替換的內(nèi)存訪問模型追蹤方法, 其特征在于在所述步驟(3)中系統(tǒng)調(diào)用c為向Linux內(nèi)核中添加的新系統(tǒng)調(diào)用,引導(dǎo)程序 通過不斷調(diào)用系統(tǒng)調(diào)用c將追蹤到的內(nèi)存訪問模型數(shù)據(jù)取出到用戶態(tài)。
5. 根據(jù)權(quán)利要求1所述的一種基于Linux內(nèi)核進(jìn)程頁表替換的內(nèi)存訪問模型追蹤方法, 其特征在于在所述步驟(4)中系統(tǒng)調(diào)用b為向Linux內(nèi)核中添加的新系統(tǒng)調(diào)用,系統(tǒng)調(diào)用b 負(fù)責(zé)終止統(tǒng)計(jì)過程;其主要有2個(gè)工作, 一是將我們要統(tǒng)計(jì)的目標(biāo)進(jìn)程號(hào)歸O, 二是釋放已 經(jīng)沒用的假頁表。
全文摘要
本發(fā)明是一種基于Linux內(nèi)核頁表替換的內(nèi)存訪問模型追蹤方法,隨著處理器速度與內(nèi)存訪問速度的差距越來越大,內(nèi)存系統(tǒng)成為系統(tǒng)性能的瓶頸,不同性質(zhì)的應(yīng)用程序具有不同類型的內(nèi)存訪問模型,對(duì)內(nèi)存行為的優(yōu)化方式也不一樣,而現(xiàn)有工具都不能高效的追蹤程序的內(nèi)存訪問,導(dǎo)致內(nèi)存優(yōu)化的復(fù)雜性。本發(fā)明應(yīng)用在Linux系統(tǒng)上,通過修改Linux內(nèi)核,替換目標(biāo)進(jìn)程的頁表。新的頁表對(duì)于非代碼段頁面只保存一項(xiàng),這樣目標(biāo)進(jìn)程每次訪問內(nèi)存時(shí)都會(huì)發(fā)生缺頁中斷,在內(nèi)核處理缺頁中斷時(shí),記錄相應(yīng)的地址,就可以追蹤特定目標(biāo)進(jìn)程的虛擬頁面訪問順序,即程序的內(nèi)存訪問模型。本發(fā)明具有輕量級(jí)的特點(diǎn),追蹤內(nèi)存訪問速度快、追蹤出的數(shù)據(jù)量小,而且不影響操作系統(tǒng)中其它進(jìn)程的正常運(yùn)行。使用本發(fā)明追蹤出內(nèi)存訪問模型,可以指導(dǎo)程序的內(nèi)存行為優(yōu)化。
文檔編號(hào)G06F11/34GK101604283SQ200910086939
公開日2009年12月16日 申請(qǐng)日期2009年6月11日 優(yōu)先權(quán)日2009年6月11日
發(fā)明者李子星, 政 王, 雷 王 申請(qǐng)人:北京航空航天大學(xué)