| |
11
Bei Dijkstras Update-Funktion wird zuerst der Zeiger von A auf C gesetzt und dann C
gefärbt, obwohl dadurch zwischenzeitlich die Schwarz-Weiß-Invariante
g
ebrochen
wird. In einer parallelen Implementierung muss jede Update-Funktion eine atomare
Aktion sein [Jo96]. Jones und Lins haben weiter gezeigt, dass eine Umkehrung der Re i-
henfolge dazu führen kann, dass C beim nächsten GC-Zyklus fälschlicherweise als Gar-
bage identifiziert wird, wenn der Mutator unterbrochen wird [S.192, Jo96].
Steele verwendet eine weniger konservative Incremental- Update Write-Barrier, bei der
eine schwarze Elternzelle mit einem Zeiger auf eine weiße Zelle wieder grau gefärbt
wird (siehe Zelle A in Abb.2 b). Zur Darstellung der grauen Farbe verwendet er aller-
dings einen zusätzlichen Mark-Stack und ein Farb-Bit anstatt zwei Farb-Bits. D.h. die
Farbe grau wird durch Setzen des Farb-Bits und durch Packen (Push) eines Verweises
auf den Mark-Stack realisiert. Für eine parallele Ausführung muss bei Steeles Write-
Barrier sichergestellt sein, dass die Update-Funktion nicht vom Mutator unterbrochen
werden kann [Jo96].
In Yuasas Snapshot-Write-Barrier werden Originalreferenzen dadurch bewahrt, dass sie
immer (während der Markierungsphase) grau markiert werden, wenn der Zeiger auf sie
entfernt wird. Dazu wird wie bei Steeles Algorithmus auch ein Mark-Bit und ein Mark-
Stack benutzt, wie aus Algorithmus 2 zu entnehmen ist. Angenommen A hat einen Ze i-
ger auf B und führt die Update (A,C)-Funktion aus, um auf C statt auf B zu verweisen;
dann wird während der GC-Markierungsphase zunächst die vorherige Referenz von A,
(d.h. B) gefärbt - shade (*A) -
und anschließend der neue Zeiger von A auf C g
e-
setzt - *A=C. Auf diese Weise sind bei der Snapshot-at-beginning Write-Barrier auch
die ursprünglich aktiven Datenstrukturen seit Beginn des GC-Vorgangs für den Collec-
tor erkennbar. In dem Beispiel würde C während der aktuellen GC-Phase erhalten ble i-
ben, unabhängig davon, ob es überhaupt noch benötigt wird.
shade(P)=
if not marked(P)
mark_bit(P)=marked
gcpush(P, mark_stack)
Update(A,C)=
if phase == mark_phase
shade(*A)
*A=C
Quelle: [S. 190, Jo96]
Algorithmus 2: Yuasas Snapshot-Write-Barrier
Bei einer statischen Snapshot-Barrier kann der Speicher nicht von Objekten bereinigt
werden, die während des GC-Zyklus überflüssig werden. Darum wird eine Snapshot-
Barrier im Vergleich zu einer Incremental- Update-Barrier als konservativer angesehen
[Jo96]. Während letztere verhindern sollen, dass die schwarz-weiß Invariante gebrochen
|  |
|
| |
|
|