国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      在異構(gòu)多處理器系統(tǒng)中收集垃圾的系統(tǒng)和方法

      文檔序號:6608874閱讀:294來源:國知局
      專利名稱:在異構(gòu)多處理器系統(tǒng)中收集垃圾的系統(tǒng)和方法
      技術(shù)領(lǐng)域
      本申請通常涉及改善的數(shù)據(jù)處理系統(tǒng)和方法。本申請尤其關(guān)注用于在異構(gòu)多處理器系統(tǒng)中收集垃圾的系統(tǒng)和方法。
      背景技術(shù)
      當(dāng)計算機(jī)程序執(zhí)行時,它們?yōu)閿?shù)據(jù)緩沖器分配存儲器。當(dāng)計算機(jī)程序持續(xù)分配這樣的存儲器時,它可能最終超過物理存儲器容量。在這樣的情況下,操作系統(tǒng)必須將程序的一部分放入虛擬存儲器,即盤上以便繼續(xù)執(zhí)行,這降低了計算機(jī)程序的執(zhí)行速度。在例程不再需要存儲器之后手動釋放這部分存儲器是編程者經(jīng)常忘記做或未正確做的乏味任務(wù)。
      作為手動釋放存儲器的替換方法,開發(fā)了垃圾收集(garbage collection)。垃圾收集是這樣的軟件例程用法該軟件例程在存儲器中搜索不活躍的數(shù)據(jù)和指令區(qū)域,以便回收這個空間用于通用的存儲器池,即堆。垃圾收集器基本上通過確定在程序的將來執(zhí)行中將不會訪問程序中的什么數(shù)據(jù)對象、并且回收由那些對象使用的存儲器來進(jìn)行工作。
      垃圾收集使釋放存儲器自動化,以使得編程者不再必須擔(dān)心釋放不再需要的對象。作為結(jié)果,可以避免這個相當(dāng)大的程序設(shè)計工作量的來源。此外,由于減少幾類運(yùn)行時錯誤,例如在使用對已釋放對象的引用時的懸掛(dangling)指針錯誤,垃圾收集有助于使編程語言更安全。
      稱為垃圾收集語言的很多計算機(jī)編程語言要求垃圾收集或者作為語言規(guī)范的一部分(例如,Java、C#和大多數(shù)腳本語言),或者實(shí)際實(shí)現(xiàn)高效(例如,如lambda calculus那樣的形式語言)。其它計算機(jī)編程語言可以被設(shè)計為使用手動存儲器管理,但是具有垃圾收集的實(shí)現(xiàn)(例如,C、C++)。其它計算機(jī)編程語言,如Modula-3,通過使用分離的堆用于所收集的和手動管理的對象,而允許垃圾收集和手動存儲器管理共存于同一個應(yīng)用中。
      跟蹤垃圾收集器是最通用類型的垃圾收集器。跟蹤垃圾收集器關(guān)注于確定哪些對象是可達(dá)的或可能可達(dá)的,然后丟棄所有剩余的對象??蛇_(dá)對象可被定義為這樣的對象對于該對象,在程序環(huán)境中存在某個通向該對象的名稱,其中該名稱直接或通過來自其它可達(dá)對象的引用而通向該對象。更精確而言,對象只能以兩種方式可到達(dá)。首先,假定一組已辨別出的對象是可達(dá)的,這些對象被稱為根。通常,這些對象包括從調(diào)用堆棧中的任何地方引用的所有對象,即當(dāng)前正在調(diào)用的函數(shù)中的所有局部變量和參數(shù)以及任何全局變量。其次,從可達(dá)對象引用的任何對象本身是可達(dá)的。這稱為傳遞性。
      跟蹤垃圾收集器使用其中它們執(zhí)行垃圾收集循環(huán)的算法。當(dāng)收集器決定或被通知它需要回收存儲器時開始循環(huán),這尤其是當(dāng)系統(tǒng)低存儲器時發(fā)生。所有跟蹤垃圾收集器都實(shí)現(xiàn)了三色標(biāo)記抽象的某個變體,但是諸如標(biāo)記和掃描收集器之類的簡單收集器通常不顯式地構(gòu)造這個抽象。三色標(biāo)記如下所述進(jìn)行操作。
      首先,創(chuàng)建初始的白、灰和黑色集合,這些集合將用于在循環(huán)期間保持處理進(jìn)程。最初,白色集合或被責(zé)難集合(condemned collection)是這樣的對象的集合這些對象是使它們的存儲器被循環(huán)使用的候選者。黑色集合是這樣的對象的集合可以容易地證明這些對象未引用白色集合中的對象。在很多實(shí)現(xiàn)中,黑色集合開始是空的?;疑鲜强赡芤没蚩赡芪匆冒咨现械膶ο蟮乃惺S鄬ο?。這些集合劃分存儲器,以便系統(tǒng)中的每個對象,包括根集合在內(nèi),都正好處于一個集合中。
      其后,選擇灰色集合中的對象。通過“灰化”該對象直接引用的所有白色對象,即通過使該對象引用的所有白色對象以及這些白色對象引用的對象變黑,來使這個對象被變黑,即移到黑色集合中。重復(fù)這個步驟,直到灰色集合變空為止。當(dāng)灰色集合中沒有更多對象時,那么可以證明白色集合中的所有剩余對象都是不可達(dá)的,并且可以回收由它們占用的存儲器。
      利用三色標(biāo)記算法,沒有黑色對象直接指向白色對象。這確保一旦灰色集合是空的,就可以安全地破壞白色對象。
      一旦已經(jīng)確定了不可達(dá)的集合,即當(dāng)灰色集合空時產(chǎn)生的白色集合,則垃圾收集器可以簡單地釋放不可達(dá)的對象,并且使其它每件事保持原樣。作為選擇,垃圾收集器可以將一些或所有可達(dá)對象復(fù)制到新的存儲器區(qū)域中,需要時更新所有到這些對象的引用。這些分別稱為“不移動”和“移動”垃圾收集器。
      也可以通過考慮在收集循環(huán)期間如何保持這三個對象集合(白色、灰色和黑色)來對跟蹤收集器分類。最直接的方法是半空間收集器,這是其中存儲器被劃分為“來空間”和“去空間”的移動垃圾收集方案。最初,將對象分配到“去空間”中直到它變?yōu)闈M為止,并且觸發(fā)垃圾收集循環(huán)。在該垃圾收集開始處,“去空間”變?yōu)椤皝砜臻g”,以及反之亦然。將可從根集合達(dá)到的對象從“來空間”復(fù)制到“去空間”。依次掃描這些對象,并且將所有它們指向的對象復(fù)制到“去空間”,直到已經(jīng)將所有可達(dá)對象復(fù)制到“去空間”為止。一旦程序繼續(xù)執(zhí)行,則再一次從“去空間”分配新的對象,直到它再一次變滿為止并且重復(fù)該處理。這種方法具有概念簡單的優(yōu)點(diǎn),這是因?yàn)樵趶?fù)制處理期間隱含地構(gòu)造了三個對象顏色集合,但是具有這樣的缺點(diǎn),即每個收集循環(huán)可能需要非常大的空閑存儲器的連續(xù)區(qū)域。
      通常,“標(biāo)記和掃描”垃圾收集器為每個對象保留一或兩位來記錄它是白色還是黑色的?;疑匣蛘咦鳛閱为?dú)列表維護(hù)或使用另外的位標(biāo)識。當(dāng)在收集循環(huán)期間遍歷引用樹時,這些位由收集器操縱來反映當(dāng)前狀態(tài),即白色、黑色或灰色。標(biāo)記和掃描策略具有這樣的優(yōu)點(diǎn),即一旦確定了不可達(dá)的集合,即在灰色集合變空之后產(chǎn)生的白色集合,那么可以繼續(xù)移動或不移動收集策略。當(dāng)可用的存儲器允許時,甚至可以在運(yùn)行時進(jìn)行這個策略的選擇。
      在垃圾收集器的一些實(shí)現(xiàn)中,標(biāo)記和掃描垃圾收集器使用顯式堆棧來存儲已知為可達(dá)、但是其內(nèi)容還未被檢查的對象(即,“灰色”對象)。堆棧中的每個項(xiàng)目都包含基地址和標(biāo)記描述符,來指示可能的指針相對于那個起始地址的位置。標(biāo)記描述符通常采用簡單的長度說明、或者描述指針位置的位向量的形式。
      除了上述之外,垃圾收集器也可以是與它們?nèi)绾沃袛嗨鼈冊谄渲羞M(jìn)行操作的系統(tǒng)中的其它操作有關(guān)的各種類型。例如,“世界停止(stop the world)”垃圾收集器完全停止程序的執(zhí)行以運(yùn)行收集循環(huán),因此確保在收集器運(yùn)行時未分配新的對象,并且對象不會突然變?yōu)椴豢蛇_(dá)。這具有明顯的缺點(diǎn),即當(dāng)收集循環(huán)運(yùn)行時,程序不能執(zhí)行有用的工作。
      設(shè)計了“遞增”垃圾收集器來通過將它們的工作與來自主程序的動作交織而降低這種中斷性。需要進(jìn)行仔細(xì)的設(shè)計來確保主程序不干擾垃圾收集器且反之亦然。例如,當(dāng)程序需要分配新的對象時,運(yùn)行時系統(tǒng)可能需要將它掛起直到收集循環(huán)結(jié)束為止,或者以某種方式通知垃圾收集器存在新的可達(dá)對象。
      最后,并發(fā)垃圾收集器可以在對稱多處理機(jī)上與主程序?qū)崟r同時運(yùn)行??赡苄枰獜?fù)雜的鎖定機(jī)制來保證正確性。此外,高速緩存問題也使這個沒有人們所想象的那么有幫助。但是無論如何,對具有高性能要求的SMP應(yīng)用來說,并發(fā)GC可能是所希望的。
      已經(jīng)開發(fā)了上述垃圾收集機(jī)制用于其中存在處理器一致性、例如單一處理器或?qū)ΨQ多處理(SMP)系統(tǒng)的數(shù)據(jù)處理環(huán)境。當(dāng)企圖將這樣的垃圾收集機(jī)制應(yīng)用到非一致數(shù)據(jù)處理系統(tǒng),即諸如非SMP協(xié)處理器系統(tǒng)、軟件管理的存儲器系統(tǒng)、非一致存儲器訪問(NUMA)系統(tǒng)之類的異構(gòu)系統(tǒng)時,可能產(chǎn)生許多問題。地址格式問題、地址翻譯問題、何時可以執(zhí)行垃圾收集以便確保到存儲器位置的指針不改、非一致性存儲器延遲等僅僅是由異構(gòu)系統(tǒng)所引起的少數(shù)幾個問題。

      發(fā)明內(nèi)容
      說明性實(shí)施例提供了用于在異構(gòu)系統(tǒng)中執(zhí)行垃圾收集的系統(tǒng)和方法。在一些說明性實(shí)施例中,垃圾收集操作分布在異構(gòu)多處理器系統(tǒng)中的多個處理器上。在其它說明性實(shí)施例中,垃圾收集操作可以由異構(gòu)多處理器系統(tǒng)中的單個處理器執(zhí)行。利用這個單個垃圾收集處理器實(shí)施例,垃圾收集處理器可以專用于僅僅執(zhí)行垃圾收集,或者除了其它服務(wù)任務(wù)之外還可以執(zhí)行垃圾收集。
      以其中垃圾收集分布在多個處理器上的說明性實(shí)施例為例,每個處理器得到一塊系統(tǒng)存儲器,即用于所討論程序的堆的一部分,以及全局標(biāo)記隊(duì)列的一部分,并且將它們存儲在與這個處理器相關(guān)聯(lián)的本地存儲中。因此,每個處理器會具有全局標(biāo)記隊(duì)列的不同部分的拷貝,其通常是全局標(biāo)記隊(duì)列的開頭部分,以及該處理器在其上進(jìn)行操作的系統(tǒng)存儲器的相應(yīng)不同部分的拷貝。將全局標(biāo)記隊(duì)列的這部分中引用的存儲器對象添加到本地標(biāo)記堆棧中,該本地標(biāo)記堆棧包含到在本地存儲中存儲的存儲器塊中出現(xiàn)的存儲器對象的指針或地址。
      基于全局標(biāo)記隊(duì)列的相應(yīng)部分中引用的系統(tǒng)存儲器對象,由相應(yīng)的處理器在每個系統(tǒng)存儲器塊上執(zhí)行“標(biāo)記和掃描”操作,其中該全局標(biāo)記隊(duì)列提供了每個處理器中的本地標(biāo)記堆棧的初始內(nèi)容。如本領(lǐng)域中通常所知的那樣,這樣的“標(biāo)記和掃描”操作涉及迭代遍歷由其它存儲器對象對存儲器對象的引用,并且將所有那些存儲器對象標(biāo)記為可達(dá)。
      當(dāng)每次只在一塊系統(tǒng)存儲器塊上操作時,經(jīng)常這樣的遍歷將導(dǎo)致對不在正在其上進(jìn)行操作的系統(tǒng)存儲器塊內(nèi)的存儲器對象的引用。除了對可達(dá)和不可達(dá)存儲器對象的引用進(jìn)行跟蹤之外,還必須跟蹤這樣的引用。
      為了跟蹤各種類型的存儲器對象,說明性實(shí)施例中的本地垃圾收集操作利用本地標(biāo)記堆棧和非本地標(biāo)記堆棧。本地標(biāo)記堆棧存儲指向這樣的存儲器對象的指針或地址,其中這些存儲器對象處于加載到處理器的本地存儲中的系統(tǒng)存儲器塊中。非本地標(biāo)記堆棧存儲到這樣的存儲器對象的指針或地址,其中這些存儲器對象由諸如其他存儲器對象之類的軟件程序引用,但是不處于加載到本地存儲中的當(dāng)前系統(tǒng)存儲器塊中。
      最初,部分全局標(biāo)記隊(duì)列用于用指向存在于加載到本地存儲中的系統(tǒng)存儲器塊中的存儲器對象的指針來填充本地標(biāo)記堆棧。當(dāng)在指向本地標(biāo)記堆棧中的存儲器對象的指針上執(zhí)行“標(biāo)記和掃描”操作時,可能會遇到指向未存在于加載到本地存儲中的系統(tǒng)存儲器塊中的其它存儲器對象的其它指針。當(dāng)遇到這樣的指針時,將該指針添加到非本地標(biāo)記堆棧中。以用于存儲器對象的標(biāo)記描述符或用于系統(tǒng)存儲器塊的標(biāo)記描述符,將在本地存儲中的系統(tǒng)存儲器塊中、被發(fā)現(xiàn)可達(dá)的存儲器對象標(biāo)記為可達(dá)。為本地標(biāo)記堆棧中的每個指針或地址繼續(xù)這個處理。
      在基于本地存儲中的相應(yīng)系統(tǒng)存儲器塊、執(zhí)行了對用于填充本地標(biāo)記堆棧的部分全局標(biāo)記隊(duì)列中的引用的標(biāo)記之后,引用或指針要么在標(biāo)記描述符中標(biāo)記為可達(dá)或不可達(dá),要么如果引用是對不在系統(tǒng)存儲器塊內(nèi)的存儲器對象的引用,則其被置于第二標(biāo)記堆棧中。
      例如,通過使用顯式堆棧存儲已知為可達(dá)但還未檢查其內(nèi)容的對象(即,“灰色”對象),可以執(zhí)行將指向存儲器對象的指針放置到本地或非本地標(biāo)記堆棧中的操作。堆棧中的每項(xiàng)都可以包含基地址和偏移地址,其中該偏移地址指示可能的指針相對于開始地址的位置。
      有關(guān)已經(jīng)在標(biāo)記和掃描操作期間達(dá)到的存儲器對象的信息優(yōu)選為存儲在標(biāo)記描述符中以指示存儲器對象的可達(dá)性,其中該標(biāo)記描述符使用與存儲器對象、系統(tǒng)存儲器,或更特別地與系統(tǒng)存儲器的每個頁面相關(guān)聯(lián)的位圖或其它恰當(dāng)?shù)拿枋龇砀?。在一些?shí)施例中,例如,在用于存儲器對象駐留其中的存儲器頁的頁描述符中,可以使用與存儲器對象相關(guān)聯(lián)的恰當(dāng)位。
      在操作期間,在用于處理器的部分全局標(biāo)記隊(duì)列中引用的存儲器對象最初置于本地標(biāo)記堆棧中。然后使用標(biāo)記和掃描操作來檢查本地標(biāo)記堆棧中的項(xiàng)目,以確定加載到這個處理器的本地存儲中的系統(tǒng)存儲器塊內(nèi)的這些存儲器對象的可達(dá)性。同樣地,利用已知的標(biāo)記和掃描操作檢查與這些存儲器對象相關(guān)聯(lián)的引用,以確定與可達(dá)的最初存儲器對象相關(guān)聯(lián)的其它存儲器對象。利用該說明性實(shí)施例,重復(fù)這個處理,直到遇到?jīng)]有其它相關(guān)聯(lián)的存儲器對象的存儲器對象為止,或者直到遇到對不在加載到本地存儲中的系統(tǒng)存儲器塊中存在的存儲器對象(在下文中稱為“非本地”存儲器對象)的引用為止。在后者的情況下,將到“非本地”存儲器對象的引用添加到非本地標(biāo)記堆棧中,并且不在對應(yīng)的標(biāo)記描述符中標(biāo)記為可達(dá)。
      當(dāng)已經(jīng)由處理器檢查了用于填充本地標(biāo)記堆棧的部分全局標(biāo)記隊(duì)列中的所有系統(tǒng)存儲器對象、并且因此以上述的方式檢查了它們相關(guān)聯(lián)的存儲器對象時,這部分全局標(biāo)記隊(duì)列中未標(biāo)記為可達(dá)的系統(tǒng)存儲器對象,如果有的話,則是作為回收它們的存儲器部分的候選者的系統(tǒng)存儲器對象。但是,此時不能回收這個系統(tǒng)存儲器,這是因?yàn)榭赡艽嬖趶娜謽?biāo)記隊(duì)列的其它部分中的系統(tǒng)存儲器對象對這些對象的引用,其中取決于特定的實(shí)施例,這些部分可以由或可以不由異構(gòu)多處理器系統(tǒng)中的其它處理器所處理。指示為可達(dá)的存儲器對象是它的系統(tǒng)存儲器不能被回收的對象。將關(guān)于這些存儲器對象的信息合并回到全局標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)中,其中該全局標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)概括了系統(tǒng)存儲器中存儲的所有存儲器對象的可達(dá)性。
      其引用是本地標(biāo)記堆棧或非本地標(biāo)記堆棧的一部分的對象是“灰色”存儲器對象,即可達(dá)、但是還未分析關(guān)于它們可以達(dá)到什么對象的對象。為了完成垃圾收集,對象的“灰色”集合必須是空的,即沒有地址可以保留在任何處理單元中的任何本地或非本地標(biāo)記堆棧上,或者全局標(biāo)記隊(duì)列中。為實(shí)現(xiàn)這個,理想上,分析所有本地標(biāo)記堆棧中的引用,直到本地標(biāo)記堆棧為空為止,并且將非本地標(biāo)記堆棧合并回到全局標(biāo)記堆棧中。
      對非本地標(biāo)記堆棧中的存儲器對象的引用與仍然需要跟蹤的部分全局標(biāo)記隊(duì)列以及其它處理器的其它非本地標(biāo)記堆棧合并,由此產(chǎn)生更新的全局標(biāo)記隊(duì)列的“要跟蹤”部分。作為結(jié)果,可以由相同或不同的處理器用其它系統(tǒng)存儲器塊重新檢查對不在系統(tǒng)存儲器塊的本地存儲拷貝中的存儲器對象的引用??梢灾貜?fù)這個過程,直到更新的全局標(biāo)記隊(duì)列的“要跟蹤”部分不包含對系統(tǒng)存儲器對象的引用為止。
      當(dāng)在全局標(biāo)記隊(duì)列已更新的“要跟蹤”部分中不再存在對系統(tǒng)存儲器對象的引用時,每個對系統(tǒng)存儲器對象的引用將已經(jīng)被標(biāo)記為可達(dá)或不可達(dá)。那些對全局標(biāo)記隊(duì)列的“不可達(dá)”部分中的系統(tǒng)存儲器對象的引用與其系統(tǒng)存儲器可被回收的系統(tǒng)存儲器對象相關(guān)聯(lián)。與所有其它系統(tǒng)存儲器對象相關(guān)聯(lián)的系統(tǒng)存儲器可通過軟件程序達(dá)到,因此不被回收。然后,可以執(zhí)行回收處理以回收與全局標(biāo)記隊(duì)列的“已跟蹤”部分中的系統(tǒng)存儲器對象相關(guān)聯(lián)的系統(tǒng)存儲器。這樣的回收處理在技術(shù)上通常是已知的。
      在一個說明性實(shí)施例中,提供了一種在多處理器數(shù)據(jù)處理系統(tǒng)中、用于在共享存儲器上執(zhí)行垃圾收集操作的方法。該方法包含在多處理器數(shù)據(jù)處理系統(tǒng)的處理器中加載與共享存儲器的一部分相對應(yīng)的全局標(biāo)記隊(duì)列的一部分。基于對分配給該處理器的部分全局標(biāo)記隊(duì)列中的存儲器對象的引用,可以在該部分共享存儲器上執(zhí)行標(biāo)記操作,以由此識別其相關(guān)聯(lián)存儲器不能作為垃圾收集操作的一部分被回收的可達(dá)存儲器對象。該方法還包含在標(biāo)記操作期間,識別對不在分配給該處理器的該部分共享存儲器中的存儲器對象的引用,用于作為垃圾收集操作一部分的進(jìn)一步處理。該部分全局標(biāo)記隊(duì)列可以小于全局標(biāo)記隊(duì)列的整個部分。與該部分全局標(biāo)記隊(duì)列的相對應(yīng)的部分共享存儲器可以小于共享存儲器的整個部分。
      加載與部分共享存儲器相對應(yīng)的部分全局標(biāo)記隊(duì)列可以包含最初,基于對部分全局標(biāo)記隊(duì)列中的存儲器對象的引用而填充本地標(biāo)記堆棧。與該部分全局標(biāo)記隊(duì)列相對應(yīng)的部分共享存儲器可以加載到處理器的本地存儲中。多處理器數(shù)據(jù)處理系統(tǒng)的多個處理器中的每個處理器可以加載全局標(biāo)記隊(duì)列的不同部分和共享存儲器相應(yīng)的不同部分,并且基于全局標(biāo)記隊(duì)列不同部分中的存儲器對象引用,在共享存儲器的不同部分上執(zhí)行標(biāo)記操作。
      基于對存儲器對象的引用、在該部分共享存儲器上執(zhí)行標(biāo)記操作可以包含跟蹤在該部分全局標(biāo)記隊(duì)列中的存儲器對象引用以及對從屬存儲器對象的引用,直到標(biāo)識出對不在該部分共享存儲器內(nèi)的存儲器對象的引用為止。對在該部分共享存儲器內(nèi)的存儲器對象的引用可以存儲在本地標(biāo)記堆棧中。對不在該部分共享存儲器內(nèi)的存儲器對象的引用可以存儲在非本地標(biāo)記堆棧中。
      該方法還可以包含合并與本地標(biāo)記堆棧相關(guān)聯(lián)的本地標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)和全局標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)。該方法也可以包含合并非本地標(biāo)記堆棧與全局標(biāo)記隊(duì)列的“要跟蹤”部分。全局標(biāo)記隊(duì)列的“要跟蹤”部分可以包含要通過執(zhí)行標(biāo)記操作來處理的存儲器對象引用。本地標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)可以包含對象的引用處于本地標(biāo)記堆棧中的存儲器對象的可達(dá)性信息。全局標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)可以包含在多處理器數(shù)據(jù)處理系統(tǒng)的處理器的本地標(biāo)記堆棧中、所有對被標(biāo)識為在部分共享存儲器內(nèi)的存儲器對象的引用。
      多處理器數(shù)據(jù)處理系統(tǒng)可以是異構(gòu)多處理器數(shù)據(jù)處理系統(tǒng),其包含控制處理器和至少一個協(xié)處理器??刂铺幚砥骱椭辽僖粋€協(xié)處理器可以使用不同的指令集操作。全局標(biāo)記隊(duì)列的一部分的加載、標(biāo)記操作的執(zhí)行、以及對不在該部分共享存儲器內(nèi)的存儲器對象的引用的標(biāo)識可以由所述至少一個協(xié)處理器中的一個或多個執(zhí)行。加載、執(zhí)行和標(biāo)識操作可以由所述至少一個協(xié)處理器中的一個或多個中的存儲器流控制器執(zhí)行。
      在其它說明性實(shí)施例中,提供了包含具有計算機(jī)可讀程序的計算機(jī)可用介質(zhì)的計算機(jī)程序產(chǎn)品。當(dāng)計算機(jī)可讀程序在計算設(shè)備上執(zhí)行時,使計算設(shè)備執(zhí)行上面關(guān)于方法說明性實(shí)施例給出的各種操作及其組合。
      在還有另一個說明性實(shí)施例中,提供了用于執(zhí)行垃圾收集的系統(tǒng)。該系統(tǒng)可以包含多個處理器,每個處理器具有相關(guān)聯(lián)的本地存儲;以及耦合到所述多個處理器的共享存儲器。所述多個處理器中的一個或多個處理器可以執(zhí)行上面關(guān)于方法說明性實(shí)施例給出的各種操作及其組合。
      這些和其它特征和優(yōu)點(diǎn)將在下面的說明性實(shí)施例的詳細(xì)描述中說明,或者考慮到下面的說明性實(shí)施例的詳細(xì)描述,而對那些本領(lǐng)域的一般技術(shù)人員變得顯然。


      附加的權(quán)利要求中闡述了被認(rèn)為是本發(fā)明特有的新穎特征。然而,通過參考下面結(jié)合附圖閱讀的說明性實(shí)施例的詳細(xì)說明,將最好地理解本發(fā)明本身及其使用的優(yōu)選模式、以及進(jìn)一步的目的和優(yōu)點(diǎn),其中圖1是其中可以實(shí)現(xiàn)該說明性實(shí)施例的示范性方面的異構(gòu)多處理器系統(tǒng)的示范性框圖;圖2是說明其中可以實(shí)現(xiàn)該說明性實(shí)施例的示范性方面的存儲器流控制器的示范性圖示;
      圖3是根據(jù)一個說明性實(shí)施例、可以用于執(zhí)行垃圾收集的垃圾收集機(jī)制的示范性圖示;圖4是說明根據(jù)一個說明性實(shí)施例的分布式垃圾收集操作的示范性圖示;圖5是說明根據(jù)另一個說明性實(shí)施例的、其中利用了預(yù)排序的增強(qiáng)標(biāo)記和掃描操作的分布式垃圾收集操作的示范性圖示;以及圖6是概括根據(jù)一個說明性實(shí)施例、用于執(zhí)行垃圾收集的示范性操作的流程圖。
      具體實(shí)施例方式
      說明性實(shí)施例提供了用于在異構(gòu)系統(tǒng)中執(zhí)行垃圾收集的系統(tǒng)和方法。說明性實(shí)施例的機(jī)制可以在其中需要執(zhí)行垃圾收集的任何異構(gòu)多處理器系統(tǒng)中實(shí)現(xiàn)。這樣的異構(gòu)多處理器系統(tǒng)的例子包括NUMA系統(tǒng)、非SMP多處理器系統(tǒng)等。其中可以實(shí)現(xiàn)說明性實(shí)施例的示范性方面的一個這樣的異構(gòu)多處理器系統(tǒng)是可以從紐約Armonk的國際商業(yè)機(jī)器公司得到的單元寬帶引擎(CBE,Cell Broadband Engine)。雖然將就正在CBE結(jié)構(gòu)中實(shí)現(xiàn)的機(jī)制來說明說明性實(shí)施例,但是應(yīng)該理解這只是示范性的,并且說明性實(shí)施例的機(jī)制也可以在其它異構(gòu)多處理器系統(tǒng)中實(shí)現(xiàn)而不背離本發(fā)明的精神和范圍。
      圖1是其中可以實(shí)現(xiàn)本發(fā)明的各方面的數(shù)據(jù)處理系統(tǒng)的示范性框圖。圖1中所示的示范性數(shù)據(jù)處理系統(tǒng)是單元寬帶引擎(CBE)數(shù)據(jù)處理系統(tǒng)的示例。雖然將在本發(fā)明優(yōu)選實(shí)施例的描述中使用CBE,但是本領(lǐng)域的技術(shù)人員通過閱讀下面的描述顯然可知本發(fā)明不限于此。
      如圖1中所示,CBE 100包括電源處理器元件(PPE)110,其包含處理器(PPU)116和它的L1和L2高速緩存112和114;以及多個協(xié)處理器元件(SPE),每個都具有它自己的協(xié)處理器單元(SPU)140-154、存儲器流控制155-162、本地存儲器或存儲設(shè)備(LS)163-170,以及總線接口單元(BIU單元)180-194,其中該總線接口單元可以是,例如組合的直接存儲器存取(DMA)、存儲器管理單元(MMU)和總線接口單元。還提供了高帶寬內(nèi)部元件互聯(lián)總線(EIB)196、總線接口控制器(BIC)197、和存儲器接口控制器(MIC)198。
      CBE 100可以是片上系統(tǒng),以便可以在單個微處理器芯片上提供圖1所述的每個元件。此外,CBE 100是異構(gòu)處理環(huán)境,其中每個SPU可以從系統(tǒng)中每個其它SPU接收不同的指令。此外,用于SPU的指令集不同于用于PPU的指令集,例如PPU可以執(zhí)行基于精簡指令集計算機(jī)(RISC)的指令,而SPU執(zhí)行SIMD矢量指令。
      SPE互相耦接,并且經(jīng)由EIB 196耦接到L2高速緩存114。另外,SPE經(jīng)由EIB 196耦接到MIC 198和BIC 197。MIC 198提供到共享存儲器199的通信接口。BIC 197提供在CBE 100和其它外部總線和設(shè)備之間的接口。
      PPE 110是雙線程的PPE 110。這個雙線程的PPE 110與8個SPE的組合使得CBE 100能夠處理10個同時線程以及超過128個未完成的存儲器請求。PPE 110起其它8個SPE的控制器的作用,這8個SPE處理大部分計算工作負(fù)載。例如,PPE 110可以用于運(yùn)行傳統(tǒng)的操作系統(tǒng),而SPE執(zhí)行矢量化的浮點(diǎn)代碼執(zhí)行處理。
      SPE包含協(xié)處理單元(SPU)140-154,存儲器流控制單元155-162,本地存儲器或存儲設(shè)備163-170,以及接口單元180-194。在一個示范性實(shí)施例中,本地存儲器或存儲設(shè)備163-170包含256KB指令和數(shù)據(jù)存儲器,該存儲器對于PPE 110是可見的,并且可以由軟件直接尋址。
      PPE 110可以用小程序或線程加載SPE,將SPE鏈在一起以處理復(fù)雜操作中的每個步驟。例如,并入CBE 100的機(jī)頂盒可以加載用于讀取DVD、視頻和音頻解碼、以及顯示的程序,而且數(shù)據(jù)將從一個SPE傳遞到另一個SPE,直到它最終在輸出顯示器上結(jié)束為止。在4GHz處,每個SPE給出理論上的32GFLOPS的性能,而且PPE 110具有類似的性能級別。
      存儲器流控制單元(MFC)155-162起SPU到系統(tǒng)其它部分以及其它元件的接口的作用。MFC 155-162提供了用于數(shù)據(jù)傳輸、保護(hù)、以及在主存儲設(shè)備與本地存儲163-170之間的同步的主要機(jī)制。邏輯上存在用于處理器中的每個SPU的MFC。一些實(shí)現(xiàn)可以在多個SPU之間共享單個MFC的資源。在這樣的情況下,所有為MFC定義的工具和命令必須獨(dú)立于用于每個SPU的軟件而出現(xiàn)。共享MFC的效果受限于實(shí)現(xiàn)相關(guān)的工具和命令。
      圖2是根據(jù)本發(fā)明的示范性實(shí)施例的典型存儲器流控制(MFC)單元200的示范性框圖。在這個示范性實(shí)施例中,MFC 200具有2個到SPU的接口210和212、2個到總線接口單元(BIU)220的接口214和216、以及2個到可選的SL1高速緩存230的接口222和224。SPU接口210和212是SPU信道接口210和SPU本地存儲接口212。SPU信道接口210允許SPU存取MFC工具并發(fā)出MFC命令。SPU本地存儲接口212由MFC 200使用來存取SPU中的本地存儲。一個到BIU 220的接口216允許存儲器映射I/O(MMIO)對MFC工具的存取。這個接口216還允許其它處理器發(fā)出MFC命令。使用MMIO而發(fā)出的命令稱為MFC代理命令。
      到SL1高速緩存的接口222和224主要用于數(shù)據(jù)傳輸。一個接口222由MFC 200使用來存取主存儲設(shè)備中的地址翻譯表,以及另一個接口224用于在主存儲設(shè)備和本地存儲之間的數(shù)據(jù)傳輸。
      如圖2所示,典型MFC中的主要單元包括存儲器映射輸入/輸出(MMIO)接口240、MFC寄存器250和DMA控制器260。MMIO接口230將SPU的MFC工具映射到系統(tǒng)的實(shí)際地址空間。這允許從系統(tǒng)中的任何處理器或任何設(shè)備訪問MFC工具。另外,可以將MMIO接口240配置為將SPU的本地存儲映射到實(shí)際地址空間中。這允許從系統(tǒng)中的任何處理器或任何設(shè)備直接訪問本地存儲,使能進(jìn)行本地存儲到本地存儲傳輸以及I/O設(shè)備能夠直接存取SPU的本地存儲域。
      MFC寄存器單元250包含大多數(shù)MFC工具。對本發(fā)明特別重要的是,MFC寄存器單元250包括SPU本地存儲限制寄存器工具。使用這個工具,有特權(quán)的軟件可以設(shè)置SPE的本地存儲大小的限制,這將在以下更詳細(xì)地說明。
      數(shù)據(jù)同步和傳輸通常是MFC 200內(nèi)的DMAC 260的職責(zé)。DMAC 260可以在SPU的本地存儲和主存儲區(qū)域之間移動數(shù)據(jù)??蛇x地,數(shù)據(jù)可以在SL1高速緩存中緩存。
      SPE和PPE通過經(jīng)由命令隊(duì)列270和280之一排隊(duì)到MFC的DMA命令請求,來指示MFC 200執(zhí)行這些DMA操作。由SPE發(fā)出的命令排隊(duì)到MFC SPU命令隊(duì)列270中。由PPE發(fā)出的命令排隊(duì)到MFC代理命令隊(duì)列280中。MFC使用存儲器映射單元(MMU)290來執(zhí)行DMA傳輸所需要的所有MFC地址翻譯和MFC存取保護(hù)檢查。
      MFC命令提供了使在SPU中執(zhí)行的代碼能夠訪問主存儲設(shè)備并且保持與系統(tǒng)中的其它處理器和其它設(shè)備同步的主要方法。還提供了命令來管理可選的高速緩存。MFC命令可以由SPU上運(yùn)行的代碼,或者由在諸如PPE之類的另一個處理器或設(shè)備上運(yùn)行的代碼發(fā)出。在相關(guān)聯(lián)的SPU上運(yùn)行的代碼執(zhí)行一系列信道指令以發(fā)出MFC命令。在其它處理器或設(shè)備運(yùn)行上的代碼執(zhí)行一系列存儲器映射的I/O(MMIO)傳輸以發(fā)出MFC命令到SPE。將發(fā)出的命令排隊(duì)到命令隊(duì)列270和280之一中。
      一般而言,可以使用MFC寄存器單元250中的MMIO寄存器,或者通過由相關(guān)聯(lián)的SPU執(zhí)行的信道指令來對命令排隊(duì)。MMIO方法意圖由PPE使用以代表SPE控制主存儲設(shè)備和相關(guān)聯(lián)的本地存儲之間的數(shù)據(jù)傳輸。傳輸數(shù)據(jù)的MFC命令稱為MFC DMA命令。MFC DMA命令的數(shù)據(jù)傳輸方向總是從SPE的角度來考慮。因此,將數(shù)據(jù)傳輸?shù)絊PE中(從主存儲設(shè)備到本地存儲)的命令被認(rèn)為是獲得命令,而將數(shù)據(jù)傳輸出SPE(從本地存儲到主存儲設(shè)備)的命令被認(rèn)為是放出命令。
      傳輸數(shù)據(jù)的命令稱為MFC DMA命令。將這些命令轉(zhuǎn)換為在本地存儲域和主存儲設(shè)備域之間的DMA傳輸。每個MFC通常能夠同時支持多個DMA傳輸,并且能夠保留和處理多個MFC命令。每個MFC DMA數(shù)據(jù)傳輸命令請求涉及本地存儲地址(LSA)和有效地址(EA)。本地存儲地址只能夠直接尋址它相關(guān)聯(lián)的SPU的本地存儲區(qū)域。有效地址具有更廣泛的應(yīng)用,因?yàn)樗軌蛞弥鞔鎯υO(shè)備,而且如果SPU本地存儲區(qū)域通過別名而進(jìn)入實(shí)際地址空間,則還包括所有SPU本地存儲區(qū)域。
      說明性實(shí)施例提供了用于在諸如上述單元寬帶引擎(CBE)之類的異構(gòu)多處理器系統(tǒng)中執(zhí)行垃圾收集操作的機(jī)制。使用CBE作為其中可以利用示范性實(shí)施例的機(jī)制的其它異構(gòu)多處理器系統(tǒng)的范例,則可以在每個SPE中提供垃圾收集機(jī)制以執(zhí)行如下所述的說明性實(shí)施例的垃圾收集操作。例如,垃圾收集機(jī)制可以包含與SPE的存儲器流控制器(MFC)集成的硬件和/或軟件元件。另外,可以向PPE 110提供類似機(jī)制來執(zhí)行垃圾收集。
      在一些說明性實(shí)施例中,垃圾收集操作分布在異構(gòu)多處理器系統(tǒng)如CBE100中的多個處理器如SPE 120-134上。在其它說明性實(shí)施例中,垃圾收集操作可以由異構(gòu)多處理器系統(tǒng)中的單個處理器如SPE 134執(zhí)行。對這個單個垃圾收集處理器實(shí)施例,垃圾收集處理器如SPE 134,可以專用于僅僅執(zhí)行垃圾收集,或者可以在除了其它服務(wù)任務(wù)之外,還執(zhí)行垃圾收集。
      應(yīng)該注意到,在下面的說明性實(shí)施例的描述中,將引用可互換使用的“系統(tǒng)存儲器”和“共享存儲器”。這樣的引用意圖是引用用作正在討論中的特定程序的堆的那部分系統(tǒng)存儲器或共享存儲器。因此,可能存在很多在異構(gòu)多處理器系統(tǒng)內(nèi)運(yùn)行的不同程序,它們利用共享或系統(tǒng)存儲器,并且它們每個都具有它們自己的堆用于存儲器動態(tài)分配。因此,這里描述的垃圾收集相對于分配給感興趣的特定程序的系統(tǒng)存儲器或共享存儲器來執(zhí)行。采用其中垃圾收集分布在多個SPE 120-134上的說明性實(shí)施例,在一個說明性實(shí)施例中,PPE 110可以命令SPE執(zhí)行垃圾收集,以便回收分配給不再由異構(gòu)處理器系統(tǒng)中運(yùn)行的程序引用的存儲器對象(在下文中稱為“系統(tǒng)存儲器對象”)的部分共享存儲器199。在作為替換的說明性實(shí)施例中,SPE120-134可以基于預(yù)定的準(zhǔn)則、例如共享存儲器199中的空閑空間數(shù)量低于閾值,來獨(dú)立地確定需要垃圾收集,而且它們自己可以啟動垃圾收集操作。在這樣的作為替換的實(shí)施例中,檢測需要進(jìn)行垃圾收集的SPE 120-134可以將這個需要傳遞給其它SPE 120-134和PPE 110。
      響應(yīng)于來自PPE 110或者SPE 120-134的指令,SPE 120-134產(chǎn)生用于執(zhí)行以下描述的垃圾收集操作的垃圾收集線程。SPE 120-134以及可能的PPE110,諸如在“世界停止”類型垃圾收集中那樣,停止它們對線程的執(zhí)行,并且執(zhí)行所產(chǎn)生的收集線程,以便執(zhí)行垃圾收集。
      作為垃圾收集的一部分,PPE 110產(chǎn)生全局標(biāo)記隊(duì)列,該隊(duì)列包含用于所運(yùn)行的程序的、對共享存儲器199中的存儲器對象的引用。這樣的全局標(biāo)記隊(duì)列的產(chǎn)生在本技術(shù)領(lǐng)域通常是已知的,并且不在這里提供細(xì)節(jié)。例如,生成全局標(biāo)記隊(duì)列并且與并行垃圾收集一起使用全局標(biāo)記隊(duì)列通常在Boehm所著、2000年惠普公司的惠普實(shí)驗(yàn)室技術(shù)報告2000-165的“FastMultiprocessor Memory Allocation and Garbage Collection”中進(jìn)行了描述,該技術(shù)內(nèi)容通過引用在此并入。
      可以由例如存儲器頁來組織全局標(biāo)記隊(duì)列,以便對相同存儲器頁上存儲的系統(tǒng)存儲器對象的引用在全局標(biāo)記隊(duì)列中表示為相鄰項(xiàng)目。以這種方式,部分全局標(biāo)記隊(duì)列可以容易地與部分共享存儲器199相關(guān)聯(lián)。
      每個SPE 120-134的收集線程都獲得一塊共享存儲器199以及全局標(biāo)記隊(duì)列中的相應(yīng)部分,并且將它們存儲在與SPE 120-134相關(guān)聯(lián)的本地存儲163-170中。因此,每個SPE 120-134將具有該SPE在其上進(jìn)行操作的全局標(biāo)記隊(duì)列不同部分的拷貝以及共享存儲器199中的相應(yīng)不同塊的拷貝。在這個描述的上下文中,存儲器“塊”是正在其上工作的存儲器區(qū)域。在優(yōu)選實(shí)施例中,這個區(qū)域是相鄰和協(xié)調(diào)定位的,但是在其它實(shí)施例中,存儲器“塊”可以包含系統(tǒng)或共享存儲器199中、多個邏輯或者另外有關(guān)的數(shù)據(jù)部分。
      在每個SPE 120-134上運(yùn)行的收集線程基于在全局標(biāo)記隊(duì)列相應(yīng)部分中引用的系統(tǒng)存儲器對象、對它們各自的共享存儲器199中的塊執(zhí)行“標(biāo)記和掃描”操作。由SPE 120-134檢索的該部分全局標(biāo)記隊(duì)列包含從程序到要由“標(biāo)記和掃描”操作檢查的系統(tǒng)存儲器對象的引用,即指針。這些引用和它們對從屬存儲器對象的引用要在“標(biāo)記和掃描”操作期間跟蹤,由此識別出哪些存儲器對象可由所關(guān)注程序達(dá)到以及不可達(dá)到。
      引用或指針利用共享存儲器地址空間,并且因此需要被翻譯為用于SPE120-134的本地存儲地址空間,這是因?yàn)楝F(xiàn)在正被檢查的共享存儲器199中的塊位于與SPE 120-134相關(guān)聯(lián)的本地存儲163-170內(nèi)。這樣的地址翻譯可以涉及,例如,獲取共享存儲器199地址,減去被傳輸?shù)奖镜卮鎯Φ膲K的基地址,并且加上本地存儲偏移。這個地址翻譯給出了由該部分全局標(biāo)記隊(duì)列中的全局地址空間指針?biāo)玫耐粋€系統(tǒng)存儲器對象的本地存儲空間地址。本領(lǐng)域的一般技術(shù)人員將認(rèn)識到說明性實(shí)施例可以利用其它地址空間之間翻譯方式,而沒有背離本發(fā)明的精神和范圍。
      在由收集線程執(zhí)行“標(biāo)記和掃描”操作期間,由該部分全局標(biāo)記隊(duì)列引用的初始存儲器對象將出現(xiàn)在加載到相應(yīng)本地存儲163-170中的該共享存儲器199的塊中。但是,該共享存儲器199中的塊可以包含其它未由該部分全局標(biāo)記隊(duì)列中的指針引用的存儲器對象(并且因此,如果該存儲器對象未由其指針在其它部分全局標(biāo)記隊(duì)列中的存儲器對象引用,則可能是“不可達(dá)的”)或者未由其指針在全局標(biāo)記隊(duì)列其它部分中的其它存儲器對象引用的存儲器對象。
      此外,在“標(biāo)記和掃描”操作期間,可能遇到對其它不在加載到特定SPE的本地存儲163-170中的共享存儲器199的該塊內(nèi)的對象的引用。必須與對在加載到本地存儲163-170中的共享存儲器199的該塊中的可達(dá)和不可達(dá)存儲器對象的跟蹤一起,跟蹤對共享存儲器199的其它塊中的存儲器對象的引用。
      為了跟蹤各種類型的存儲器對象,由說明性實(shí)施例的收集線程執(zhí)行的本地“標(biāo)記和掃描”操作為每個SPE 120-134利用兩個標(biāo)記堆棧。第一標(biāo)記堆棧,即本地標(biāo)記堆棧,存儲對可以由軟件程序達(dá)到的、在加載到SPE 120-134的本地存儲163-170中的共享存儲器199的該塊中的存儲器對象的指針或引用。本地標(biāo)記堆棧由與它在共享存儲器199中的相應(yīng)塊一起加載到SPE中的部分全局標(biāo)記隊(duì)列所填充。這個本地標(biāo)記堆棧在標(biāo)記和掃描操作期間被遍歷,以根據(jù)標(biāo)記操作跟蹤本地標(biāo)記堆棧中引用的每個存儲器對象,由此從本地標(biāo)記堆棧中引用的存儲器對象中標(biāo)記所有可達(dá)的存儲器對象。
      第二標(biāo)記堆棧,即非本地標(biāo)記堆棧,存儲指向由軟件程序引用、但不在加載到本地存儲163-170中的共享存儲器199的當(dāng)前塊中的存儲器對象的指針。在跟蹤本地標(biāo)記堆棧中引用的存儲器對象期間,將指向存儲器對象的指針或地址添加到非本地標(biāo)記堆棧中。即,在跟蹤由本地標(biāo)記堆棧中的存儲器對象可達(dá)的存儲器對象期間,可能遭遇到指向不在本地存儲中存儲的共享存儲器199的該塊內(nèi)的另一個存儲器對象的引用或指針。響應(yīng)于這樣的事件,將指向這個“非本地”存儲器對象的引用或指針添加到非本地標(biāo)記堆棧中。
      例如,可以通過使用顯式堆棧來存儲已知可達(dá)、但是其內(nèi)容還未被檢查的對象(即,“灰色”對象),來執(zhí)行將執(zhí)行存儲器對象的指針放入各種堆棧中的操作。堆棧中的每個項(xiàng)目包含基地址和偏移,該偏移指示可能的指針相對于那個起始地址的相對位置。偏移通常采用簡單的長度規(guī)定、位向量等的形式用于說明指針位置。
      每個存儲器對象可以具有相關(guān)聯(lián)的標(biāo)記描述符,該標(biāo)記描述符將存儲器對象標(biāo)識為可達(dá)或不可達(dá)。用于每個存儲器對象的標(biāo)記描述符可以是用于共享存儲器199中的塊、共享存儲器的頁等的一般標(biāo)記描述符的一部分。作為復(fù)制到SPE 120-134的本地存儲163-170中的該部分全局標(biāo)記隊(duì)列的一部分、并且還未被跟蹤的存儲器對象可以最初將它們的標(biāo)記描述符設(shè)置為例如“0”或“00”,以指示這些對象是不可達(dá)的。此后,在“標(biāo)記和掃描”操作的標(biāo)記階段期間,當(dāng)作出存儲器對象可達(dá)的確定時,可以將這些標(biāo)記描述符值設(shè)置為例如“1”或“01”。
      因此,最初,在SPE 120-134上的垃圾收集操作初始化時,可以將用于討論中程序的堆中的所有存儲器對象設(shè)置為“不可達(dá)”狀態(tài)。當(dāng)由SPE檢索全局標(biāo)記隊(duì)列的一部分并且將共享存儲器199中它的相應(yīng)塊加載到本地存儲中時,將用于該部分全局標(biāo)記隊(duì)列中的存儲器對象的地址和偏移添加到本地標(biāo)記堆棧中。另外,可以將用于該存儲器對象的標(biāo)記描述符添加到用于共享存儲器199中的該塊的一般標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)中。雖然為了清楚起見,標(biāo)記描述符在附圖中被示出并且在以下描述中被提及為和本地標(biāo)記堆棧分離的數(shù)據(jù)結(jié)構(gòu),但是應(yīng)該理解標(biāo)記描述符可以與用于添加到本地標(biāo)記堆棧的各種存儲器對象引用的、本地標(biāo)記堆棧中的項(xiàng)目相關(guān)聯(lián),并且甚至是它們的一部分。
      在最初填充了本地標(biāo)記堆棧之后,使用“標(biāo)記和掃描”垃圾收集操作中的標(biāo)記操作識別和跟蹤本地標(biāo)記堆棧中的下一個存儲器對象。即,將本地標(biāo)記堆棧中的下一個存儲器對象標(biāo)記為可達(dá),并且變?yōu)椤爱?dāng)前”存儲器對象。從加載到本地存儲中的共享存儲器199塊中識別由“當(dāng)前”存儲器對象引用的存儲器對象。進(jìn)行有關(guān)由“當(dāng)前”存儲器對象引用的存儲器對象是否在本地存儲中的共享存儲器199塊內(nèi)的確定。如果確定是這樣,則然后將用于這些存儲器對象的標(biāo)記描述符設(shè)置為“可達(dá)”狀態(tài)。
      如果在這個標(biāo)記操作期間遇到這樣的指向存儲器對象的引用或指針,其中該引用或指針指向處于與加載到本地存儲中的共享存儲器塊不同的共享存儲器199塊中的存儲器對象,則將到這個存儲器對象的引用添加到非本地標(biāo)記堆棧中。因此,通過標(biāo)記操作,將到本地標(biāo)記堆棧中的存儲器對象的引用在它們相關(guān)聯(lián)的標(biāo)記描述符中標(biāo)記為在本地存儲中的該共享存儲器199塊中可達(dá)。由本地標(biāo)記堆棧中的存儲器對象引用的其它存儲器對象在當(dāng)前處于本地存儲中的共享存儲器199塊中可以是可達(dá)或不可達(dá)。因此,這些存儲器對象可以更新它們的標(biāo)記描述符以顯示它們在共享存儲器199塊內(nèi)是可達(dá)的,或者如果它們在本地存儲中的共享存儲器199塊中實(shí)際上是不可達(dá)的,則可以將它們的引用添加到非本地標(biāo)記堆棧中。
      當(dāng)該部分全局標(biāo)記隊(duì)列中的所有系統(tǒng)存儲器對象都已經(jīng)由SPE 120-134通過如上所述的“標(biāo)記和掃描”操作檢查了時,對該共享存儲器199塊,保持不可達(dá)的系統(tǒng)存儲器對象,例如標(biāo)記描述符是“0”或“00”的系統(tǒng)存儲器對象,是讓它們的存儲器部分被回收的候選者。但是,此時不能回收這個系統(tǒng)存儲器,這是因?yàn)榭赡艽嬖趤碜匀謽?biāo)記隊(duì)列的其它部分中的系統(tǒng)存儲器對象對這些存儲器對象的其它引用,其中取決于特定實(shí)施例,這些其它部分全局標(biāo)記隊(duì)列可以或可以未由CBE 100中的其它SPE 120-134處理。
      在將系統(tǒng)存儲器對象標(biāo)記為在該共享存儲器199塊中可達(dá)(即,在本地標(biāo)記堆棧的處理期間達(dá)到)、不在該共享存儲器199塊中(即,在非本地標(biāo)記堆棧中),或者在該共享存儲器199塊中不可達(dá)(即,在該部分全局標(biāo)記隊(duì)列中保留有可能的引用,或者先前已經(jīng)達(dá)到了)之后,收集線程執(zhí)行合并操作,用于將非本地標(biāo)記堆棧中的、對存儲器對象的引用和仍然需要跟蹤的部分全局標(biāo)記隊(duì)列合并,以由此產(chǎn)生全局標(biāo)記隊(duì)列中更新的“要跟蹤”部分。作為結(jié)果,可以由相同或不同的SPE 120-134使用共享存儲器199中的其它塊重新檢查對不在該共享存儲器199塊的本地存儲拷貝中的存儲器對象的引用??梢灾貜?fù)這個處理,直到全局標(biāo)記隊(duì)列中更新的“要跟蹤”部分不包含對系統(tǒng)存儲器對象的引用為止。
      另外,收集線程將從處理本地標(biāo)記堆棧獲得的、有關(guān)存儲器對象的可達(dá)性信息如標(biāo)記描述符,與通過處理其它SPE 120-134的其它本地標(biāo)記堆棧而獲得的可達(dá)性信息相合并,以便生成全局標(biāo)記描述符中獲取的全局可達(dá)性信息。全局標(biāo)記描述符表示那些可由軟件程序達(dá)到并因此不能讓它們的系統(tǒng)存儲器被回收的系統(tǒng)存儲器對象。未在全局標(biāo)記描述符中出現(xiàn)其引用的系統(tǒng)存儲器對象是用于存儲器回收的候選者。
      將指示可達(dá)存儲器對象的本地標(biāo)記描述符與全局描述符合并可以通過執(zhí)行一組OR操作實(shí)現(xiàn)。但是,如Boehm op cit.所述的那樣,必須保證原子性。合并操作因此合并用于存儲器對象的標(biāo)記描述符,以便對于每個合并的存儲器對象存在單個項(xiàng)目來指示該存儲器對象可由所考慮的軟件程序達(dá)到。也就是說,合并操作消除了用于同一存儲器對象的任何重復(fù)項(xiàng)目。因此,利用說明性實(shí)施例,不同于更新共同標(biāo)記描述符的現(xiàn)有技術(shù)垃圾收集器,每個標(biāo)記線程包含本地塊特定的標(biāo)記描述符,所述描述符合并到用于與正在考慮的程序相關(guān)聯(lián)的堆的全局標(biāo)記描述符中。
      可以用自適應(yīng)存儲器流控制器(MFC)(該自適應(yīng)存儲器流控制器支持執(zhí)行原子讀-修改-寫循環(huán),以執(zhí)行本地標(biāo)記描述符到全局標(biāo)記描述符的邏輯或操作)、已經(jīng)被優(yōu)化以包括特定描述符合并性能的MFC、或者通過在描述符圖上使用軟件鎖來執(zhí)行合并。理想為僅僅在合并處理的短時間段期間地獲得這樣的軟件鎖。為優(yōu)化合并減少對合并鎖的爭奪,可以保持與標(biāo)記描述符的區(qū)域相對應(yīng)的多個合并鎖。
      在優(yōu)化實(shí)施例中,可以通過復(fù)制全局標(biāo)記描述符獲得用于正被處理的存儲器塊的標(biāo)記描述符。這個優(yōu)化通過減小重復(fù)跟蹤的數(shù)目而有利地減小了必須執(zhí)行的跟蹤步驟數(shù)目。在說明性實(shí)施例中,這個優(yōu)化還可以用于防止活鎖。
      還是在另一個優(yōu)化中,不用獲得用于執(zhí)行復(fù)制操作以獲得本地描述符的初始化版本的鎖。這個優(yōu)化以丟失至少一部分可能同時發(fā)生的、對被跟蹤和標(biāo)記為可達(dá)位置的更新的代價,消除了鎖同步開銷。
      可以執(zhí)行類似的合并操作,用于將非本地標(biāo)記堆棧與全局標(biāo)記隊(duì)列合并,以產(chǎn)生全局標(biāo)記隊(duì)列更新的“要跟蹤”部分。將非本地堆棧合并到全局標(biāo)記隊(duì)列中的合并操作實(shí)質(zhì)上產(chǎn)生了包含指向系統(tǒng)存儲器對象的指針的數(shù)據(jù)結(jié)構(gòu),其中每個系統(tǒng)存儲器對象在該數(shù)據(jù)結(jié)構(gòu)中只有一個項(xiàng)目。也就是說,合并操作消除了重復(fù)項(xiàng)目,以便每個系統(tǒng)存儲器對象在結(jié)果產(chǎn)生的數(shù)據(jù)結(jié)構(gòu)中只出現(xiàn)一次。該結(jié)果是仍然需要由“標(biāo)記和掃描”操作跟蹤的系統(tǒng)存儲器對象的列表。
      每當(dāng)每個SPE 120-134相對于復(fù)制到該SPE 120-134的本地存儲中的該部分全局標(biāo)記隊(duì)列和系統(tǒng)存儲器塊完成其“標(biāo)記和掃描”操作時,可以由該SPE 120-134重復(fù)上面的處理。應(yīng)該理解因?yàn)橐恍ο到y(tǒng)存儲器對象的引用被合并回全局標(biāo)記隊(duì)列的“要跟蹤”部分中,所以可以多次檢查對系統(tǒng)存儲器對象的相同引用。雖然這可能引入一些低效率,但是更有效的并行“標(biāo)記和掃描”操作比冗余檢查系統(tǒng)存儲器對象所經(jīng)歷的稍微低效率提供相對更大的性能益處。
      當(dāng)全局標(biāo)記隊(duì)列的已更新“要跟蹤”部分中沒有更多的、對系統(tǒng)存儲器對象的引用時,對在共享存儲器199中出現(xiàn)的、在用于正在考慮的軟件程序的堆中的存儲器對象的每個引用,將要么在全局標(biāo)記隊(duì)列中標(biāo)記為可達(dá),要么對正在考慮的軟件程序?qū)⑹遣豢蛇_(dá)的。那些對還未由標(biāo)記處理到達(dá)的系統(tǒng)存儲器對象的引用是其共享存儲器199的相應(yīng)部分可以被回收的對象。與全局標(biāo)記堆棧中的所有其它系統(tǒng)存儲器對象相關(guān)聯(lián)的共享存儲器199部分可由軟件程序達(dá)到,并且因此不能被回收。
      然后,可以執(zhí)行回收處理,以回收與未在全局標(biāo)記描述符中標(biāo)記為可達(dá)的存儲器對象相關(guān)聯(lián)的系統(tǒng)存儲器。這樣的回收處理在技術(shù)上通常是已知的,因此這里不提供這樣的回收處理的詳細(xì)說明。
      圖3是根據(jù)一個說明性實(shí)施例、可以用于執(zhí)行垃圾收集的垃圾收集機(jī)制的示范圖。圖3所示的垃圾收集機(jī)制可以集成到存儲器流控制器(MFC),如例如圖1的SPE 120-134中的如圖2所示的MFC 200中。因此,圖3中的垃圾收集機(jī)制可以利用MFC寄存器240、MIMO接口250、MFC命令隊(duì)列280等執(zhí)行說明性實(shí)施例中的垃圾收集操作。
      在一個說明性實(shí)施例中,垃圾收集機(jī)制利用MFC命令得到部分全局標(biāo)記隊(duì)列和相應(yīng)的共享存儲器塊,該部分全局標(biāo)記隊(duì)列存儲在MFC寄存器240中,而該共享存儲器塊存儲在與MFC相關(guān)聯(lián)的本地存儲中。此外,MFC命令可以用于利用例如由MFC寄存器240中的MFC維持的各種標(biāo)記堆棧來執(zhí)行“標(biāo)記和掃描”操作以及合并操作,。
      如圖3所示,垃圾收集引擎300包括控制器310、全局標(biāo)記隊(duì)列接口模塊320、共享存儲器接口模塊330、標(biāo)記模塊340、標(biāo)記描述符存儲設(shè)備345、全局標(biāo)記隊(duì)列部分存儲設(shè)備350、本地存儲接口360、本地標(biāo)記堆棧存儲設(shè)備370、非本地標(biāo)記堆棧存儲設(shè)備380以及合并模塊390。元件310-390可以實(shí)現(xiàn)為硬件、軟件或任何硬件和軟件的組合。在說明性實(shí)施例中,元件310-340、360和390實(shí)現(xiàn)為由一個或更多處理元件執(zhí)行的諸如MFC功能之類的軟件功能,而元件345、350、370和380可以實(shí)現(xiàn)為諸如存儲器、寄存器等之類的硬件元件。作為選擇,所有圖3中示出的元件可以實(shí)現(xiàn)為可以集成到MFC或SPE的其它部分中的硬件設(shè)備,或者實(shí)現(xiàn)為SPE中的專用單元。
      控制器310控制垃圾收集引擎300的整體操作,并且編排其它元件320-390的操作。全局標(biāo)記隊(duì)列接口模塊320負(fù)責(zé)提供這樣的機(jī)制,即檢索部分全局標(biāo)記隊(duì)列,以便由垃圾收集引擎300在根據(jù)說明性實(shí)施例執(zhí)行垃圾收集操作中使用。經(jīng)由全局標(biāo)記隊(duì)列接口模塊320檢索的該部分全局標(biāo)記隊(duì)列存儲在全局標(biāo)記隊(duì)列部分存儲器350中,用于在這部分全局標(biāo)記隊(duì)列中的引用上執(zhí)行垃圾收集操作時使用。
      共享存儲器接口模塊330負(fù)責(zé)提供檢索一部分共享存儲器、用于經(jīng)由本地存儲接口360存儲在本地存儲中的機(jī)制。所檢索的這部分共享存儲器對應(yīng)于經(jīng)由全局標(biāo)記隊(duì)列接口模塊320檢索的該部分全局標(biāo)記隊(duì)列。在控制器310根據(jù)被編程到控制器310中的垃圾收集方法的指揮下,全局標(biāo)記隊(duì)列接口模塊320和共享存儲器接口模塊330與PPE進(jìn)行通信,以便檢索全局標(biāo)記隊(duì)列中的恰當(dāng)部分以及共享存儲器的相應(yīng)部分。
      標(biāo)記模塊340負(fù)責(zé)執(zhí)行對在全局標(biāo)記隊(duì)列部分存儲設(shè)備350中存儲的部分全局標(biāo)記隊(duì)列中的引用的標(biāo)記。作為標(biāo)記操作的一部分,將對由控制器310經(jīng)由全局標(biāo)記隊(duì)列接口模塊320檢索的該部分全局標(biāo)記隊(duì)列中的存儲器對象的引用添加到本地標(biāo)記堆棧存儲設(shè)備370中。然后,由標(biāo)記模塊340使用“標(biāo)記和掃描”垃圾收集操作中的標(biāo)記操作檢查這些引用,以因此識別本地存儲中存儲的共享存儲器塊中的可達(dá)存儲器對象,和/或在經(jīng)由共享存儲器接口模塊330和本地存儲接口360檢索并存儲在本地存儲中的共享存儲器塊內(nèi)不可達(dá)的存儲器對象。將在執(zhí)行存儲器對象的迭代跟蹤時可能遇到的、作為對在共享存儲器的其它塊中的存儲器對象的引用的存儲器對象引用添加到非本地標(biāo)記堆棧存儲器380中。
      這些在加載到本地存儲中的共享存儲器塊內(nèi)可達(dá)的存儲器對象在與這些存儲器對象相對應(yīng)的標(biāo)記描述符中被標(biāo)記為可達(dá)。用于該共享存儲器塊的標(biāo)記描述符可以存儲在標(biāo)記描述符存儲設(shè)備345中。這些標(biāo)記描述符構(gòu)成隨后合并到全局標(biāo)記描述符中的本地標(biāo)記描述符,其中該全局標(biāo)記描述符用于與正為其執(zhí)行的、所考慮中的軟件程序相關(guān)聯(lián)的整個堆。
      在標(biāo)記模塊340根據(jù)上述方法執(zhí)行本地可達(dá)存儲器對象和非本地存儲器對象的標(biāo)記之后,合并模塊390執(zhí)行合并操作,以將標(biāo)記描述符存儲設(shè)備345中的本地標(biāo)記描述符和其它SPE的堆棧中的其它本地標(biāo)記描述符合并,以生成全局標(biāo)記堆棧。合并模塊390還將非本地標(biāo)記堆棧380和全局標(biāo)記隊(duì)列中的“要跟蹤”部分合并,以便這些引用可以用共享存儲器的恰當(dāng)塊跟蹤。
      圖4是說明根據(jù)一個說明性實(shí)施例的分布式垃圾收集操作的示范圖。如圖4所示,全局標(biāo)記隊(duì)列410具有“已清理”部分412和“要跟蹤”部分414?!耙亚謇怼辈糠?12是包含對已經(jīng)由在一個或多個SPE 420-426上執(zhí)行的“標(biāo)記和掃描”垃圾收集操作處理的共享存儲器對象的引用的一部分全局標(biāo)記隊(duì)列410。在將部分全局標(biāo)記隊(duì)列分配給SPE 420-426用于本地“標(biāo)記和掃描”垃圾收集時,將全局標(biāo)記隊(duì)列中的這些部分添加到全局標(biāo)記隊(duì)列410的“已清理”部分412中。
      全局標(biāo)記隊(duì)列410中的“要跟蹤”部分414包含對還未由“標(biāo)記和掃描”垃圾收集操作處理的共享存儲器對象的那些引用、或者被確定為是對在共享存儲器430的非本地部分中的共享存儲器對象的引用。在將部分全局標(biāo)記隊(duì)列的“要跟蹤”部分414中的部分分配給SPE 420-426用于垃圾收集時,將它們添加到全局標(biāo)記隊(duì)列410的“已清理”部分412。
      如圖4所示,每個SPE 420-426從全局標(biāo)記隊(duì)列41 0的“要跟蹤”部分414獲得全局標(biāo)記隊(duì)列410的一部分415-418,然后將該部分添加到全局標(biāo)記隊(duì)列410的“已清理”部分412中。雖然說明性實(shí)施例的操作不要求這個,但是這些部分415-418優(yōu)選為全局標(biāo)記隊(duì)列410的順序部分。
      另外,每個SPE 420-426獲得共享存儲器430中的相應(yīng)塊432-438。由每個SPE 420-426獲得的塊432-438對應(yīng)于由該SPE 420-426獲得的全局標(biāo)記隊(duì)列410中的部分。
      以SPE 420作為正在每個其它SPE 422-426中、使用它們自己的全局標(biāo)記隊(duì)列416-418的本地部分和共享存儲器塊434-438所執(zhí)行的相同操作的示例,基于全局標(biāo)記隊(duì)列中的部分415和共享存儲器中的相應(yīng)塊432、SPE 420在共享存儲器的相應(yīng)塊432上執(zhí)行標(biāo)記操作。加載到SPE 420中的部分全局標(biāo)記隊(duì)列415用于用要使用標(biāo)記操作檢查的、指向存儲器對象的引用或指針來填充本地標(biāo)記堆棧(LMS)440。這個標(biāo)記操作涉及取本地標(biāo)記堆棧440中的下一個指針或引用,并且確定由該指針引用的系統(tǒng)存儲器對象在存儲在SPE本地存儲中的共享存儲器塊432中是否是可達(dá)的。如先前所述,這可能要求指向系統(tǒng)存儲器對象的指針從共享存儲器地址空間翻譯到本地存儲地址空間。
      如果系統(tǒng)存儲器對象出現(xiàn)在共享存儲器塊432中,則將這個引用在相應(yīng)的標(biāo)記描述符460中標(biāo)記為在本地存儲中可達(dá),然后以迭代方式跟蹤這個存儲器對象引用的任何對象,并且以類似的方式進(jìn)行標(biāo)記。繼續(xù)這個迭代跟蹤,直到遇到不引用任何其它存儲器對象的存儲器對象,或者遇到不在共享存儲器塊432中出現(xiàn)的存儲器對象為止。任何對不在SPE 420本地存儲中的共享存儲器塊432中的存儲器對象的引用被標(biāo)記為非本地存儲器對象。
      在使用本地標(biāo)記堆棧440、以這種方式跟蹤該部分全局標(biāo)記隊(duì)列415中的所有引用之后,本地標(biāo)記堆棧440為空,并且存儲器對象指針要么在本地標(biāo)記描述符460中被標(biāo)記,要么被添加到非本地標(biāo)記堆棧450中。本地標(biāo)記描述符460包含在共享存儲器塊432中可達(dá)的、所有在該部分全局標(biāo)記隊(duì)列415中的系統(tǒng)存儲器對象引用。非本地標(biāo)記堆棧440包含在跟蹤該部分全局標(biāo)記隊(duì)列的41 5中的引用期間遇到的、引用不在本地存儲處的共享存儲器塊432中的系統(tǒng)存儲器對象的、對系統(tǒng)存儲器對象的引用。
      將SPE 420-426的本地標(biāo)記描述符460-466合并到一起以形成全局標(biāo)記描述符490。例如,這個合并可能涉及移除冗余項(xiàng)目,以便每個對系統(tǒng)存儲器對象的引用在結(jié)果產(chǎn)生的全局標(biāo)記描述符490中只有一個項(xiàng)目。在后續(xù)迭代中,本地標(biāo)記描述符460-466、本地標(biāo)記堆棧440-446和非本地標(biāo)記堆棧450-456可以由后續(xù)標(biāo)記操作重新初始化并重新填充。根據(jù)后續(xù)迭代產(chǎn)生的本地標(biāo)記描述符460-466可以與現(xiàn)有的全局標(biāo)記描述符490合并,以便繼續(xù)更新全局標(biāo)記描述符490。
      SPE 420-426的非本地標(biāo)記堆棧450-456與全局標(biāo)記隊(duì)列410的“要跟蹤”部分414合并,以產(chǎn)生全局標(biāo)記隊(duì)列410的“合并”部分413?!昂喜ⅰ辈糠?13可以與共享存儲器430中的其它相應(yīng)塊一起由相同的或其它的SPE420-426的垃圾收集線程處理。再一次,這個合并可能涉及以這樣的方式將該引用添加回全局標(biāo)記隊(duì)列410的“要跟蹤”部分414,以使得每個引用在全局標(biāo)記隊(duì)列410中只有一個項(xiàng)目。
      當(dāng)跟蹤部分全局標(biāo)記隊(duì)列415以及本地標(biāo)記描述符460和非本地標(biāo)記堆棧450的合并完成時,本地標(biāo)記描述符460、本地標(biāo)記堆棧440和非本地標(biāo)記堆棧450可以被重新初始化,并且可以將全局標(biāo)記隊(duì)列410的新部分和相應(yīng)的共享存儲器430塊檢索到SPE 420中。然后可以在全局標(biāo)記隊(duì)列410的這個新部分和共享存儲器430的相應(yīng)塊上執(zhí)行垃圾收集。這個處理可以由每個SPE 420-426以迭代方式執(zhí)行,直到全局標(biāo)記隊(duì)列410全部被跟蹤了為止,因此全局標(biāo)記隊(duì)列410僅僅包含“已清理”部分412,而“要跟蹤”部分414為空。
      在整個全局標(biāo)記隊(duì)列410已經(jīng)通過上述迭代和分布式垃圾收集操作跟蹤了時,全局標(biāo)記描述符490將包含對共享存儲器430中、所有可以由與全局標(biāo)記隊(duì)列410相對應(yīng)的程序達(dá)到的系統(tǒng)存儲器對象的引用。因此,共享存儲器430中未由全局標(biāo)記描述符490引用的所有其它對象可以讓它們的存儲器空間被回收??梢猿跏蓟厥仗幚?,以便本領(lǐng)域通常已知的方式執(zhí)行這樣的回收。
      因此,說明性實(shí)施例提供了用于在異構(gòu)多處理器系統(tǒng)中,以分布式方式在多個處理器上執(zhí)行垃圾收集操作的機(jī)制。在這樣的系統(tǒng)中,垃圾收集操作可以由諸如圖1中的PPE 110之類的控制處理器編排,同時系統(tǒng)存儲器各部分上的分布式垃圾收集可以由多個協(xié)處理器如圖1中的SPE 120-134在控制處理器的指揮下執(zhí)行。提供了地址翻譯機(jī)制用于補(bǔ)償控制和協(xié)處理器的不同存儲器視角。
      存在若干可以提供用于執(zhí)行上述垃圾收集操作的優(yōu)化。例如,在SPE中完成一部分全局標(biāo)記隊(duì)列的跟蹤之后,SPE可以查看其它SPE的非本地標(biāo)記堆棧,以確定是否存在對當(dāng)前加載到SPE的本地存儲處的系統(tǒng)存儲器塊中的存儲器對象的引用。以這樣的方式,可以將這樣的、在其它SPE的非本地標(biāo)記堆棧中的引用添加到當(dāng)前SPE的本地堆棧中,而不必將該引用合并回全局標(biāo)記隊(duì)列中,并且然后將它復(fù)制回到另一個SPE。
      此外,可以預(yù)排序全局標(biāo)記隊(duì)列,以便生成與分離的系統(tǒng)或者共享存儲器區(qū)域相對應(yīng)的分離的全局標(biāo)記隊(duì)列區(qū)域。當(dāng)將非本地標(biāo)記堆棧合并回全局標(biāo)記隊(duì)列的“要跟蹤”部分中時,將非本地標(biāo)記堆棧中對存儲器對象的引用合并到全局標(biāo)記隊(duì)列的相應(yīng)區(qū)域中。因此,如果第一非本地標(biāo)記堆棧中的引用涉及處于共享存儲器的第一區(qū)域中的存儲器對象,則該項(xiàng)目將被合并到全局標(biāo)記隊(duì)列的第一區(qū)域的“要跟蹤”部分中。類似地,如果第二非本地標(biāo)記堆棧中的項(xiàng)目涉及處于共享存儲器的第二區(qū)域中的存儲器對象,則該項(xiàng)目將被合并到全局標(biāo)記隊(duì)列的第二區(qū)域的“要跟蹤”部分中。這將加速垃圾收集操作,這是因?yàn)椋诶占暮罄m(xù)迭代中較不可能將相同的引用確定為處于系統(tǒng)存儲器的非本地部分中多次。
      圖5是說明根據(jù)另一個說明性實(shí)施例、其中利用了預(yù)排序的增強(qiáng)標(biāo)記和掃描操作的分布式垃圾收集操作的示范圖。圖5類似于圖4中所提供的說明,但有一些主要的例外。如圖5所示,全局標(biāo)記隊(duì)列510諸如由圖1的PPE 110預(yù)先排序,以便具有與共享存儲器530中的區(qū)域532-536相對應(yīng)的多個區(qū)域512-516。以與如上所述非常類似的方式執(zhí)行由各個SPE 520-526檢索全局標(biāo)記隊(duì)列510中的部分。但是,SPE 520-526的非本地標(biāo)記堆棧550-556的合并被修改為考慮全局標(biāo)記隊(duì)列510的各個區(qū)域。
      例如,當(dāng)將SPE 520-526的非本地標(biāo)記堆棧550-556與全局標(biāo)記隊(duì)列的“要跟蹤”部分合并時,合并過程確定非本地標(biāo)記堆棧550-556中的引用應(yīng)該放在全局標(biāo)記隊(duì)列的哪個區(qū)域512-516中。這個例如可以通過使用所引用的共享存儲器地址來確定該引用對應(yīng)于共享存儲器530中的哪個區(qū)域532-536,然后識別全局標(biāo)記隊(duì)列510的相應(yīng)區(qū)域512-516來完成。然后,將這些引用與它們相應(yīng)的全局標(biāo)記隊(duì)列的那個區(qū)域的“要跟蹤”部分合并。
      因?yàn)樵撘帽缓喜⒌脚c對應(yīng)于該引用的系統(tǒng)存儲器對象出現(xiàn)在其中的、共享存儲器530中的這些區(qū)域相對應(yīng)的全局標(biāo)記隊(duì)列510的這些區(qū)域中,所以這樣的預(yù)排序和局部性增強(qiáng)的垃圾收集減少了相同引用必須重復(fù)地與全局標(biāo)記隊(duì)列合并的實(shí)例數(shù)量。作為結(jié)果,這降低了對相同引用的冗余檢查的數(shù)目,由此減少了執(zhí)行垃圾收集操作的時間。
      作為進(jìn)一步的優(yōu)化,可以基于堆的當(dāng)前狀態(tài)調(diào)整每個SPE中使用的系統(tǒng)和共享存儲器塊的大小。如果堆相對較空,即具有很少的存儲器分配,則可以選擇相對大的塊大小,這是因?yàn)橐谄渖蠄?zhí)行垃圾收集的全局標(biāo)記隊(duì)列中將存在相對少的指針和引用。以這種方式,可以用較大的塊大小快速掃描大塊系統(tǒng)或共享存儲器。
      類似地,如果堆是滿的,則全局標(biāo)記隊(duì)列中將存在相對大數(shù)目的指針,因此可以將塊大小選擇為相對小。雖然較小的塊大小將使垃圾收集操作花費(fèi)更長的時間量來完成,但是較小的塊大小將有助于確保對于本地和非本地標(biāo)記堆棧沒有堆棧溢出例外。
      在又一個進(jìn)一步的優(yōu)化中,每個SPE的本地存儲可以分叉,以便本地存儲的第一部分用于存儲共享存儲器的第一塊,而本地存儲的另一部分用于存儲共享存儲器的下一塊的一部分。可以上面通常描述的方式在共享存儲器的第一塊上執(zhí)行標(biāo)記操作。當(dāng)正在標(biāo)記該共享存儲器塊時,例如可以使用DMA操作,可以將共享存儲器的下一塊帶入本地存儲中。以這種方式,因?yàn)閳?zhí)行了有些并行的加載操作,所以可以使共享存儲器塊和它們的全局標(biāo)記隊(duì)列中的相應(yīng)部分的加載更加有效。
      在該說明性實(shí)施例的還有另一個優(yōu)化中,可以為被設(shè)計用于存儲本地標(biāo)記隊(duì)列和非本地標(biāo)記隊(duì)列的存儲器區(qū)域的溢出提供特殊處理。在第一個優(yōu)化中,可以將非本地標(biāo)記堆棧合并到保持在系統(tǒng)存儲器中的全局標(biāo)記隊(duì)列中并刪除該非本地標(biāo)記堆棧。在第二個優(yōu)化中,可以將一部分本地標(biāo)記隊(duì)列傳輸?shù)奖3衷谙到y(tǒng)存儲器中的全局標(biāo)記隊(duì)列中并刪除該部分本地標(biāo)記隊(duì)列。在第三個優(yōu)化中,可以減小并延遲(defer)塊大小以便將來處理,同時確保對應(yīng)于延遲的塊部分的標(biāo)記描述符保留在本地存儲或全局系統(tǒng)存儲器之一中。
      圖6是概述根據(jù)一個說明性實(shí)施例、用于執(zhí)行垃圾收集的示范性操作的流程圖。將理解的是流程圖說明的每塊以及流程圖說明中塊的組合可以由計算機(jī)程序指令實(shí)現(xiàn)??梢蕴峁┻@些計算機(jī)程序指令給處理器或其它可編程數(shù)據(jù)處理設(shè)備以產(chǎn)生機(jī)器,以便在處理器或其它可編程數(shù)據(jù)處理設(shè)備上執(zhí)行的指令創(chuàng)建了用于實(shí)現(xiàn)流程圖塊或者多個塊中指定的功能的裝置。這些計算機(jī)程序指令也可以存儲在計算機(jī)可讀存儲器或存儲器介質(zhì)中,這些存儲器或者介質(zhì)可以引導(dǎo)處理器或其它可編程數(shù)據(jù)處理設(shè)備以特定的方式起作用,以便存儲在計算機(jī)可讀存儲器或存儲器介質(zhì)中的指令產(chǎn)生包括實(shí)現(xiàn)了流程圖塊或者多個塊中指定的特定功能的指令裝置的制品。
      因此,流程圖說明的塊支持用于執(zhí)行所指定功能的裝置組合、用于執(zhí)行指定功能的步驟組合以及用于執(zhí)行指定功能的程序指令裝置。也將理解的是流程圖說明中的每個塊以及流程圖說明中的塊組合,可以由執(zhí)行所指定的功能或步驟的、基于專用硬件的計算機(jī)系統(tǒng)實(shí)現(xiàn),或者由特專用硬件和計算機(jī)指令的組合實(shí)現(xiàn)。
      如圖6所示,操作以SPE接收諸如來自另一個SPE或PPE的指令從而開始垃圾收集操作開始(步驟610)。SPE或者可選的PPE啟動收集線程,該收集線程利用垃圾收集引擎來在分配給所接收的垃圾收集指令中識別的程序的一部分系統(tǒng)或共享存儲器執(zhí)行垃圾收集(步驟620)。由PPE為分配給該程序的該系統(tǒng)或共享存儲器部分生成全局標(biāo)記隊(duì)列,即堆,并且初始化該全局標(biāo)記隊(duì)列(步驟630)。所產(chǎn)生的收集線程獲得一部分全局標(biāo)記隊(duì)列以及系統(tǒng)或共享存儲器的相應(yīng)塊(步驟640),以分別復(fù)制到本地標(biāo)記堆棧和本地存儲中。
      收集線程對本地標(biāo)記堆棧中的引用或指針啟動標(biāo)記和跟蹤操作,其中所述LMS已經(jīng)用一部分全局標(biāo)記隊(duì)列初始化了。收集線程從本地標(biāo)記堆棧選擇下一個項(xiàng)目,并且啟動所有包含在相應(yīng)的存儲器塊中的引用的標(biāo)記和跟蹤處理(步驟650)。作為標(biāo)記和跟蹤操作的一部分,收集線程識別該存儲器塊中的下一個引用或指針(步驟660),并且確定該引用是否指向該系統(tǒng)/共享存儲器塊中的存儲器對象(步驟670)。如果引用指向該系統(tǒng)/共享存儲器塊中的存儲器對象,則如果該引用對應(yīng)于先前不可達(dá)的引用(即,標(biāo)記描述符被設(shè)置為不可達(dá)),收集線程將該引用添加到本地標(biāo)記堆棧中,并且例如通過將存儲器對象的引用添加到本地標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)中并且相應(yīng)地設(shè)置它的標(biāo)記描述符位、在本地標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)中將存儲器對象標(biāo)記為可達(dá)(步驟680)。如果引用指向不在該系統(tǒng)/共享存儲器塊中的存儲器對象,則收集線程將該引用標(biāo)記為非本地標(biāo)記的引用,并且將該引用添加到非本地標(biāo)記堆棧中(步驟690)。
      然后,收集線程確定是否存在來自當(dāng)前存儲器對象引用或在該部分全局標(biāo)記隊(duì)列中的、另外的到存儲器對象的引用或指針(步驟700)。如果存在,則收集線程返回到步驟660。如果不存在,則收集線程確定本地標(biāo)記堆棧是否為空,即是否所有項(xiàng)目都已經(jīng)由標(biāo)記和跟蹤操作處理了(步驟705)。如果不是,則操作返回到步驟650,并且選擇下一個要在其上執(zhí)行標(biāo)記和跟蹤操作的本地標(biāo)記堆棧項(xiàng)目。如果本地標(biāo)記堆棧為空,則收集線程可選地輪詢異構(gòu)多處理器系統(tǒng)的其它處理器以獲得引用當(dāng)前處理器中的系統(tǒng)或共享存儲器的當(dāng)前塊的、在非本地工作堆棧中的引用或指針(步驟710)。然后,以類似于步驟650-690的方式跟蹤和標(biāo)記任何這樣的引用或指針(步驟720)。
      然后,收集線程將結(jié)果產(chǎn)生的本地標(biāo)記描述符和全局標(biāo)記描述符合并(步驟730)。收集線程也可以將結(jié)果產(chǎn)生的非本地標(biāo)記堆棧與全局標(biāo)記隊(duì)列的“要跟蹤”部分合并(步驟740)。這可能涉及例如,確定非本地標(biāo)記堆棧中的引用對應(yīng)于全局標(biāo)記隊(duì)列的“要跟蹤”部分的哪些區(qū)域;以及將這些引用與它們各自的全局標(biāo)記隊(duì)列的區(qū)域合并。
      然后,收集線程重新初始化本地標(biāo)記描述符、本地標(biāo)記堆棧和非本地標(biāo)記堆棧(步驟750)。然后,收集線程確定是否存在另外要處理的全局標(biāo)記隊(duì)列的部分(步驟760)。如果存在,則操作返回到步驟640,其中獲得全局標(biāo)記隊(duì)列的下一個部分以及相應(yīng)的存儲器塊,并且重復(fù)該處理。如果不存在要處理的全局標(biāo)記隊(duì)列的進(jìn)一步部分,則操作終止。應(yīng)該注意到在上述分布式“標(biāo)記和掃描”操作結(jié)束之后,可以執(zhí)行存儲器回收以回收分配給未由全局標(biāo)記堆棧引用的存儲器對象的部分系統(tǒng)或共享存儲器。
      因此,說明性實(shí)施例提供了用于在異構(gòu)多處理器系統(tǒng)中執(zhí)行垃圾收集的機(jī)制。垃圾收集可以在異構(gòu)多處理器系統(tǒng)中的多個處理器上并行地執(zhí)行,并且適當(dāng)?shù)睾喜⒔Y(jié)果以識別那些可達(dá)的系統(tǒng)存儲器對象和那些不可達(dá)的系統(tǒng)存儲器對象。以這種方式,提供了利用異構(gòu)多處理器系統(tǒng)中每個處理器的能力的有效的垃圾收集方法。
      應(yīng)該注意雖然上面的實(shí)施例按照分布式垃圾收集操作進(jìn)行了說明,但是本發(fā)明不限于此。相反,可以分配異構(gòu)多處理器系統(tǒng)中的單個處理器來執(zhí)行垃圾收集操作,而不背離本發(fā)明的精神和范圍。因?yàn)檫@樣的處理器的本地存儲具有有限的大小,所以仍然需要執(zhí)行考入要在其上執(zhí)行的、部分全局標(biāo)記隊(duì)列以及共享或系統(tǒng)存儲器中的相對應(yīng)部分。因此,可以使用單處理器而不是多處理器執(zhí)行與上面描述的相同的操作,而不背離本發(fā)明的精神和范圍。
      說明性實(shí)施例可以采取完全硬件實(shí)施例、完全軟件實(shí)施例或包含硬件和軟件元件的實(shí)施例的形式。在優(yōu)選實(shí)施例中,本發(fā)明以軟件實(shí)現(xiàn),該軟件包括但不限于固件、駐留軟件、微碼等。
      此外,說明性實(shí)施例可以采取計算機(jī)程序產(chǎn)品的形式,該計算機(jī)程序產(chǎn)品可以從提供用于由計算機(jī)或任何指令執(zhí)行系統(tǒng)使用或者結(jié)合它們一起使用的程序代碼的計算機(jī)可用或計算機(jī)可讀介質(zhì)訪問。為了這個描述起見,計算機(jī)可用或計算機(jī)可讀介質(zhì)可以是任何這樣的裝置,該裝置可以包含、存儲、傳達(dá)、傳播或傳輸用于由指令執(zhí)行系統(tǒng)、裝置或設(shè)備使用或者結(jié)合它們一起使用的程序。
      介質(zhì)可以是電、磁、光、電磁、紅外或半導(dǎo)體系統(tǒng)(或裝置或設(shè)備)或傳播介質(zhì)。計算機(jī)可讀介質(zhì)的示例包括半導(dǎo)體或固態(tài)存儲器、磁帶、可移動計算機(jī)盤、隨機(jī)存取存儲器(RAM)、只讀存儲器(ROM)、剛性磁盤和光盤。當(dāng)前光盤的示例包括緊致盤-只讀存儲器(CD-ROM)、可讀性緊致盤(CD-R/W)和DVD。
      如上所述,適于存儲和/或執(zhí)行程序代碼的數(shù)據(jù)處理系統(tǒng)將包括至少一個通過系統(tǒng)總線直接或間接耦接到存儲器元件的處理器。存儲器元件可以包括程序代碼實(shí)際執(zhí)行期間使用的本地存儲、大規(guī)模存儲設(shè)備和高速緩存,其中該高速緩存提供了至少一些程序代碼的暫時存儲,以便減小執(zhí)行期間必須從大規(guī)模存儲器檢索代碼的次數(shù)。
      輸入/輸出或I/O設(shè)備(包括但不限于鍵盤、顯示器、指向設(shè)備等)可以直接或通過介于其間的I/O控制器耦接到該系統(tǒng)。網(wǎng)絡(luò)適配器也可以耦接到該系統(tǒng),以使數(shù)據(jù)處理系統(tǒng)變得能夠通過介于其間的私有或公共網(wǎng)絡(luò)耦接到其它數(shù)據(jù)處理系統(tǒng)或遠(yuǎn)程打印機(jī)或存儲設(shè)備。調(diào)制解調(diào)器、電纜調(diào)制解調(diào)器和以太網(wǎng)卡只是一些當(dāng)前可用的網(wǎng)絡(luò)適配器類型。
      重要的是要注意到雖然已經(jīng)在完整功能的數(shù)據(jù)處理系統(tǒng)的環(huán)境中描述了本發(fā)明,但是本領(lǐng)域的技術(shù)人員將認(rèn)識到本發(fā)明中的處理能夠以指令的計算機(jī)可讀介質(zhì)的形式以及各種形式分布,以及本發(fā)明可以同樣應(yīng)用而不考慮實(shí)際用于執(zhí)行分布的信號承載介質(zhì)的特定類型。計算機(jī)可讀介質(zhì)的示例包括諸如軟盤、硬盤驅(qū)動器、RAM、CD-ROM、DVD-ROM之類的可記錄類型介質(zhì),以及諸如數(shù)字和模擬通信鏈路、使用例如射頻和光波傳輸之類的傳輸形式的有線或無線通信鏈路之類的傳輸類型介質(zhì)。計算機(jī)可讀介質(zhì)可以采用編碼格式,其可被解碼用于在特定數(shù)據(jù)處理系統(tǒng)中的實(shí)際使用。
      已經(jīng)為了說明和描述的目的提供了對本發(fā)明的描述,其意圖不在于以所公開的形式詳盡或限制本發(fā)明。很多修改和變化對本領(lǐng)域技術(shù)人員來說將是顯而易見的。選擇和描述實(shí)施例以便最好地闡述本發(fā)明的原理、實(shí)際應(yīng)用,并且使本領(lǐng)域的其他技術(shù)人員理解本發(fā)明用于適于所考慮的特定用途而具有各種修改的各種實(shí)施例。
      權(quán)利要求
      1.一種用于在多處理器數(shù)據(jù)處理系統(tǒng)對共享存儲器執(zhí)行垃圾收集操作的方法,包含在多處理器數(shù)據(jù)處理系統(tǒng)的處理器中加載與部分共享存儲器相對應(yīng)的部分全局標(biāo)記隊(duì)列;基于對分配給所述處理器的所述部分全局標(biāo)記隊(duì)列中的存儲器對象的引用、在所述部分共享存儲器上執(zhí)行標(biāo)記操作,由此識別出可達(dá)的存儲器對象,其中所述可達(dá)存儲器對象的相關(guān)聯(lián)存儲器不能作為所述垃圾收集操作的一部分被回收;以及在標(biāo)記操作期間識別對不在分配給所述處理器的所述部分共享存儲器中的存儲器對象的引用,以用于作為所述垃圾收集操作的一部分的進(jìn)一步處理。
      2.根據(jù)權(quán)利要求1所述的方法,其中所述部分全局標(biāo)記隊(duì)列小于全局標(biāo)記隊(duì)列的整個部分,以及其中與所述部分全局標(biāo)記隊(duì)列相對應(yīng)的所述部分共享存儲器小于共享存儲器的整個部分。
      3.根據(jù)權(quán)利要求1所述的方法,其中加載與部分共享存儲器相對應(yīng)的部分全局標(biāo)記隊(duì)列包含最初基于對所述部分全局標(biāo)記隊(duì)列中的存儲器對象的引用,填充本地標(biāo)記堆棧;以及在處理器的本地存儲中加載與所述部分全局標(biāo)記隊(duì)列相對應(yīng)的部分共享存儲器,其中所述多處理器數(shù)據(jù)處理系統(tǒng)的多個處理器中的每個處理器都加載所述全局標(biāo)記隊(duì)列的不同部分以及相對應(yīng)的共享存儲器的不同部分,并且基于在所述全局標(biāo)記隊(duì)列的不同部分中的存儲器對象引用,在所述共享存儲器的不同部分上執(zhí)行標(biāo)記操作。
      4.根據(jù)權(quán)利要求3所述的方法,其中基于對存儲器對象的引用、在所述部分共享存儲器上執(zhí)行標(biāo)記操作包含跟蹤在所述部分全局標(biāo)記隊(duì)列中的存儲器對象引用、以及對從屬存儲器對象的引用,直到識別出對不在所述部分共享存儲器內(nèi)的存儲器對象的引用為止;將對在所述部分共享存儲器內(nèi)的存儲器對象的引用存儲在本地標(biāo)記堆棧中;以及將對不在所述部分共享存儲器內(nèi)的存儲器對象的引用存儲在非本地標(biāo)記堆棧中。
      5.根據(jù)權(quán)利要求1所述的方法,還包含將與所述本地標(biāo)記堆棧相關(guān)聯(lián)的本地標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)與全局標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)合并;以及將所述非本地標(biāo)記堆棧和所述全局標(biāo)記隊(duì)列的“要跟蹤”部分合并,其中所述全局標(biāo)記隊(duì)列的“要跟蹤”部分包含要通過執(zhí)行標(biāo)記操作來處理的存儲器對象引用,以及其中所述本地標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)包含其引用處于所述本地標(biāo)記堆棧中的存儲器對象的可達(dá)性信息。
      6.根據(jù)權(quán)利要求5所述的方法,其中所述全局標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)包含在所述多處理器數(shù)據(jù)處理系統(tǒng)的處理器的本地標(biāo)記堆棧中的、所有對被識別為在部分共享存儲器內(nèi)的存儲器對象的引用。
      7.根據(jù)權(quán)利要求1所述的方法,其中所述多處理器數(shù)據(jù)處理系統(tǒng)是異構(gòu)多處理器數(shù)據(jù)處理系統(tǒng),其包含控制處理器和至少一個協(xié)處理器,以及其中所述控制處理器和至少一個協(xié)處理器使用不同的指令集操作。
      8.根據(jù)權(quán)利要求7所述的方法,其中部分全局標(biāo)記隊(duì)列的加載、執(zhí)行標(biāo)記操作、和識別對不在所述部分共享存儲器內(nèi)的存儲器對象的引用,由所述至少一個協(xié)處理器中的一個或多個執(zhí)行。
      9.根據(jù)權(quán)利要求8所述的方法,其中所述加載、執(zhí)行和識別操作由所述至少一個協(xié)處理器的一個或多個中的存儲器流控制器執(zhí)行。
      10.一種用于執(zhí)行垃圾收集的系統(tǒng),包含多個處理器,每個處理器具有相關(guān)聯(lián)的本地存儲;以及耦接到所述多個處理器的共享存儲器,其中所述多個處理器的一個或多個處理器在處理器中加載與部分共享存儲器相對應(yīng)的部分全局標(biāo)記隊(duì)列,基于對分配給所述處理器的部分全局標(biāo)記隊(duì)列中的存儲器對象的引用,在所述部分共享存儲器上執(zhí)行標(biāo)記操作,由此識別可達(dá)的存儲器對象,其中所述可達(dá)存儲器對象的相關(guān)聯(lián)存儲器不能作為垃圾收集操作的一部分被回收,以及在標(biāo)記操作期間識別對不在分配給所述處理器的所述部分共享存儲器中的存儲器對象的引用,用于作為垃圾收集操作的一部分的進(jìn)一步處理。
      11.根據(jù)權(quán)利要求10所述的系統(tǒng),其中該一個或多個處理器還將與本地標(biāo)記堆棧相關(guān)聯(lián)的本地標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)與全局標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)合并;以及將非本地標(biāo)記堆棧和全局標(biāo)記隊(duì)列的“要跟蹤”部分合并,其中所述全局標(biāo)記隊(duì)列的“要跟蹤”部分包含要通過執(zhí)行標(biāo)記操作來處理的存儲器對象引用,以及其中本地標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)包含其引用在本地標(biāo)記堆棧中的存儲器對象的可達(dá)性信息。
      12.根據(jù)權(quán)利要求10所述的系統(tǒng),其中所述部分全局標(biāo)記隊(duì)列小于全局標(biāo)記隊(duì)列的整個部分,以及其中與所述部分全局標(biāo)記隊(duì)列相對應(yīng)的所述部分共享存儲器小于共享存儲器的整個部分。
      13.根據(jù)權(quán)利要求10所述的系統(tǒng),其中所述一個或多個處理器通過下列處理加載與部分共享存儲器相對應(yīng)的部分全局標(biāo)記隊(duì)列最初基于對所述部分全局標(biāo)記隊(duì)列中的存儲器對象的引用來填充本地標(biāo)記堆棧;以及在處理器的本地存儲中加載與所述部分全局標(biāo)記隊(duì)列相對應(yīng)的部分共享存儲器,其中多處理器數(shù)據(jù)處理系統(tǒng)的多個處理器中的每個處理器都加載全局標(biāo)記隊(duì)列的不同部分以及共享存儲器中相應(yīng)的不同部分,并且基于在全局標(biāo)記隊(duì)列不同部分中的存儲器對象引用、在所述共享存儲器的不同部分上執(zhí)行標(biāo)記操作。
      14.根據(jù)權(quán)利要求13所述的系統(tǒng),其中所述一個或多個處理器通過下列處理在基于對存儲器對象的引用在部分共享存儲器上執(zhí)行標(biāo)記操作跟蹤在所述部分全局標(biāo)記隊(duì)列的存儲器對象引用、以及對從屬存儲器對象的引用,直到識別出對不在所述部分共享存儲器內(nèi)的存儲器對象的引用為止;將對在所述部分共享存儲器內(nèi)的存儲器對象的引用存儲在本地標(biāo)記堆棧中;以及將對不在所述部分共享存儲器內(nèi)的存儲器對象的引用存儲在非本地標(biāo)記堆棧中。
      15.根據(jù)權(quán)利要求11所述的系統(tǒng),其中所述全局標(biāo)記描述符數(shù)據(jù)結(jié)構(gòu)包含多處理器數(shù)據(jù)處理系統(tǒng)的處理器的本地標(biāo)記堆棧中、所有對被識別為在部分共享存儲器內(nèi)的存儲器對象的引用。
      16.根據(jù)權(quán)利要求10所述的系統(tǒng),其中所述系統(tǒng)是異構(gòu)多處理器數(shù)據(jù)處理系統(tǒng),其包含控制處理器和至少一個協(xié)處理器,以及其中所述控制處理器和至少一個協(xié)處理器使用不同的指令集操作。
      17.根據(jù)權(quán)利要求16所述的系統(tǒng),其中部分全局標(biāo)記隊(duì)列的加載、執(zhí)行標(biāo)記操作和識別對不在所述部分共享存儲器內(nèi)的存儲器對象的引用由所述至少一個協(xié)處理器中的一個或者多個執(zhí)行。
      18.根據(jù)權(quán)利要求17所述的系統(tǒng),其中所述加載、執(zhí)行和識別操作由所述至少一個協(xié)處理器中的一個或多個的存儲器流控制器執(zhí)行。
      全文摘要
      提供一種用于異構(gòu)多處理器系統(tǒng)中垃圾收集的系統(tǒng)和方法。在一些說明性實(shí)施例中,垃圾收集操作分布在異構(gòu)多處理器系統(tǒng)中的多個處理器上。將部分全局標(biāo)記隊(duì)列與相應(yīng)的共享存儲器塊一起分配給異構(gòu)多處理器系統(tǒng)的處理器。該處理器在它們所分配的部分全局標(biāo)記隊(duì)列和相應(yīng)的共享存儲器塊上執(zhí)行垃圾收集操作,將存儲器對象引用標(biāo)記為可達(dá)或?qū)⒋鎯ζ鲗ο笠锰砑拥椒潜镜貥?biāo)記堆棧中。將所標(biāo)記的存儲器對象與全局標(biāo)記堆棧合并,并且將非本地標(biāo)記堆棧中的存儲器對象引用與全局標(biāo)記隊(duì)列的“要跟蹤”部分合并,以便使用垃圾收集操作進(jìn)行重新檢查。
      文檔編號G06F12/02GK101075209SQ200710100919
      公開日2007年11月21日 申請日期2007年4月28日 優(yōu)先權(quán)日2006年4月28日
      發(fā)明者邁克爾·K·格施文德, 凱瑟琳·M·奧布賴恩, 約翰·K·奧布賴恩 申請人:國際商業(yè)機(jī)器公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
      1