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