2011-03-14 76 views
12

我正在閱讀有關垃圾收集器實現的信息,特別是有關標記和掃描即時收集器的實現,以及在標記階段未完成時允許修改器工作的事實(因此避免阻止世界)必須使用記憶屏障。例如,如果一個標記(黑色)對象被修改器修改爲指向一個未標記(白色)對象,那麼該白色對象必須標記爲灰色(標記爲活動但尚未掃描)。垃圾收集器的內存屏障實現

但我找不到任何細節,如何可以實現:如何檢測黑色對象何時被更改並在那一刻執行操作?

回答

13

也許混淆的術語是責怪。在垃圾收集術語中,所謂的障礙通常是編譯器在指針讀取和寫入之前插入的代碼片段。因此,您的程序在每次讀取和寫入之前總是執行屏障代碼。 (您也可以使用虛擬內存保護來獲得屏障效果。)

爲了保持您提到的三色不變性,收集器在寫入對象之前先檢查它的顏色。在這種情況下,只要它將黑色對象改變爲灰色對象,寫入屏障就可以執行一些操作。

有關更多詳細信息,請參見http://www.memorymanagement.org/glossary/s.html#strong.tri-color.invariantthis article

+0

但是,像boehm gc這樣的收集器如何工作呢?它不能插入代碼,因爲它適用於用gcc編譯的正常c程序。而且我已經在某個地方看到它使用內存屏障。 – Damian 2011-03-15 13:25:58

+0

對,Boehm收集器使用虛擬機保護來實現障礙 - 對不起,如果我的括號評論是神祕的。 – EmeryBerger 2011-03-15 16:28:53

10

我閱讀有關垃圾收集器的實現,特別是約標記和清除的即時收藏家,而且事實上允許存取器工作時,標記階段未完成(從而避免阻止世界)必須使用記憶障礙。

我認爲你會混淆寫入障礙和內存障礙。垃圾收集器使用寫入障礙來跟蹤堆的拓撲變化。內存屏障是一種低級別的併發原語,可防止內存操作由編譯器和CPU本身重新排序。

所以你想要搜索GC寫障礙。特別是Yuasa,Steele和Dijkstra寫入了障礙。

垃圾收集器還可以使用讀取屏障處理堆拓撲的即時突變。