專利名稱:一種實(shí)現(xiàn)操作系統(tǒng)核心代碼段多副本運(yùn)行的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)操作系統(tǒng)軟件技術(shù)領(lǐng)域,具體涉及一種在NUMA體系結(jié)構(gòu)計(jì) 算機(jī)上,實(shí)現(xiàn)操作系統(tǒng)核心代碼段多副本運(yùn)行的方法。 技術(shù)背景目前對于多處理器計(jì)算機(jī)系統(tǒng)的設(shè)計(jì)而言,通常有以下三種體系結(jié)構(gòu)可以采 用對稱多處理器SMP模式、大規(guī)模并行處理器MPP模式和非一致存儲器訪問NUMA 模式。SMP模式將多個(gè)處理器與一個(gè)集中的存儲器相連。在SMP模式下,所有處理器 都可以訪問同一個(gè)系統(tǒng)物理存儲器。SMP系統(tǒng)通常只運(yùn)行操作系統(tǒng)的一個(gè)副本。因 此SMP系統(tǒng)有時(shí)也被稱為一致存儲器訪問(UMA)結(jié)構(gòu)體系, 一致性意指無論在什 么時(shí)候,處理器只能為內(nèi)存的每個(gè)數(shù)據(jù)保持或共享唯一一個(gè)數(shù)值。SMP的缺點(diǎn)是可 伸縮性有限,因?yàn)樵诖鎯ζ鹘涌谶_(dá)到飽和的時(shí)候,增加處理器并不能獲得更高的 性能。SMP體系結(jié)構(gòu)如附圖1所示。MPP模式則是一種分布式存儲器模式,能夠?qū)⒏嗟奶幚砥骷{入一個(gè)系統(tǒng)的存 儲器。 一個(gè)分布式存儲器模式具有多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都有自己的存儲器,可以 配置為SMP模式,也可以配置為非SMP模式。單個(gè)的節(jié)點(diǎn)相互連接起來就形成了 一個(gè)總系統(tǒng)。與單一SMP模式相比,在SMP模式中,數(shù)據(jù)一致性是由硬件專門管 理的,這樣做比較容易實(shí)現(xiàn),但成本較高;在MPP模式中,節(jié)點(diǎn)之間的一致性是 由軟件來管理,因此,它的速度相對較慢,但成本卻低得多。醒P體系結(jié)構(gòu)如圖2 所示。NUMA模式也采用了分布式存儲器模式,不同的是所有節(jié)點(diǎn)中的處理器都可以 訪問全部的系統(tǒng)物理存儲器。每個(gè)處理器訪問本節(jié)點(diǎn)內(nèi)的存儲器所需要的時(shí)間, 比訪問某些遠(yuǎn)程節(jié)點(diǎn)內(nèi)的存儲器所花的時(shí)間要少。即,訪問不同存儲器的時(shí)間是 不一致的,因此這種模式被稱為"而MA"(非一致存儲器訪問)。如附圖3所示, 我們定義CPU和直接連接在其上的物理內(nèi)存之間的關(guān)系為"親近的",與需要經(jīng) 過其它CPU "間接"訪問的物理內(nèi)存之間的關(guān)系是"非親近的"。相應(yīng)的,我們定 義CPU直接連接的物理內(nèi)存為"本地內(nèi)存",或"局部內(nèi)存",其他的物理內(nèi)存 為"全局內(nèi)存"。NUMA既保持了 SMP模式單一操作系統(tǒng)副本、簡便的應(yīng)用程序編 程模式以及易于管理的特點(diǎn),又繼承了MPP模式的可擴(kuò)充性,可以有效地?cái)U(kuò)充系統(tǒng)的規(guī)模。因此,面向事務(wù)處理的大型計(jì)算機(jī)系統(tǒng)多來用NUMA模式。在多CPU的計(jì)算機(jī)系統(tǒng)中,每個(gè)CPU都可以進(jìn)入核心態(tài)執(zhí)行。現(xiàn)在的計(jì)算機(jī)系 統(tǒng),包括X86、 IA64、 Power、 SPARC等,都采用中斷、異?;蛘呦到y(tǒng)調(diào)用門的方 式陷入核心。對于SMP架構(gòu)的多CPU系統(tǒng)中,會按照負(fù)載均衡的原則將進(jìn)程分布 在不同的CPU上;當(dāng)某個(gè)進(jìn)程出現(xiàn)缺頁故障,或者系統(tǒng)調(diào)用時(shí),需要從用戶態(tài)進(jìn) 入核心態(tài),此時(shí)系統(tǒng)會選擇該進(jìn)程當(dāng)前運(yùn)行的CPU來執(zhí)行核心代碼;當(dāng)出現(xiàn)硬件 中斷時(shí),系統(tǒng)會按照某種策略選擇一個(gè)CPU來執(zhí)行核心中的中斷處理過程,譬如 選擇當(dāng)前最空閑的CPU。選擇進(jìn)程當(dāng)前運(yùn)行的CPU執(zhí)行核心代碼,而不是固定某個(gè)CPU執(zhí)行核心代碼的 優(yōu)點(diǎn)是 可以減少CPU之間進(jìn)行切換的開銷;*現(xiàn)代的操作系統(tǒng)核心都是支持重復(fù)陷入的,即可以并行運(yùn)行。允許多個(gè)CPU 陷入核心,可以有效提高CPU的利用率。NUMA體系的計(jì)算機(jī)系統(tǒng)略微有所不同。由于在NUMA體系下,CPU訪問非親近 的物理內(nèi)存,和訪問親近的物理內(nèi)存的時(shí)間是不一致的,而且這種時(shí)間延遲往往 是比較大的(通常在幾倍)。因此,在NUMA體系計(jì)算機(jī)上運(yùn)行的操作系統(tǒng)通常會 將一個(gè)進(jìn)程綁定在某個(gè)CPU上,并且盡量保證該進(jìn)程所用的物理內(nèi)存與該CPU親 近。這樣可以最大程度避免進(jìn)程出現(xiàn)跨CPU的物理內(nèi)存訪問,降低訪存延遲,提 高系統(tǒng)運(yùn)行效率。而操作系統(tǒng)核心的情況與用戶進(jìn)程不同。在傳統(tǒng)的NUMA計(jì)算機(jī) 系統(tǒng)中,只運(yùn)行一個(gè)操作系統(tǒng)核心副本。即,操作系統(tǒng)核心的代碼段在物理內(nèi)存 中只存在一個(gè)副本,而且這個(gè)副本通常只會在某個(gè)CPU親近的物理內(nèi)存中。這是 與傳統(tǒng)的UNIX類操作系統(tǒng)的體系結(jié)構(gòu)設(shè)計(jì)相關(guān)的。如附圖4所示,以只有兩個(gè)CPU的NUMA結(jié)構(gòu)為例,說明了傳統(tǒng)情況下,分別 在兩個(gè)CPU上運(yùn)行的進(jìn)程,其用戶態(tài)地址空間和核心態(tài)地址空間,與機(jī)器物理內(nèi) 存之間的映射關(guān)系。不同進(jìn)程的用戶態(tài)空間(包括代碼和數(shù)據(jù))被映射到了不同 的物理地址(也有可能是相同的物理地址,譬如共享庫、共享內(nèi)存等。實(shí)際上在 NUMA體系下,為了降低訪存延遲,共享庫等也應(yīng)盡量局部化),而核心態(tài)空間則 被映射到相同的物理地址,譬如,CPU1的親近物理內(nèi)存中。當(dāng)系統(tǒng)發(fā)生中斷、異?;蛘呦到y(tǒng)調(diào)用,需要從用戶態(tài)陷入到核心態(tài)的時(shí)候,傳 統(tǒng)系統(tǒng)有兩種方法可以選擇方法l:當(dāng)發(fā)生系統(tǒng)調(diào)用或缺頁異常等,從用戶態(tài)陷入核心時(shí),選擇當(dāng)前進(jìn)程 所在的CPU執(zhí)行核心代碼;或者當(dāng)發(fā)生硬件中斷時(shí),選擇該硬件連接的CPU執(zhí)行 中斷處理例程;方法2:選擇核心代碼段所在物理內(nèi)存親近的CPU作為核心的執(zhí)行者,如在附 圖4的例子中,每次都是選擇CPU1執(zhí)行核心代碼。方法1是SMP體系也會采用的方法(不太相同的是,對于硬件中斷,所有CPU 都是對等的,選擇任何一個(gè)都是可以的),優(yōu)點(diǎn)也是同樣的,但是卻有一個(gè)很大 的缺點(diǎn)就是除了核心代碼段所在物理內(nèi)存親近的CPU之外,其他CPU訪問核心 代碼段都是存在延遲的。如附圖4所示,CPU2訪問核心代碼段就比訪問本地內(nèi)存 要慢很多。而一個(gè)真實(shí)的NUMA系統(tǒng)往往有16個(gè)、32個(gè)以上,甚至多至幾千個(gè)CPU, 即絕大部分CPU訪問核心代碼段都是全局訪問,訪存延遲是很大的;特別是,當(dāng) 多數(shù)CPU并行進(jìn)入核心態(tài)時(shí),它們對核心代碼段的訪問,都需要經(jīng)過CPU1 "中轉(zhuǎn)" 到同樣的物理內(nèi)存地址,CPU1的負(fù)載會急劇加大,效率下降也非常明顯。雖然我 們通過CPU硬件的"緩沖區(qū)"(如安騰II處理器,采用Ll、 L2、 L3三級cache), 減少全局訪問物理內(nèi)存的次數(shù)。但是CPU的cache,相對于核心代碼段,總是小了 很多,而且不可能完全用于存放核心代碼段。采用方法2可以避免CPU訪問非親近的物理內(nèi)存,減小訪存延遲,但是前面提 到的不需要CPU切換、CPU并行運(yùn)行等優(yōu)點(diǎn)也就不存在了。對于16個(gè)以上CPU的 NUMA系統(tǒng)而言,只有1個(gè)CPU運(yùn)行核心代碼所帶來的"低效"也是顯而易見的。因此,無論是方法l,還是方法2,都無法同時(shí)兼顧提高CPU并行度和提高訪 存效率這兩個(gè)目標(biāo),從而使系統(tǒng)的整體性能下降。本發(fā)明針對傳統(tǒng)方法的弊端, 釆用在多個(gè)CPU的本地內(nèi)存中建立核心代碼的多個(gè)副本的方法,既能夠?qū)崿F(xiàn)CPU 的并行運(yùn)行,減少CPU切換次數(shù),又可以避免CPU對核心代碼段的全局訪問,提 高系統(tǒng)訪存效率,從能有效提升系統(tǒng)的整體性能。1、 發(fā)明內(nèi)容本發(fā)明針對傳統(tǒng)NUMA系統(tǒng)下的操作系統(tǒng)無法兼顧C(jī)PU并行度和訪存效率的缺 點(diǎn),設(shè)計(jì)了在多個(gè)CPU的本地內(nèi)存中,建立核心代碼段的多個(gè)副本的方法,簡單 來講,就是核心代碼段的局部化;當(dāng)系統(tǒng)需要陷入核心態(tài)時(shí),可以選擇當(dāng)前進(jìn)程 所運(yùn)行的CPU,或者發(fā)生中斷的硬件親近的CPU運(yùn)行核心代碼;CPU在運(yùn)行核心的 過程中,可以直接訪問本地內(nèi)存中的核心代碼段數(shù)據(jù),從而提高了訪問內(nèi)存的效 率,達(dá)到提升系統(tǒng)整體性能的目的。為了實(shí)現(xiàn)以上目的,本發(fā)明設(shè)計(jì)的操作系統(tǒng)代碼段多副本運(yùn)行的方法包含以下 步驟1)多CPU的NUMA體系結(jié)構(gòu)的計(jì)算機(jī)啟動(dòng)時(shí),系統(tǒng)固件(如BIOS)指定系統(tǒng)中 的某個(gè)CPU (以下記為CPU0),將操作系統(tǒng)核心代碼加載(Load)到CPUO的本地 內(nèi)存中,并使用該CPU開始運(yùn)行核心初始化代碼;2) CPU0在完成操作系統(tǒng)核心初始化后,喚醒其他所有CPU,并在CPUO上啟動(dòng) 系統(tǒng)的第一個(gè)用戶態(tài)進(jìn)程(以下記為進(jìn)程O),將控制權(quán)交給進(jìn)程O;此時(shí),其他 所有CPU進(jìn)入idle狀態(tài);
3) 當(dāng)首次有進(jìn)程(記為進(jìn)程nO)被調(diào)度到某個(gè)CPU (記為CPUn)上運(yùn)行時(shí), 在CPUn的本地內(nèi)存中分配一段內(nèi)存,將核心代碼段復(fù)制到該段內(nèi)存中;并為進(jìn)程 n0建立新的核心代碼段頁表,使其指向CPUn的這段內(nèi)存中,形成如附圖5所示的 情形;(實(shí)際上,不只是核心代碼段,進(jìn)程nO的用戶態(tài)空間也盡量會被映射到CPUn 的本地內(nèi)存中)
4) 在CPUn的本地內(nèi)存中分配一段內(nèi)存,建立中斷向量表的副本,其中所有的 中端向量地址均指向本地核心代碼段副本中的中斷處理函數(shù);并修改CPUn的中端 向量入口寄存器,使其指向本地中斷向量表副本的物理地址;
5) 對于使用系統(tǒng)調(diào)用門等方法陷入核心的硬件,還需要參照中斷向量表的處 理方式,建立系統(tǒng)調(diào)用入口表的本地副本,并修改CPUn的入口寄存器;
6) 當(dāng)再次有進(jìn)程(記為進(jìn)程nm)被調(diào)度到CPUn上運(yùn)行時(shí),只需要修改進(jìn)程 nm的核心代碼段頁表,使其指向CPUn中的核心代碼段副本。
此后,當(dāng)系統(tǒng)因?yàn)橛脩暨M(jìn)程的系統(tǒng)調(diào)用、軟中斷、異?;蛘哂布袛噙M(jìn)入核心 態(tài)時(shí),CPU會根據(jù)中斷向量表的內(nèi)容,自動(dòng)調(diào)用本地內(nèi)存中的核心代碼執(zhí)行,從而 實(shí)現(xiàn)核心代碼段的局部化。
本發(fā)明的有益效果是在NUMA體系結(jié)構(gòu)的多CPU計(jì)算機(jī)中,既能夠充分發(fā)揮 多CPU并行執(zhí)行核心所帶來的并行性的提高,又能夠避免傳統(tǒng)操作系統(tǒng)核心需要 頻繁訪問全局內(nèi)存或非本地I/O所帶來的訪存損失,有效提高了系統(tǒng)總體處理性 能。
附圖1為SMP體系結(jié)構(gòu)示意圖; 附圖2為醒P體系結(jié)構(gòu)示意圖; 附圖3為NUMA體系結(jié)構(gòu)示意附圖4為傳統(tǒng)的針對NUMA體系結(jié)構(gòu)下操作系統(tǒng)中進(jìn)程地址空間的映射方法; 附圖5為本發(fā)明的方法針對NUMA體系結(jié)構(gòu)的操作系統(tǒng)中進(jìn)程地址空間的映射 方法。
具體實(shí)施例方式
下面參照附圖,對本發(fā)明的內(nèi)容以一個(gè)具體實(shí)例來描述其實(shí)現(xiàn)方式。 如附圖5所示,以兩個(gè)CPU所組成的NUMA體系的計(jì)算機(jī)為例。需要對現(xiàn)有操
作系統(tǒng)核心的進(jìn)程調(diào)度和存儲管理模塊進(jìn)行修改,增加以下處理步驟
60) 計(jì)算機(jī)啟動(dòng)時(shí),系統(tǒng)固件(如BIOS)指定系統(tǒng)中的某個(gè)CPU(以下記為CPUO), 將操作系統(tǒng)核心代碼加載(Load)到CPUO的本地內(nèi)存中,并使用該CPU開始運(yùn)行 核心初始化代碼;
1) 操作系統(tǒng)核心在完成初始化后,喚醒其他所有CPU,并在CPUO上啟動(dòng)系統(tǒng) 的第一個(gè)用戶態(tài)進(jìn)程(以下記為進(jìn)程0),并將控制權(quán)交給進(jìn)程0;此時(shí),其他所 有CPU進(jìn)入idle狀態(tài);
2) 當(dāng)操作系統(tǒng)核心發(fā)現(xiàn)首次有進(jìn)程(記為進(jìn)程n0)被調(diào)度到某個(gè)CPU (記為 CPUn)上運(yùn)行時(shí),進(jìn)程調(diào)度模塊將調(diào)用存儲管理模塊,在CPUn的本地內(nèi)存中分配 一段內(nèi)存,將核心代碼段復(fù)制到該段內(nèi)存中;并為進(jìn)程nO建立新的核心代碼段頁 表,使其指向CPUn的這段內(nèi)存中,形成如附圖5所示的情形;(實(shí)際上,不只是 核心代碼段,進(jìn)程n0的用戶態(tài)空間也盡量會被映射到CPUn的本地內(nèi)存中)
3) 進(jìn)程調(diào)度模塊還將在CPUn的本地內(nèi)存中分配一段內(nèi)存,建立中斷向量表的 副本,其中所有的中端向量地址均指向本地核心代碼段副本中的中斷處理函數(shù); 并修改CPUn的中端向量入口寄存器,使其指向本地中斷向量表副本的物理地址;
4) 對于使用系統(tǒng)調(diào)用門等方法陷入核心的硬件,還需要參照中斷向量表的處 理方式,建立系統(tǒng)調(diào)用入口表的本地副本,并修改CPUn的入口寄存器;
5) 當(dāng)再次有進(jìn)程(記為進(jìn)程nm)被調(diào)度到CPUn上運(yùn)行時(shí),進(jìn)程調(diào)度模塊,只 需要調(diào)用存儲管理模塊,修改進(jìn)程nm的核心代碼段頁表,使其指向CPUn中的核 心代碼段副本。
針對超過兩個(gè)CPU的NUMA體系的計(jì)算機(jī),可以參照以上步驟進(jìn)行擴(kuò)展。實(shí)際 上,真實(shí)的NUMA體系計(jì)算機(jī)可能采用多個(gè)CPU為一組,CPU組內(nèi)采用類似SMP方 式共享物理內(nèi)存的結(jié)構(gòu)構(gòu)成。此時(shí),并不需要為所有的CPU都建立核心代碼段本 地內(nèi)存副本,而只需要為一個(gè)CPU組建立一個(gè)核心代碼段副本即可。
以上所述的實(shí)例對本發(fā)明的實(shí)現(xiàn)方式作了詳細(xì)的說明,但是本發(fā)明的具體實(shí)現(xiàn) 形式并不局限于此,對于本技術(shù)領(lǐng)域的一般技術(shù)人員來說,在不背離本發(fā)明所述 方法的精神和權(quán)利要求范圍的情況下對它進(jìn)行的各種顯而易見的改變都在本發(fā)明 的保護(hù)范圍之內(nèi)。
權(quán)利要求
1、一種實(shí)現(xiàn)操作系統(tǒng)核心代碼段多副本運(yùn)行的方法,其特征在于在多個(gè)CPU的本地內(nèi)存中建立核心代碼段的多個(gè)副本,即核心代碼段的局部化;當(dāng)系統(tǒng)需要陷入核心態(tài)時(shí),選擇當(dāng)前進(jìn)程所運(yùn)行的CPU或者發(fā)生中斷的硬件親近的CPU運(yùn)行核心代碼;CPU在運(yùn)行核心的過程中,直接訪問本地內(nèi)存中的核心代碼段數(shù)據(jù),用以提高訪問內(nèi)存的效率,達(dá)到提升系統(tǒng)整體性能的目的,代碼段多副本運(yùn)行步驟如下1)多CPU的NUMA體系結(jié)構(gòu)的計(jì)算機(jī)啟動(dòng)時(shí),系統(tǒng)固件BIOS指定系統(tǒng)中的某個(gè)CPU以下記為CPUO,將操作系統(tǒng)核心代碼加載到CPUO的本地內(nèi)存中,并使用該CPUO開始運(yùn)行核心初始化代碼;2)CPUO在完成操作系統(tǒng)核心初始化后,喚醒其他所有CPU,并在CPUO上啟動(dòng)系統(tǒng)的第一個(gè)用戶態(tài)進(jìn)程,以下記為進(jìn)程0,將控制權(quán)交給進(jìn)程0;此時(shí),其他所有CPU進(jìn)入idele狀態(tài);3)當(dāng)首次有進(jìn)程,記為進(jìn)程n0被調(diào)度到某個(gè)CPU,記為CPUn上運(yùn)行時(shí),在CPUn的本地內(nèi)存中分配一段內(nèi)存,將核心代碼段復(fù)制到該段內(nèi)存中;并為進(jìn)程n0建立新的核心代碼段頁表,使其指向CPUn的這段內(nèi)存中,被映射到CPUn的本地內(nèi)存中的還有進(jìn)程n0的用戶態(tài)空間;4)在CPUn的本地內(nèi)存中分配一段內(nèi)存,建立中斷向量表的副本,其中所有的中端向量地址均指向本地核心代碼段副本中的中斷處理函數(shù);并修改CPUn的中端向量入口寄存器,使其指向本地中斷向量表副本的物理地址;5)對于使用系統(tǒng)調(diào)用門方法陷入核心的硬件,還需要參照中斷向量表的處理方式,建立系統(tǒng)調(diào)用入口表的本地副本,并修改CPUn的入口寄存器;6)當(dāng)再次有進(jìn)程,記為進(jìn)程nm,被調(diào)度到CPUn上運(yùn)行時(shí),只需要修改進(jìn)程nm的核心代碼段頁表,使其指向CPUn中的核心代碼段副本。
全文摘要
本發(fā)明提供一種操作系統(tǒng)代碼段多副本運(yùn)行的方法,該方法是針對傳統(tǒng)NUMA系統(tǒng)下的操作系統(tǒng)無法兼顧C(jī)PU并行度和訪存效率的缺點(diǎn),在多個(gè)CPU的本地內(nèi)存中,建立核心代碼段的多個(gè)副本使核心代碼段局部化;當(dāng)系統(tǒng)需要陷入核心態(tài)時(shí),可以選擇當(dāng)前進(jìn)程所運(yùn)行的CPU,或者發(fā)生中斷的硬件親近的CPU運(yùn)行核心代碼;CPU在運(yùn)行核心的過程中,可以直接訪問本地內(nèi)存中的核心代碼段數(shù)據(jù),從而提高了訪問內(nèi)存的效率,達(dá)到提升系統(tǒng)整體性能的目的。
文檔編號G06F9/445GK101604263SQ20091001677
公開日2009年12月16日 申請日期2009年7月13日 優(yōu)先權(quán)日2009年7月13日
發(fā)明者楠 吳, 東 張, 明 趙, 露 郭 申請人:浪潮電子信息產(chǎn)業(yè)股份有限公司