專利名稱:對來自多處理器系統(tǒng)上的多線程程序的存儲器訪問進行管理的方法和系統(tǒng)的制作方法
技術領域:
本發(fā)明總體上涉及在多處理器系統(tǒng)上執(zhí)行的多線程應用程序之
間的共享存儲器訪問;更具體地,本發(fā)明涉及使共享存儲器訪問成 為確定性事件,以用于例如促進虛擬化的多線程應用的復制。
背景技術:
對線程之間的共享存儲器訪問進行虛擬化的 一 種安全而簡單的 方式是登記對存儲器的每個訪問以及在復制機器中重放(replay) 這些訪問。這在性能方面尤其低效。
因此,需要使多線程程序的共享存儲器訪問具有確定性,例如 以便能夠通過簡單地在復制機器上重新執(zhí)行應用程序的代碼而在備 份機器上對在主機器上虛擬化的應用進行復制。
一個主要的用途可能是在容錯系統(tǒng)中。在容錯系統(tǒng)中,應用運 行在主機器上,并且其執(zhí)行被完全復制在第二機器上(以便在主機 器失效時進行恢復)。通過記錄和重放產(chǎn)生非確定性結(jié)果的事件或 者重新執(zhí)行用于復制產(chǎn)生確定性結(jié)果的事件的代碼來實現(xiàn)復制。使 得多線程程序進行的共享存儲器訪問具有確定性的另 一種用途是調(diào) 試虛擬化程序,該調(diào)試通過將代碼(此情況下在同一機器上)重新 執(zhí)行所需的次數(shù)來進行。
進程針對可寫共享存儲器區(qū)域的交替執(zhí)行是一種潛在的非確定 性資源。為了能夠使得共享存儲器訪問具有確定性,需要記錄并發(fā) 進程訪問共享存儲器的順序。在單處理器機器的情況下,可以僅僅 通過每個調(diào)度周期登記一條記錄來優(yōu)化記錄操作。代替登記對共享 存儲器區(qū)域的每個訪問,如果記錄指定進程標識符,連同在調(diào)度周期內(nèi)所訪問的第 一 條指令的位置以及在該調(diào)度周期結(jié)束以前該進程 所執(zhí)行的用戶指令的數(shù)目,則在訪問共享存儲器區(qū)域的每個調(diào)度周 期登記一條記錄是足夠的。因此,對于一個調(diào)度周期,共享存儲器 訪問已變?yōu)榇_定性事件。為了在備份機器中重現(xiàn)此事件,恢復調(diào)度 周期的記錄以及重新執(zhí)行此周期的代碼就已足夠。
為了將此優(yōu)化法擴展至多處理器機器,需要將單處理器互斥屬 性強制為對共享存儲器區(qū)域的串行訪問。轉(zhuǎn)讓給國際商業(yè)機器公司
的法國專利申請WO2006/077261描述了如何實現(xiàn)多處理器系統(tǒng)上的 多進程應用的確定性重放。其中描述了共享存儲器訪問控制機制; 該機制使用處理器的存儲器管理單元(MMU)。對訪問共享存儲器 的控制是通過對一個處理器的MMU (存儲器管理單元)硬件設備進 行編程以允許授權(quán)訪問存儲器頁面來實現(xiàn)的,其他處理器的MMU -故編程為拒絕對同 一 頁面的任何訪問。
在調(diào)度周期內(nèi),在多處理器機器上,給予每個單獨的進程對共 享存儲器的排他性訪問權(quán)。利用進程的頁表在每個調(diào)度周期內(nèi)將訪 問權(quán)選擇性地授予單個進程。然而,在多線程程序的情況下,參與 的進程共享它們的地址空間;通過利用共享頁表來應用單處理器解 決方案會影響整個線程組。進一步地,與單處理器環(huán)境中的進程相 比,整個地址空間會在線程之間共享,并且為了監(jiān)視和控制這些地 址,必須跟蹤對共享地址空間的可寫部分的任何訪問。這意p木著, 即使存儲器頁面是共享的,每個任務也可以具有其自己的私有存儲 器描述符集合。對于多線程程序卻不是這種情況,在多線程程序中, 所有的存儲器描述符是共享的。此專利申請建議為了跟蹤創(chuàng)建不 止一個線程的一個任務的共享存儲器訪問,頁表條目的結(jié)構(gòu)需要擴 展為在每個任務內(nèi)克隆的每個線程,其中每個任務按照本發(fā)明所描 述地進行監(jiān)視。該發(fā)明的原理可以應用到每個任務或者一個任務內(nèi) 的每個線程,對共享存儲器頁面的訪問在調(diào)度器所定義的激活周期 的整個持續(xù)時間內(nèi)是排他的。在此周期期間,共享存儲器頁面保持 一致。因此,需要擴展內(nèi)核的虛擬存儲器管理模塊以使得現(xiàn)有技術的 共享存儲器訪問串行化機制能夠應用于完全共享其整個存儲器空間 的多線程程序(而不是只共享其存儲器空間的子集的進程)。
美國專利號6854108描迷了 一種用于確定性地重放在多處理器 上的分布式多線程程序的可觀察運行時間行為的方法。該方法依賴 于對JVM中鎖定例程的使用。此方案意味著改動JVM并且受限于 運行在JVM頂層的純Java應用,還受限于所有存儲器訪問必須由 JVM將進行的鎖定來保護的事實。
需要提供一種應用于多處理器計算機上的多線程進程的共享存 儲器訪問控制,該共享存儲器訪問控制是通用的并且可透明地應用 于任何類型的應用。
發(fā)明內(nèi)容
因此,本發(fā)明的一個目的是使得多線程程序的共享存儲器訪問 可監(jiān)視且可控制,以便串行化這些訪問并將其變成確定性事件。 本發(fā)明的另一目的是提供一種透明地實施于應用的方法。 本發(fā)明的又一目的是使用已有方法來管理對多處理器環(huán)境中的 共享資源的訪問,該方法以更有效的方式為任何任務或線程提供了 ^卜他性訪問。
如權(quán)利要求1中所要求的,這些目的通過一種用于控制由多處 理器計算機上執(zhí)行的進程所創(chuàng)建的線程對存儲器的訪問的方法來實
現(xiàn),所述方法包括
-進程請求創(chuàng)建新線程;
-在存儲器描述符中分配新頁表目錄,以及創(chuàng)建已有線程的頁表的
畐'J本; -等待事件;
-當發(fā)生頁面錯誤時,對指示頁面存在于存儲器中并且可寫的兩個 4立進4亍測"^式;
-如果頁面存在并且可寫,并且如果測試到線程將要退出,則-授權(quán)導致頁面錯誤的線程訪問頁面,以及設置指示頁面存在于
存儲器中并且可寫的位; -執(zhí)行等待事件的步驟; -如果頁面存在并且可寫,如果另一線程具有對該頁面的訪問權(quán)并
且等待其他線程釋放該頁面,則等待其他線程釋放; -當線程已經(jīng)釋放訪問權(quán)時,
-授權(quán)導致頁面錯誤的所述線程訪問所述頁面,以及設置指示頁 面存在于存儲器中并且可寫的位; -執(zhí)行等待事件的步驟。
根據(jù)權(quán)利要求2,上述目的還可以如此實現(xiàn),權(quán)利要求1的方法 還包括
步驟之后,如果頁面不存在或者不可寫,則讓內(nèi)核來處理所述頁面 錯誤;
-通過測試相應的位來測試所述新頁面在由內(nèi)核進程創(chuàng)建之后是否 可寫;
-如果所述新頁面可寫,則重置所述新頁面的存在位; -將所述內(nèi)核創(chuàng)建的頁表條目傳播到所有線程的其他頁表; -執(zhí)行等待事件的步驟。
這些目的也可以通過針對優(yōu)選實施方式的解決方案的權(quán)利要求 3-4的方法來實現(xiàn),以及針對第二實施方式的兩頁表結(jié)構(gòu)的權(quán)利要求 5-7的方法來實現(xiàn)。
這些目的也可以通過根據(jù)權(quán)利要求8的計算機程序和根據(jù)權(quán)利 要求9的系統(tǒng)來實現(xiàn)。
本發(fā)明的解決方案允許針對在多處理器系統(tǒng)上執(zhí)行的每個多線 程應用管理引用共享存儲器頁面的獨立的存儲器描述符。
使得多線程程序的共享存儲器訪問可監(jiān)視和可控制,除了獲得 本發(fā)明的主要目的之外,還具有其他優(yōu)勢如下 -性能當粒度變化時,共享存儲器訪問控制可以改善應用性能(時
8間從指令持續(xù)時間到調(diào)度周期持續(xù)時間,空間從4字節(jié)的字到
4K字節(jié)的頁面),因為其減少了共享對象的竟爭比率。
-根據(jù)本發(fā)明第三目的所描述的解決方案非常有效,足以優(yōu)化處理
器中已有硬件功能的使用。如在優(yōu)選實施方式的詳細描述中所提到
的,本發(fā)明的解決方案不僅通過避免處理器中的硬件改動而且通過
避免操作系統(tǒng)的內(nèi)核中的某些重大軟件變化,限制了對已有計算機
的重大改動。
-非虛擬化任務不受改動的影響。原始的存儲器管理系統(tǒng)保持用于
非虛擬化任務。對于可能具有不可預知結(jié)果的所有任務,其他解決
方案可能使所述改動全局化。此解決方案則可以選擇性地實施。例
如,對于所有任務來說,額外使用存儲器可能是不可接受的。同樣,
某些任務可能不支持粒度變化正常的訪問控制(硬件準許的)是
針對一條指令以及存儲器中一個存儲器字的大小,即使沒有觀察或 控制其的空間。不利影響的一個例子是兵乓效應,在此效應中,兩
個任務交替訪問共享頁面本發(fā)明的解決方案阻止了此情況的出現(xiàn), 因為利用時間片來分配排他性存儲器字,下一任務必須等待大約數(shù) 千條指令。對此存在一種解決方案修改應用以允許通過特定指令 明確釋放頁面。
圖1示出了未實施本發(fā)明時多線程應用中的存儲器描述符的結(jié)
構(gòu);
圖2示出了根據(jù)本發(fā)明的優(yōu)選實施方式的每個任務一個表的存 儲器描述符的結(jié)構(gòu);
圖3示出了根據(jù)第二實施方式的存儲器描述符的簡化結(jié)構(gòu); 圖4是根據(jù)優(yōu)選實施方式的方法的流程圖; 圖5是根據(jù)第二實施方式的方法的流程圖。
具體實施方式
在非多線程應用中,為了有效地重現(xiàn)共享存儲器訪問的順序, 在調(diào)度周期內(nèi)對單獨的進程給予對共享存儲器的排他性訪問權(quán)。# ,J 用進程的頁表在每個調(diào)度周期內(nèi)選擇性地授予單個進程訪問權(quán)。然 而,在多線程程序的情況下,參與的進程共享它們的地址空間,利 用共享頁表會影響整個線程組。進一步地,與非多線程應用中的進 程相比,整個地址空間會在線程之間共享,并且為了監(jiān)視和控制這 些地址,必須跟蹤對共享地址空間的可寫部分的任何訪問。繼而, 在容錯系統(tǒng)中用于復制多線程程序?qū)蚕淼刂房臻g訪問的訪問信,包-被登記,并且將會用于通過在備份機器中重新執(zhí)行程序代碼來重放 這些i方問。
為了跟蹤進程訪問共享存儲器區(qū)域的順序,通過改變跟蹤訪問 的空間和時間粒度,涌現(xiàn)了各種設計選擇??臻g粒度可以從單個存 儲器位置改變至頁面、整個地址空間,而時間粒度可以從單條指令 訪問共享區(qū)域改變至整個調(diào)度周期。通過在指令級別粒度跟蹤對單 個存儲器位置的訪問,可以準確地重現(xiàn)主機器上的應用的執(zhí)行。然 而,這么做既不是所希望的也不可行。
內(nèi)核線程的傳統(tǒng)實現(xiàn)為整個線程組提供了單頁表。為了跟蹤存 儲器訪問的順序,可以采用以下技術。修改共享頁表以拒絕對地址 空間的所有可寫部分的訪問。這么做會迫使任何線程嘗試訪問此區(qū) 域從而導致頁面錯誤。在頁面錯誤處理機中,登記該訪問,并且在 臨時激活對該存儲器位置的訪問權(quán)的情況下重新執(zhí)行當前指令。這 確保登記了每個線程對共享存儲器的每個訪問。然而,此方法也強 加了由于攔截每個存儲器訪問而導致的高開銷。
為了提高前述方法的效率,可以將粒度從指令級別的粒度改變 到調(diào)度周期的粒度。這要求在調(diào)度周期期間的訪問互斥性,并且通 過維持同步的頁表集合,線程組中每個線程一個表,有可能選擇性 地給予單獨的進程整個調(diào)度周期的訪問權(quán)。當調(diào)度線程運行時,相
應的頁表加載到MMU上下文中。
用于每個線程組的頁表集合必須完全同步。只允許在跨集合中的兩個頁表的相應條目之間的存在標記有所差別。無論何時修改任 一頁表的條目,此變化必須傳播到其余頁表。很多內(nèi)核子系統(tǒng)(例
如aio、 swap等)修改頁表,并且在每個實例中,此修改必須傳播到 該組中的每個頁表。
存儲器粒度是要考慮的另一維度。字節(jié)(或者存儲器字)級別 粒度將提供用于跟蹤共享存儲器訪問的順序所需的串行化的最佳程 度。如果存儲器的單位是頁面,則將會拒絕竟爭的進程對整個頁面 的訪問,而不是僅僅拒絕對竟爭位置的訪問。當同一頁面中放置了 對多個資源的鎖時,這尤其將是個問題。串行化對頁面的訪問將會 串行化對整個資源集合的訪問。盡管希望字級別的粒度,但是其取 決于底層架構(gòu)所使用的存儲器的單位。典型的MMU架構(gòu)為了最優(yōu) 化頁表大小,以頁面級別粒度來管理存儲器。
對于另一極端,如果使用地址空間級別粒度,在調(diào)度周期期間 提供排他性訪問所需的頁表的數(shù)目可以壓縮為2個,而不管線程組 中線程的數(shù)目。為了向一個線程提供對可寫地址空間的排他性訪問, 該線程的頁表中的相應條目會被標記為存在,而其余頁表中的可寫 條目會被標記為不存在。由于已被拒絕訪問地址空間的線程的頁表 是一樣的,因此可以使用一個頁表(稱為反頁表)。事實上,反頁 表的實際條目是不相關的,因為它們從沒有在頁面轉(zhuǎn)換中使用。反 頁表僅用于當從被拒絕訪問的線程的上下文進行存儲器訪問時,強 制出錯。當線程應當被拒絕訪問地址空間時,其頁表被切換到反頁 表,反之亦然。
以下描述針對Linux內(nèi)核上下文中的線程的共享存儲器排他性 訪問機制的實現(xiàn)以及Linux分頁模型。盡管此描述使用Linux特定的 術語,但是本方法非常通用,足以應用于其他操作系統(tǒng)和架構(gòu)。
為了提供對共享存儲器的排他性訪問,將本發(fā)明應用于現(xiàn)有技 術的專利申請,實施應當提供無縫授予單個進程訪問權(quán)以及在任何 其他線程嘗試訪問該區(qū)域時引起錯誤的能力。為此目的,使用在大 部分現(xiàn)代架構(gòu)中可用的分頁機制。"page_present (頁面—存在)"位
ii指示在物理存儲器中是否分配了特定頁面,當向另一進程指派對頁 面的排他性訪問時,該位會被人工重置以觸發(fā)頁面錯誤。這么^f故可 能潛在地干擾常規(guī)分頁機制。通過增加頁面的使用計數(shù)器來捕獲頁 面上的鎖,避免了上述情況,使得內(nèi)核交換器永遠不會交換該頁面。
圖1示出了未實施本發(fā)明時多線程應用中的存儲器描述符的結(jié) 構(gòu)。其示出了頁表如何被常規(guī)線程共享的示意圖。在圖1中,示出 了在包括虛擬存儲器管理的大部分操作系統(tǒng)中可以找到的頁表層級 的一個例子。存儲器描述符(110)由需要訪問存儲器的進程的所有
線程(100)訪問。存儲器描述符是頁表層級的最高級別。存儲器描 述符包括指向作為樹根的頁面全局目錄PGD ( 130)的指針(120)。 PGD指向頁面中間目錄(PMD) ( 140),該頁面中間目錄對頁面條 目(150)的列表編制索引,頁面條目是指向物理存儲器中的頁幀 (160, 165 )的指針。PGD、 PMD和PTE形成了頁表結(jié)構(gòu)(170), 其允許線程訪問它們的公共地址空間的頁面。如所描述的,三個線 程(100)通過頁表結(jié)構(gòu)(170)訪問(155, 157)相同的頁幀(160 和165)。
圖2示出了根據(jù)本發(fā)明優(yōu)選實施方式的存儲器描述符的結(jié)構(gòu), 其中每個任務一個表。
在將本發(fā)明應用于現(xiàn)有技術的專利申請所包括的第 一方法中, 為每個線程復制PTE從而為每個單個線程保證排他性訪問就足夠 了。這是這樣實現(xiàn)的對于給定的頁表條目,選擇性啟用相應頁表 中的存在標記。不過由于地址轉(zhuǎn)換是硬線連接到CPU的MMU中, 因此需要復制整個頁表層級。事實上,可以在存儲器描述符(200) 的更高級別來進行隔離(segregation),其包括頁表層級和與進程地 址空間有關的其他參數(shù)。在此方法中,將為每個線程提供單獨的存 儲器描述符。也有可能使用fork (分叉)系統(tǒng)調(diào)用的實現(xiàn),該fork 系統(tǒng)調(diào)用利用Linux創(chuàng)建新的進程并且復制頁表。使用fork意味著 實施困難的同步。存儲器描述符是廣泛應用的、架構(gòu)獨立的數(shù)據(jù)結(jié) 構(gòu),改變其用于線程的語義要求大量的內(nèi)核修改。此外,需要集中的鎖來同步跨越線程組中不同存儲器描述符的頁表,這使實現(xiàn)進一 步復雜化。
如圖2所示,在優(yōu)選實施方式中,為組中的每個線程指派私有
頁表(210)。在線程組共享的存儲器描述符200中維護這些私有頁 表的哈希表,通過線程id對其進行索引。進一步地,指向頁面目錄 的指針(220)位于相應線程的進程描述符中,從而可以在上下文切 換操作期間快速訪問頁面目錄。當在內(nèi)核的虛擬存儲器管理子系統(tǒng) 中操作時,在只有進程的存儲器描述符可用的情況下,使用哈希表 來獲取特定線程的頁面目錄。 一旦每個線程有其自己的私有頁表
(210),則按照與根據(jù)現(xiàn)有技術的專利申請解決方案、針對常規(guī)進 程的共享存儲器訪問控制的情況下完全相同的方式,來控制對存儲 器可寫區(qū)域的訪問。在線程的情況下,地址空間中的每個頁面是共 享的,而在進程的情況下,共享的頁面明確地標記為共享。使用結(jié) 合圖5所描述的進程,兩個線程(線程1和線程2)被授予(255, 257 )對存儲器的某些訪問,而對于所有線程拒絕其他訪問(263, 265, 267, 269)。
一旦每個線程有其自己的私有頁表(210),則按如下方式來授 予組中的 一個線程對存儲器可寫部分的訪問,即針對授權(quán)線程設置 所訪問頁面的PTE中的pagejresent位,以及重置所有其他線程的 位,使得當其他線程嘗試訪問該頁面時將會產(chǎn)生頁面錯誤。
圖3示出了在給予一個線程對整個地址空間的訪問權(quán)時這一多 線程應用的特定情況下的存儲器描述符的簡化結(jié)構(gòu)。本發(fā)明的此第 二實施方式采用本文上面描述的地址空間級別粒度。在此情況下, 在調(diào)度周期期間提供排他性訪問所需的頁表的數(shù)目可以壓縮為2個。 每個線程組將具有與其相關聯(lián)的一對頁表,正頁表(370)和反頁表
(375 )。正頁表(370)用于地址轉(zhuǎn)換,并且被指派給授權(quán)在調(diào)度 周期內(nèi)訪問地址空間的線程(圖3中的線程1 )。將反頁表(375 ) 指派給被拒絕在此調(diào)度周期內(nèi)訪問的其余線程(線程2和線程3)。 所示頁表結(jié)構(gòu)包括由線程組共享的唯一的存儲器描述符(300)。存儲器描述符包含指向各個頁表(370和375 )的兩個頁面目錄(330, 335 )。每個頁表結(jié)構(gòu)包括一個頁面中間目錄(340, 345 ),每個頁 面中間目錄對條目(350, 355 )的列表編制索引。在圖3中,如結(jié) 合圖6所描述的那樣使用進程,向線程1授予(365, 367 )訪問兩 個頁幀(160, 165 )的訪問權(quán);對于組內(nèi)的其他線程(線程2和線 程3),拒絕訪問那兩個頁幀(160, 165 )的訪問權(quán)。
方法流程圖。
將私有頁表創(chuàng)建為克隆系統(tǒng)調(diào)用的一部分。如果虛擬化進程沒 有調(diào)用設置了 VM—CLONE標記的克隆系統(tǒng)調(diào)用,則不使用用于線程 的訪問控制系統(tǒng),并且不執(zhí)行當前的方法。當虛擬化進程調(diào)用設置 了 VM—CLONE標記的調(diào)用克隆系統(tǒng)調(diào)用時,修改已有copy—mm函 數(shù)以分配新的頁面目錄,從而為正在創(chuàng)建的線程保持私有頁表,并 將其添加到哈希表中。繼而調(diào)用新的函數(shù)rr一dup一vmas來有系統(tǒng)地復 制整個頁表層級。在稱為dup—vmas的已有函數(shù)被fork調(diào)用之后,對 此函數(shù)進行建模以創(chuàng)建用于新創(chuàng)建的子進程的新的頁表。這兩個函 數(shù)之間的關鍵差別在于在rr_dup—vmas的情況下,所有頁表條目無 一例外地被復制,而dup—vmas跳過設置了稱為VM—DONT—COPY 的已有標記被置位的頁面。進一步地,dup_vmas函數(shù)對于父(進程) 和子(進程)二者都將把地址空間的可寫部分標記成只讀,以實現(xiàn) 寫入時復制,而rr一dup一vmas使得所有可寫條目缺失。組內(nèi)的線程所 使用的頁表集合保持同步,以便維持線程的存儲器共享語義。對任 一頁表的任何修改被傳播到其余部分,從而這些變化反映在其他對 等進程的上下文中。
針對線程的共享存儲器訪問控制的實現(xiàn)需要解決在進程情況下 不存在的特定問題。內(nèi)核經(jīng)常直接訪問進程的地址空間。例如,當 用戶級線程或進程將存儲器緩存?zhèn)鬟f給讀取系統(tǒng)調(diào)用時,內(nèi)核的文 件系統(tǒng)組件直接寫到由用戶空間程序提供的緩存中。這種對共享存 儲器的訪問通常由訪問控制機制來仲裁。然而,在線程的情況下,當線程將要退出時,內(nèi)核直接將線程標識符的值寫到進程地址空間 中用戶提供的存儲器指針。通過檢查進程描述符中稱為PF—
EXITING的已有標記來^r測這種訪問,如果標記^皮置位,則將特定 訪問從常規(guī)訪問控制中排除,并且給予內(nèi)核無條件訪問。
一般說來,當相應的線程退出時,每個線程的頁表或者是通過 顯式地調(diào)用退出系統(tǒng)調(diào)用來釋放,或者在被內(nèi)核殺死時隱式地釋放。 特別地,當進程中的一個線程調(diào)用exec系統(tǒng)調(diào)用時,其解映射進程 的當前地址空間,并且創(chuàng)建和殺死進程中除了已經(jīng)調(diào)用exec系統(tǒng)調(diào) 用的線程之外的所有其他線程。修改內(nèi)核的線程退出操作以釋放頁 面目錄以及與退出線程相關聯(lián)的頁表層級。在exec系統(tǒng)調(diào)用末尾, 只留下 一 個具有新的頁表集合的進程。此進程隨后創(chuàng)建的任何線程 將繼承其頁表的副本,并且再次強制排他性訪問控制。
在圖4的流程圖中,示出了相應的步驟 -利用VM—CLONE請求創(chuàng)建新線程(405 ); -在存儲器描述符中分配新頁表目錄,并創(chuàng)建已有線程的頁表的副
本(410); -等待事件(420);
-當發(fā)生頁面錯誤時(430),對指示頁面存在于存儲器中并且可寫
的兩個位進^f亍測試(435 ); -如果頁面存在并且可寫(測試435為是),并且如果測試到線程
將要退出(測試到Linux PF位455:是),則
-授權(quán)導致頁面錯誤的線程訪問該頁面(465 ),并設置指示頁面
存在于存儲器中并且可寫的位;
-執(zhí)行等待事件的步驟(420); -如果頁面存在并且可寫,如果另一線程具有對該頁面的訪問權(quán)并
且等待(470)其他線程釋放該頁面(460),則等待其他線程釋
放;
-當線程已經(jīng)釋放訪問權(quán)時,
-授予導致頁面錯誤的線程對該頁面的訪問權(quán),并設置指示頁面
15存在于存儲器中并且可寫的位; -執(zhí)行等待事件的步驟。
-在對指示頁面存在于存儲器中并且可寫的兩個位進行測試的步驟 (435 )之后,如果頁面不存在或者不可寫,則讓內(nèi)核處理所述頁面 錯誤(440 );
-通過測試相應的位來測試(445 )新頁面在由內(nèi)核進程創(chuàng)建之后是 否可寫;
-如果該新頁面可寫,則重置新頁面的存在位(450); -將內(nèi)核創(chuàng)建的頁表條目傳播(425 )到所有線程的其他頁表; -執(zhí)行等待事件的步驟(420)。
在等待事件的步驟之后
-當調(diào)度線程時(475 ),將存儲器的硬件上下文切換(480)到將
要被調(diào)度的線程的頁表;
-執(zhí)行等待事件的步驟(420)。
在等待事件的步驟之后還包括
-當線程退出時(485 ),釋放(490)用于該線程的頁面目錄; -結(jié)束用于該線程的存儲器訪問控制。
圖5是根據(jù)兩頁表實施方式的用于從線程組的線程訪問存儲器 的方法流程圖。
反頁表是正頁表的復本,通過重置存在標志來禁用其地址空間 的所有可寫部分。當反頁表分出第二線程并且線程計數(shù)超過1時, 其首先由組內(nèi)的第 一線程創(chuàng)建。父線程和子線程二者初始地都被指 派了反頁表。隨后創(chuàng)建的線程在其創(chuàng)建時被指派反頁表。在從分叉 返回之前,父(線程)的硬件上下文被切換為使用反頁表。當調(diào)度 子(線程)首次運行時,上下文切換例程可以指派反頁表。
當組內(nèi)任一線程嘗試訪問地址空間的可寫部分時,生成頁面4晉誤中斷。頁面錯誤中斷是處理器提供的中斷,其用于幫助內(nèi)核實現(xiàn) 諸如請求分頁和寫入時復制的便利。提供此中斷的中斷處理機通過 檢查正頁表中相應條目的存在和寫標記,將作為內(nèi)核正常功能一部 分的頁面錯誤中斷與由于訪問控制導致的錯誤區(qū)分開。如果頁面存 在并且可寫,則錯誤一定是由于訪問控制導致的,若另一線程已不 再持有訪問權(quán),則給予線程對地址空間的訪問權(quán)。如果頁面不存在 或者如果是對只讀頁面的寫訪問,則頁面錯誤是真的,其將通過內(nèi) 核提供的常規(guī)渠道來處理。如果頁面在正頁表和反頁表二者中都不 存在,則在仲裁對地址空間的訪問權(quán)之前,首先將頁面錯誤作為正 常頁面錯誤來處理。
在任何給定時間,線程組中只有 一個線程有權(quán)訪問地址空間。
持有訪問權(quán)的線程的線程標識符(tid)存儲在存儲器描述符中,由 鎖來保護。當線程在調(diào)度周期中首次嘗試訪問共享存儲器并且共享 存儲器未被任何其他進程占據(jù)時,將該線程的tid存儲在存儲器描述 符中,并且改變?nèi)蝿盏挠布舷挛囊苑从承马摫?,而舊頁表的TLB 條目是無效的。有可能對任務進行調(diào)度,使其在不同于發(fā)生頁面錯 誤的處理器的處理器上運行。不過這不會導致問題,因為在從頁面 錯誤處理機返回之前加載了新頁表。
如果不能立即授予訪問權(quán),則調(diào)度其他任務運行。當?shù)刂房臻g 由所有者線程釋放時,等待的線程最終會得到訪問權(quán)。當暫停任務 時或者當任務調(diào)用退出時,通過移除其存儲在存儲器描述符中的tid 來釋放訪問權(quán)。
在圖5的流程圖中,示出了相應的步驟 利用此第二實施方式,在存儲器描述符中分配(410)新頁表目錄, 并創(chuàng)建作為已有線程的頁表的副本的新頁面目錄的步驟僅在其是第 一線程時才執(zhí)行;并且,還包括 -重置已經(jīng)設置了可讀位的所有頁面的頁面存在標記。
將存儲器的硬件上下文切換(480)到將要被調(diào)度的線程的頁表的步驟由以下步驟(500)代替
-如果線程有權(quán)訪問地址空間,則將存儲器的硬件上下文切換到已 有頁表(正PGD);
-如果線程沒有權(quán)利訪問地址空間,則將存儲器的硬件上下文切換 到新創(chuàng)建的頁面目錄(反PGD)。
當線程退出時釋放(490)頁面目錄的步驟由以下步驟(510)代替: -當進程中僅剩下一個其他線程時,釋放新創(chuàng)建的頁面目錄。
優(yōu)選實施方式的解決方案的缺點在于有可能增加存儲器管理 的復雜性,因為頁表是針對每個線程而實例化的。在一個線程中映 射的改變必須傳播到組內(nèi)的其他線程。利用兩頁表的實現(xiàn),訪問控 制的實現(xiàn)變得更加簡單。
權(quán)利要求
1.一種用于控制由多處理器計算機上執(zhí)行的進程所創(chuàng)建的線程對存儲器的訪問的方法,所述方法包括-所述進程請求創(chuàng)建新線程;-在存儲器描述符中分配新頁表目錄,并創(chuàng)建已有線程的頁表的副本;-等待事件;-當發(fā)生頁面錯誤時,對指示所述頁面存在于存儲器中并且可寫的兩個位進行測試;-如果所述頁面存在并且可寫,并且如果測試到所述線程將要退出,則-授予導致所述頁面錯誤的所述線程對所述頁面的訪問權(quán),并且設置指示所述頁面存在于存儲器中并且可寫的位;-進行所述等待事件的步驟;-如果所述頁面存在并且可寫,如果其他線程擁有對所述頁面的訪問權(quán)并且等待所述其他線程釋放所述頁面,則等待所述其他線程釋放;-當所述線程已經(jīng)釋放訪問權(quán)時,-授予導致所述頁面錯誤的所述線程對所述頁面的訪問權(quán),并且設置指示所述頁面存在于存儲器中并且可寫的位;-執(zhí)行所述等待事件的步驟。
2. 如權(quán)利要求l的方法,還包括-在對指示所述頁面存在于存儲器中并且可寫的兩個位進行測 試的步驟之后,如果所述頁面不存在或者不可寫,則讓內(nèi)核來處理 所述頁面4晉i吳;-通過測試相應的位,來測試所述新頁面在由內(nèi)核進程創(chuàng)建之后是否可寫;-如果所述新頁面可寫,則重置所述新頁面的存在位; -將所述內(nèi)核創(chuàng)建的所述頁表條目傳播到所有線程的其他頁表; -執(zhí)行所述等待事件的步驟。
3. 如權(quán)利要求1或2的方法,在所述等待事件的步驟之后還包括-在調(diào)度線程時,將存儲器的硬件上下文切換到將要被調(diào)度的所述線程的頁表; -執(zhí)行所述等待事件的步驟。
4. 如權(quán)利要求1或2的方法,在所述等待事件的步驟之后還包括-當線程退出時,釋放用于所述線程的頁面目錄; -結(jié)束用于所述線程的存儲器訪問控制。
5. 如權(quán)利要求1-4中任一的方法,其中在存儲器描述符中分配 新頁表目錄并創(chuàng)建作為已有線程的頁表的副本的新頁面目錄的步驟 僅在其是第一線程時才執(zhí)行;并且,還包括-重置已經(jīng)設置了可讀位的所有頁面的頁面存在標記。
6. 如權(quán)利要求5的方法,其中將存儲器的硬件上下文切換到將 要被調(diào)度的線程的頁表的步驟由以下步驟代替-如果所述線程有權(quán)訪問地址空間,則將存儲器的硬件上下文切 換到已有頁表;-如果所述線程無權(quán)訪問地址空間,則將存儲器的硬件上下文切 換到新創(chuàng)建的頁面目錄。
7. 如權(quán)利要求5或6的方法,其中當線程退出時釋放所述頁面 目錄的步驟由以下步驟代替-當所述進程中僅剩下一個其他線程時,釋放所述新創(chuàng)建的頁面 目錄。
8. —種包括程序代碼指令的計算機程序產(chǎn)品,當所述程序在計 算機上執(zhí)行時,所述指令用于執(zhí)行根據(jù)權(quán)利要求1-7中任一方法的步驟。
9. 一種系統(tǒng),包括適合于執(zhí)行根據(jù)權(quán)利要求1-7中任一方法的裝置。
全文摘要
提供了一種用于控制由多處理器計算機上執(zhí)行的進程所創(chuàng)建的線程對存儲器的訪問的方法、計算機程序和系統(tǒng)。為每個新的線程分配頁表結(jié)構(gòu),并且從已有線程復制該分配頁表結(jié)構(gòu)。通過存在位和可寫位來控制頁面訪問。當頁面錯誤時,向一個線程提供訪問權(quán)。內(nèi)核處理新頁面條目創(chuàng)建進程并且將頁面存在位設置為零,從而創(chuàng)建頁面錯誤。在第二實施方式中,創(chuàng)建兩頁表結(jié)構(gòu),一個頁表結(jié)構(gòu)用于一個有權(quán)訪問地址空間的線程,另一個頁表結(jié)構(gòu)由無權(quán)訪問地址空間的所有其他線程所共享。
文檔編號G06F11/36GK101563674SQ200780047152
公開日2009年10月21日 申請日期2007年6月15日 優(yōu)先權(quán)日2006年12月21日
發(fā)明者D·薩布赫拉維蒂, M·韋特斯, P·貝格埃奧德 申請人:國際商業(yè)機器公司