欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

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

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

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


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