-
Die
vorliegende Erfindung bezieht sich auf ein Verfahren und eine Anordnung
zum Verarbeiten gespeicherter Datenobjekte und insbesondere aber nicht
ausschließlich
auf die Verarbeitung der Finalisierung für Objekte in Speicherverdichtungs-
und Garbage-Einsammlungsprozeduren, durchgeführt in Echtzeit in echtem oder
in virtuellem Speicherraum einer Datenverarbeitungsanordnung.
-
Garbage-Einsammlung
ist der automatisierte Abruf von Systemspeicherraum nach der letzten
Verwendung durch ein Programm. Eine Anzahl Beispiele von Garbage-Einsammlungstechniken
werden beschrieben in: "Garbage
Collection: Algorithms for Automatic Dynamic Memory Management" von R. Jones u.
a., erschienen bei John Wiley & Sons,
1996, ISBN 0-471-94148-4, auf den Seiten 1 bis 18. Während die
Speicheranforderungen vieler Computerprogramme einfach und vorhersagbar
sind, wobei die Speicherzuordnung und die Rückgewinnung von dem Programmierer
oder einem Kompilator durchgeführt
wird, gibt es einen Trend zu funktionellen Sprachen mit mehr komplexen
Durchführungsmustern,
so dass die Lebensdauer bestimmter Datenstrukturen nicht länger vor
der Laufzeit bestimmt werden können
und folglich ist automatisierter Abruf dieser Speicherung, wenn
das Programm läuft,
wesentlich.
-
Finalisierung
ist ein Konzept, das in "Sun
Microsystems' Java ® und
anderen aktuellen Garbagegesammelten Sprachen und Programmierungsumgebungen,
wie Modula-3 und
Cedar, verwendet wird. Gespeicherte Datenobjekte können einen
assoziierten Finaliser haben, der durchgeführt werden soll, nachdem das
Objekt nominell für
Garbagesammlung verfügbar
wird aber bevor die Daten gesammelt werden. Der Zweck dieses Merkmals
ist das Ermöglichen,
dass ein Objekt alle andere Systemmittel aufräumt, die das Objekt beansprucht
hat, bevor es zerstört
wird. So würde
beispielsweise der Finaliser für ein
Java Datei-Objekt alle Systemdateihenkel, die von dem Objekt beansprucht
sind, schließen.
-
Da
ein Finaliser eine andere der Klasse von Objektverarbeitungsmethoden
ist, mit der ganzen Leistung anderer Methoden kann die Finalisierprozedur
auf alle Datenobjekte zugreifen, die von dem Objekt zugreifbar sind,
das finalisiert wird. Deswegen müssen
alle Objekte, die von einem Finaliser erreichbar sind, explizit
von Garbage-Einsammlung
ausgeschlossen werden. Weiterhin ist es möglich, dass das Finalisierverfahren
derartige Objekte, die von einem Finaliser erreichbar sind, wieder
aufleben lässt,
ein schließlich
des Objektes, das selber finalisiert wird, indem das Objekt wieder
erreichbar gemacht wird. Folglich kann eine Garbage-Einsammlungsprozedur nicht
Objekte löschen,
die von einem finalisierbaren Objekt erreicht werden können bis
der Finaliser durchgeführt
hat und die Erreichbarkeit der Objekte neu bewertet worden ist.
In Java und in anderen Sprachen wird die Möglichkeit, dass ein Objekt
sich selber wiederholt wieder aufleben lässt, typischerweise dadurch
entfernt, dass angegeben wird, dass der Finaliser für jede Instanz
nur einmal durchgeführt wird.
Diese Steuerung der Finalisierung wird hier vorausgesetzt.
-
In
PCs oder Arbeitsstationen ist die zusätzliche Verarbeitung und die
Speicherbelastung zum Unterstützen
der Finalisierung normalerweise kein Problem, und zwar wegen des
Betrags des Speichers, der typischerweise in einem PC vorhanden
ist, obschon die Unterstützung
selbstverständlich
die Gesamteffizienz beeinträchtigen
wird. In Umgebungen mit wenig Speicherraum, wie Settopboxen, aber kann
Unterstützung
für Finaliser
Probleme verursachen und sogar kann ein gleichzeitiger oder inkrementaler
Garbage-Kollektor
das Programm anhalten, bis es einige oder alle ausstehenden Finaliser
durchgeführt
hat und von ihm verwendeten Speicherraum wiedergewonnen hat.
-
Deswegen
ist es u. a. eine Aufgabe der vorliegenden Erfindung ein inkrementales
Garbage-Einsammlungssystem zu schaffen, das finalisierbare Objekte
unterstützt,
während
die Zeit zum Sammeln für
diese Objekte wo möglich
minimiert wird.
-
Nach
der vorliegenden Erfindung wird eine Garbage-Einsammlungs- und Markierungsverfahren geschaffen
zum Durchqueren von Datenstrukturen, die durch Datenobjekte gebildet
werden, die durch identifizierende Zeiger in einem durchgehenden Mengenspeicher
gekoppelt sind, mit Garbage-Einsammlung von Objekten klassifiziert
als löschbar, wobei
das Verfahren die nachfolgenden Verfahrensschritte umfasst:
- a) für
ein selektiertes Stammobjekt das Durchqueren der von ihm getragenen
Zeiger zum Ermitteln der mit dem Stammobjekt gekoppelten Objekte; und
- b) das Durchqueren der Zeiger zum Ermitteln weiterer Objekte,
die mit denjenigen gekoppelt sind, die durch den vorhergehenden
Verfahrensschritt identifiziert worden sind;
wobei der Schritt
b) wiederholt wird, bis kein Zeiger mehr durchquert zu werden braucht,
wodurch die darin identifizierten Objekte als markiert klassifiziert
sind,
wobei einige der Menge Datenobjekte Finaliser aufweisen
und einige weitere Objekte als von denjenigen Finalisern potentiell
erreichbar identifiziert sind, deren Objekte als schwe bend klassifiziert
sind, dadurch gekennzeichnet, dass ein erster Zählwert von Mengenobjekten beibehalten wird,
die Finaliser haben und für
jede Durchquerung, wenn die detektierte Gesamtheit an Objekten mit
Finalisern kleiner ist als der beibehaltene erste Zählwert,
eine weitere Löschung
durchgeführt
wird zum Identifizieren und Markieren von Stammobjekten für die restlichen
von Finalisern erreichbaren Objekte, während, wenn die detektierten
und beibehaltenen Gesamtheiten miteinander übereinstimmen, diejenigen Objekte,
die als schwebend klassifiziert sind, unmittelbar als löschbar neu
klassifiziert werden, wobei keine weitere Löschung durchgeführt wird.
-
Die
vorliegende Erfindung schafft ebenfalls eine Datenverarbeitungsanordnung
mit einem Datenprozessor, der mit einem RAM-Speicher gekoppelt ist,
der eine Anzahl Datenobjekte enthält, die in Datenstrukturen
durch identifizierende Zeiger miteinander verbunden sind und innerhalb
einer Menge in einem angrenzenden Gebiet des Speichers, wobei die
Anordnung weiterhin ein erstes zusätzliches Speichermittel aufweist,
das für
jedes Mengenobjekt einen Identifizierer für eine Klasse eines vorbestimmten
Satzes von Markierungsklassen enthält, und wobei der Prozessor
dazu vorgesehen ist, die nachfolgenden Vorgänge an der gespeicherten Menge
Datenobjekte zu effektuieren:
- a) für ein selektiertes
Stammobjekt, das die von ihm getragenen Zeiger durchquert zum Ermitteln der
mit dem Stammobjekt gekoppelten Objekte; und
- b) das Durchqueren der Zeiger zum Ermitteln weiterer Objekte,
die mit den identifizierten gekoppelt sind,
wobei der Prozessor
den Vorgang b) wiederholt, bis keine weiteren Zeiger mehr übrig sind,
die durchquert werden müssen,
wodurch die darin identifizierten Objekte als markiert klassifiziert sind,
wobei einige der Menge Datenobjekte Finaliser aufweisen und einige
weitere Objekte als von denjenigen Finalisern potentiell erreichbar
identifiziert sind, deren Objekte als schwebend klassifiziert sind,
dadurch gekennzeichnet, dass der Prozessor mit Mitteln gekoppelt
ist, die einen ersten Zählwert
von Mengenobjekten beibehalten, und vorgesehen sind um für jede Durchquerung
zu ermitteln, ob die detektierte Gesamtheit an Objekten mit Finalisern
kleiner ist als der beibehaltene erste Zählwert, wobei der Prozessor
konfiguriert ist zum Durchführen
einer weiteren Löschung
zum Identifizieren und Markieren von Stammobjekten für die restlichen
von Finalisern erreichbaren Objekte, während, wenn die detektierten
und beibehaltenen Gesamtheiten miteinander übereinstimmen, der Prozessor vorgesehen
ist alle Objekte, die als schwebend klassifiziert sind, unmittelbar
als löschbar
neu zu klassifizieren, wobei keine weitere Löschung durchgeführt wird.
-
Im
Betrieb können
Mengendatenobjekte, die Finaliser tragen, auf geeignete Art und
Weise einen betreffenden Merker enthalten, der, wenn eingestellt, vermeidet,
dass das Objekt neu als löschbar
klassifiziert wird. In einer derartigen Anordnung kann der beibehaltene
erste Zählwert
auf geeignete Art und Weise inkrementiert werden bei der Einstellung
des Merkers, und dekrementiert werden bei der Entfernung desselben.
Um das Auftreten, möglich
bei der inkrementellen Garbage-Einsammlung, der gesamten Anzahl
Mengenobjekte, die Finaliser tragen, die sich ändern, wenn der Streich fortschreitet,
zu bewältigen
kann ein zweiter Zählwert
der andauernden Anzahl markierter finalisierbarer Objekte, beibehalten werden,
wobei dieser zweite Zählwert
von der detektierten Gesamtzahl Objekte, die am Ende des Streichs
Finaliser tragen, und vor dem Vergleich mit dem ersten Zählwert subtrahiert
wird.
-
Weiter
Merkmale und Vorteile der vorliegenden Erfindung dürften aus
der Lektüre
der nachfolgenden Beschreibung von Ausführungsformen der vorliegenden
Erfindung hervorgehen und werden in den beiliegenden Patentansprüchen vorgetragen, auf
die verwiesen wird.
-
Ausführungsbeispiele
der Erfindung sind in der Zeichnung dargestellt und werden im vorliegenden
Fall näher
beschrieben. Es zeigen:
-
1 ein
Blockschaltbild eines Datenverarbeitungssystems, das geeignet ist
zur Verkörperung der
vorliegenden Erfindung; und
-
2 bis 4 eine
Darstellung der Gleichzeitigkeit der Markierungs- und der Streichvorgänge in dem
Stand der Technik und in einer ersten bzw. zweiten Ausführungsform
der vorliegenden Erfindung.
-
1 stellt
ein Datenverarbeitungssystem dar, wie ein PC, das als Gastgeber
für eine
Anzahl Software-Einrichtungen wirksam ist, die beispielsweise das
System als ein Stöberer
für Daten
konfiguriert, die eine virtuelle Umgebung definieren. Das System umfasst
eine zentrale Verarbeitungseinheit (CPU) 10, die über einen
Adress-und-Datenbus 12 mit einem RAM- und ROM-Speicher 14, 16 gekoppelt
ist. Diese Speicher können
aus einer oder mehreren integrierten Schaltungen bestehen und können um eine
Festplatte des Systems sowie um Mittel zum Auslesen aus zusätzlichen
(entfernbaren) Speicheranordnungen, wie einen CD-ROM, erweitert
werden. Mit der CPU 10 ist über den Bus 12 auch
eine erste und eine zweite Benutzereingangsanordnung 18, 20 gekoppelt,
die auf geeignete Art und Weise eine Tastatur und einen Cursor sowie
eine Selektionsanordnung, wie eine Maus oder eine Steuerkugel aufweisen
kann. Audio-Ausgang von dem System geht über einen oder mehrere Lautsprecher 22,
die von einer Audio-Verarbeitungsstufe 24 betrieben wird.
Video-Ausgang von dem System wird einem Wiedergabeschirm 26 angeboten,
der von der Wiedergabetreiberstufe 28 unter Ansteuerung
der CPU 10 betrieben wird. Eine weitere Datenquelle für das System
ist über
eine gekoppelte Verbindung mit entfernten Stellen, beispielsweise über das
Internet, wo das System zu diesem Zweck mit einer Netzwerkschnittstelle 30 versehen
ist, das mit dem Bus 12 gekoppelt ist.
-
Die
vorliegende Erfindung ist insbesondere verkörpert in der Speicherverwaltung
für eine
Arbeitsgebiet des RAMs 14 unter Ansteuerung der CPU 10;
wobei ein Steuerprogramm dazu zunächst in dem ROM 16 festgehalten
wird und mit dem Operationssystem geladen wird. Die nachfolgenden
Beispiele entsprechen gleichzeitigem Garbage-Einsammlungs- und Speicherverwaltungstechniken
in der Java (® Sun
Microsystems Inc.) virtuellen Maschine und die Terminologie soll
entsprechend ausgelegt werden; es dürfte aber erkannt werden, dass
die vorliegende Erfindung sich weder auf Java-entsprechende Systeme,
auf entsprechende (oder inkrementelle) Garbage-Einsammlung, noch
auf rein virtuelle Speicherverwaltung begrenzt.
-
Nachstehend
wird eine Anzahl bestimmter Terme mit einer speziellen Bedeutung
benutzt, und zwar wie folgt. Wurzelobjekte sind global zugreifbare gespeicherte
Datenobjekte in Systemen: in Java, werden diese durch statische
Dateien und Stapel dargestellt. Erreichbare Objekte sind gespeicherte Datenobjekte,
die mit der Datenstruktur verbunden sind, deren Kopf die Wurzelobjekte
des Systems sind: während
der Garbage-Einsammlung
soll der Markierungsprozess alle erreichbaren Objekte in einem einzigen
Garbage-Einsammlungszyklus finden. Nicht erreichbare Objekte sind
diejenigen gespeicherten Objekte, die nicht mit der Datenstruktur
verbunden sind; sie sind nicht zugreifbar für laufende Programme und sind
folglich Kandidat für
die Garbage-Einsammlung.
-
Finalisierbare
Objekte sind Datenobjekte, die nominell Garbage geworden sind, da
sie nicht erreichbar sind, die aber auch einen nicht leeren Finaliser
haben, der bisher noch nicht durchgeführt worden ist. Ein Finaliser
kann nur einmal durchgeführt werden,
so dass ein Objekt als finalisierbar betrachtet wird, wenn der Finaliser
noch nicht von dem Garbage-Kollektor durchgeführt worden ist. Finaliser-erreichbare
Objekte sind ein Subsatz der Gruppe nicht erreichbarer Objekte,
die durch Verfolgung von finalisierbaren Objekten erreicht werden
können:
diese Objekte sollen nicht als Garbage eingesammelt werden.
-
Mutatorfäden sind
Durchführungsfäden in einem
inkrementalen Garbagesammelsystem: der Name rührt von dem Effekt der Mutation
des Mengenspeichers her, der die gespeicherten Datenobjekte gleichzeitig
mit den Garbagesammelfäden
enthält, während ein
Garbage-Einsammlungsfaden ein speziellen Systemfaden ist, dessen
Zweck es ist, Garbageobjekte zu sammeln und mehr freien Raum in
dem Mengenspeicher zu schaffen. Ein Finaliserfaden ist ein spezieller
Systemfaden, der einen Finalisierungscode für unerreichbare Objekte mit
Finalisern laufen lässt.
-
Die
Detektionsperiode ist die Zeitperiode zwischen der letzten Referenz
an ein Objekt, das entfernt werden soll, und seiner Detektion als
ein unerreichbares Objekt. In Markierungslöschkollektoren wird dies durch
die Dauer des Markierungszyklus bestimmt. Die Reklamationsperiode
ist die Zeit zwischen einem Objekt, das als nicht erreichbar detektiert
wird und dem Punkt, wo es gelöscht
wird. In Markierungslösch-Garbage-Kollektoren
wird dies durch die Dauer des Löschzyklus
und das Vorhandensein finalisierbarer Objekte bestimmt.
-
Als
Illustration dürfte
es nützlich
sein, dass zunächst
eine allgemein angewandte Technik zum Finalisieren von Garbage-Einsammlung
näher betrachtet
wird, wobei diese Technik beispielsweise in der "Sun Java ® Virtual
Machine" v1.0.2
angewandt wird. Der typische nicht finalisierende Garbage-Einsammlungszyklus
kann unabhängig
von Implementierungseinzelheiten beschrieben werden, als zunächst die
Aufteilung des Massenspeichers in erreichbare und nicht erreichbare
Sätze mit
Datenobjekte, wonach die Garbage-Einsammlung des nicht erreichbaren
Satzes folgt. Finalisierung erschwert die Garbage-Einsammlung dadurch,
dass jedem Garbage-Einsammlungszyklus eine neue Stufe hinzugefügt wird,
wie das Aufteilen des Massenspeichers in erreichbare und nicht erreichbare
Sätze,
wie oben beschrieben. Diesem Vorgang folgt eine Aufteilung des nicht
erreichbaren Satzes in Garbage und von Finaliser erreichbare Sätze und
zum Schluss wird Garbage-Einsammlungen
dem Garbage-Satz durchgeführt und
zum Schluss wird die Durchführung
an dem von Finaliser erreichbaren Satz implementiert.
-
Diese
Verlängerung
des Zyklus bedeutet, dass die Verzögerung zwischen Objekten nicht
erreicht bar wird und deren Einsammlung größer gemacht wird, mit der Folge,
dass ein größerer Teil
des Massenspeichers durch Garbage-Objekte benutzt wird und deswegen
ein kleineres Gebiet des Massenspeichers für neue Items verfügbar ist.
Auch die starke Abhängigkeiten
zwischen den Stufen in den Zyklen bedeuten, dass die meisten Implementierungen schlechte
Gleichzeitigkeitscharakteristiken haben, mit langen Pausen in den
Mutatorfäden,
je nachdem der Garbage-Einsammlungsalgorithmus fortschreitet. In
der Erwägung,
dass die Anzahl finalisierbarer Objekte in einem Typischen System
ein geringer Prozentsatz des Satzes aktiver Objekte ist, sind die
hinzugefügten
Gemeinkosten der Finaliserunterstützung unverhältnismäßig groß. Der Zustand
jedes Objektes in dem System wird durch zwei Variablen M und F identifiziert,
wobei M Markiert (einschließlich jedes
anderen Markierungszustandes) oder Unmarkiert sein kann und F Finaliser
oder Kein Finaliser angeben kann.
-
Die
einzelnen Aufgaben, die für
den Garbage-Kollektor relevant sind und ihre Interaktion in dem einfachen
System sind in 2 dargestellt. Die Mutator-Fäden MU können zu
jeder Zeit neue Objekte in dem Massenspeicher schaffen. Die Markierungsstufe
MA umfasst die Spurfolge von Objekten von Stammobjekten. Durch diese
Spurfolge gefundene Objekte haben M = Markiert und Markierung kann
in dem Garbage-Einsammlungsfaden oder in dem dargestellten Fall
einer inkrementellen Garbage-Einsammlung, in dem Motoatorfäden durchgeführt werden.
Die Finaliser-Aufteilung F–P
umfasst das Reinigen des Massenspeichers, indem Objekte mit M = Nicht
Markiert und F = Finaliser in eine Reihe gesetzt werden, wobei dann
eine Markierungsphase finalisierbare Objekte als Stamm verwendet:
diese laufen in dem Garbage-Einsammlungsfaden (GC). Die Finalisierungsstufe
FS umfasst die Durchführung
von Finalisern in der Reihe, und setzt F = Kein Finaliser für Objekte
nach der Durchführung.
Dies kann in dem Garbage-Einsammlungsfaden (GC)laufen, wie dargestellt,
und zwar in einem zugeordneten Finaliserfaden FS.
-
Diese
Technik hat eine Anzahl schlechte Charakteristiken, von denen die
erste eine schlechte Gleichzeitigkeit mit den Schritten der Markierungsphase
MA, Finaliser-Aufteilung F–P,
und Garbage-Einsammlungsreinigung GC, die seriell auftritt. Folglich
kann die inhärente
Unabhängigkeit
zwischen den Aufgaben nicht in einem Mehrfachfadensystem durchgeführt werden.
Ein weiteres Problem ist die im Allgemeinen langen Reklamationszeiten
für alle
Objekte. Für
Nicht-Finaliser-erreichbare Garbage (was der Hauptteil sein wird),
wird in diesem Zyklus keine Garbage eingesammelt, bis die Finaliser-Aufteilung F–P vollständig ist.
Dies ist verschwenderisch, da die Objekte während der Finalisierungsaufteilung
F–P sowieso
untersucht worden sind. Mit inkrementellen Garbage-Ein sammlungsalgorithmen
ist die Systempause für
Mutatoren während
die Finaliser-Aufteilung F–P
und die Garbage-Einsammlungsreinigung GC auftreten, unakzeptierbar
lang, und zwar zwei komplette Reinigungen über den Massenspeicher plus der
Finaliser-erreichbaren Markierungsphase umfassend.
-
Zum
Reduzieren dieser Verzögerungen
ist eine andere Art und Weise der Aufteilung von Aufgaben zwischen
Fäden für eine effizientere
Verwendung von Mehrfacheinfädelung
erforderlich, während die
Fähigkeit
um Finaliser effizient zu verarbeiten beibehalten wird. Eine erste
Verbesserung wird durch Parallelverarbeitung der Markierungs- und
Reinigungszustände,
was aus der Erweiterung der Anzahl Markierungszustände hervorgaht,
so dass M Markiert, Nicht Markiert, Hängend oder Löschbar sein kann,
wobei nur 2 Bits je Objekt zur Speicherung von M erforderlich sind,
wie in der Veröffentlichung WO-A-9967741 mit dem Titel "Finalisation in Incremental
Garbage Collectors" beschrieben.
Als weiteres Beispiel zeigt 3 die resultierende
Gleichzeitigkeit der Markierung und der Reinigung in dieser Anordnung
mit vier Markierungszuständen.
Wie in dem Beispiel nach 2 werden Mutatoren MU durchgeführt, die
neue Objekte auf dem Massenspeicher modifizieren oder Schaffen,
während
die Markierungsphase MA gleichzeitig mit der Mutatorhandlung Objekte
markiert, die von den Stammobjekten zugreifbar sind. M = Markiert
wird gesetzt für
gefundene Objekte mit einem Synchronisationspunkt SP (nachstehend
noch näher
beschrieben), die bei Vervollständigung
auftreten. Dies kann in allen Fäden durchgeführt werden.
-
Die
Reinigungsstufe GC besteht aus einer linearen Reinigung über den
Massenspeicher, wobei alle Objekte mit M = Löschbar (detektierte Nicht-Erreichbare)
bei Punkt D1 gelöscht
werden, während Objekte
mit M = Hängend
und F = Finaliser in die Finaliser-Schlange gesetzt und markiert
werden. Reinigung wird in dem Garbage-Einsammlungsfaden durchgeführt, wie
bei GC1 angegeben und wartet bei Vervollständigung auf den Synchronisationspunkt. Die
Finalisierungsstufe führt
Finaliser für
Objekte in der Finaliser-Schlange durch und setzt F = Kein Finaliser
nach dem Durchlauf bei Punkt D2. Finalisierung wird in dem Garbage-Einsammungsfaden
durchgeführt
oder in einem zugeordneten Finalisierungsfaden.
-
Das
Verfahren umfasst einen Synchronisationspunkt (wie oben erwähnt) an
dem die Resultate der Markierungsphase in die Reinigungsphase übertragen
werden. Die nächste
Markierungsphase und der Reinigungszyklus können beide unmittelbar nach dem Synchronisationspunkt
SP beginnen: obschon der Reinigungsfaden, wie dargestellt, am Anfangspunkt
des Synchronisationspunktes SP anfangen kann, wird er nur Sachen
verarbeiten, wie Zustandsänderungen
usw. bis SP abgeschlossen ist, wenn die wirkliche Reinigung anfängt. Der
Synchronisationspunkt selber führt
die nachfolgenden Vorgänge durch:
- 1. Das Drehen oder Verschieben von M für alle Objekte:
dieser Vorgang verwandelt die Perzeption des gespeicherten Codes
der Systeme ((beispielsweise binär
10) was Markiert angibt um eine Nicht Markierte nachfolgende Drehung
anzugeben, mit einer ähnlichen
Umwandlung für
Nicht Markiert bis Hängend
und Hängend
zu Löschbar. Stattdessen,
dass eine Reinigung über
alle Objekte und eine Modifizierung aller betreffenden gespeicherten
Markierungszustandsbits erforderlich ist, wird dieser Vorgang durch
Drehung oder Verschiebung der Bedeutungen der Markierungszustandsbits
durchgeführt.
- 2. Das Zuordnen der neuen Stammobjekte für die nächste Markierungsphase, einschließlich der Objekte
in der aktuellen Finalisierungsschlange.
-
Das
Addieren der neuen Markierungszustände zusammen mit einem effizienten
Verfahren zum Drehen der Zustände
ermöglicht
es, die parallele Verarbeitung der Software der Finaliser-erreichbaren Abtastung
und der Garbage-Abtastung. Dies dauert zwei Garbage-Einsammlungszyklen
zum Verlagern eines Nicht Markierten Objektes in den Löschbaren Zustand
(Punkt D3 in 3), was lange genug ist zum
Detektieren der Finaliser-Erreichbarkeit in der dazwischenkommenden
Markierungsphase. Das Mischen der Stamm-Markierung und der Finaliser-erreichbaren
Markierung reduziert die Codegröße und eliminiert
auch die Notwendigkeit einer Finaliser-Aufteilung (F–P, 2)
zum Trennen Finaliser-erreichbaren Objekte. Der kurze Synchronisationspunkt
SP ist der einzige Punkt, wo die Mutator-Fäden gesperrt werden. Dieses
Verfahren hat dazu eine ausgezeichnete inkrementelle und Mehrfach-Fadenleistung,
da die Reinigungs-, die Finaliser- und die Mutator-Fäden mit
einem hohen Unabhängigkeitsgrad
arbeiten. Die Zykluszeit ist auch kürzer, da jeder Zyklus aus nur
einer Markierungsphase besteht und jeweils nur eine Reinigung gleichzeitig
funktioniert. Dadurch und durch das hohe Verhältnis des Zyklus, für den der Markierungsprozess
aktiv ist, soll die Detektionsperiode für nicht referierten Objekte
auf ähnliche
Weise reduziert werden.
-
Im
Betrieb löst
die Garbage-Einsammlungsreinigung eine Markierung des Finaliser-erreichbaren Satzes
aus, wenn dieser Objekte in dem Hängenden Zustand trifft. Auf
diese Weise betreibt der Reiniger auf effektive Weise den Markierungsprozess,
dies im Gegensatz zu den herkömmlichen
Markierungsreinigungsprozessen, wobei der Markierer von einem unabhängigen Stammsatz
außerhalb
des Massenspeichers betrieben wird.
-
Es
gibt einen wenig befriedigenden Aspekt, indem die Reklamationsperiode
für den
Prozess dennoch hoch ist. Garbage-Objakte werden innerhalb von zwei
Zyklen von dem Synchronisationspunkt eingesammelt, wo sie als unerreichbar
identifiziert worden sind (der Zustandsübergang von Nicht Markiert zu
Hängend).
In den meisten Zyklen werden keine neuen finalisierbaren Objekte
unerreichbar und in diesen Zyklen werden alle Hängenden Objekte in dem nächsten Zyklus
Löschbar,
so dass sie theoretisch in dem Hängenden
Zyklus gelöscht
werden. Dies geht aus den speziellen Charakteristiken der Finaliser-Objekte in dem Hängenden
Zustand hervor, wobei diese Charakteristiken in der vorliegenden
Erfindung zum Verbessern der Effizienz der Garbage-Einsammlung für Finaliser
benutzt werden, entweder in einem inkrementellen System, wie oben
anhand der 3 beschrieben, oder mehr sequentielle Markieren-danach-Reinigen-Anordnungen.
-
Eine
Ausführungsform
wird nachstehend als eine Verbesserung des oben anhand der 3 beschriebenen
vier-Markierungen-Zustandes beschrieben, wobei die Ausführungsform
ein Mittel schafft um auf zuverlässige
Art und weise zu detektieren, ob Objekte in dem Hängenden
Zustand auf sichte Weise gelöscht
werden können.
Diese Prozedur wird dadurch durchgeführt, dass die Anzahl Objekte
mit Finalisern befolgt wird, die beim Markieren gefunden wurden,
und dadurch, dass diese mit einer bekannten und gespeicherten zugeordneten
Gesamtzahl in dem Speicher verglichen wird. Da die Finalisierungsschlange
in dem Markierungsprozess untergebracht ist, sind die einzigen finalisierbaren,
die währen
d der Markierung nicht lokalisiert worden sind, diejenigen, die
während
des vorhergehenden Einsammlungszyklus nicht erreichbar wurden. Wenn
nicht alle finalisierbaren Objekte in der vorhergehenden Markierungsphase
untergebracht sind, gibt es einen nicht leeren Satz Finaliser-erreichbarer
Objekte, die bei der Reinigung identifiziert werden sollen. Wenn
aber alle finalisierbaren berücksichtigt
worden sind. Sind alle Hängenden
Objekte als Garbage bekannt und können sofort gelöscht werden.
-
Die
Objektzustände
sind wie in 3, wobei aber drei neue allgemeine
Variable hinzugefügt
worden sind:
- – finaliser_count Eine Zählung der
gesamten Anzahl finalisierbarer Objekte in dem Massenspeicher
- – found_count
Die Anzahl von Finaliser erreichbarer Objekte, die sich während des
Markierungsprozesses angesiedelt haben
- – shortcut
Einen Merker, der angibt, wie der Reinigungsprozess sich in diesem
Zyklus benehmen soll.
-
Die
Aufgaben werden im Allgemeinen wie in dem Beispiel nach 3 durchgeführt, aber
mit einigen Ausnahmen, wie in 4 dargestellt.
In dem Fall der Mutatoren wird, wenn ein neues Objekt F = Finaliser
hat, wird der finaliser_count inkrementiert. Während der Markierung wird,
wenn ein gefundenes Objekt F = Finaliser hat, found_count inkrementiert. Während der
Reinigung werden, wenn der variable "shortcut" wahr ist, M = Hangend und M = Löschbar beim
Punkt D5 gelöscht;
wenn "shortcut" falsch ist, dann
werden alle Objekte mit M = Löschbar
gelöscht und
alle Objekte mit M = Hänged
und F = Finaliser in die Finaliser-Schlange gesetzt und für eine nachfolgende
Löschung
beim Punkt D6 markiert. Finalisierung wird wie oben durchgeführt aber,
nach dem Durchlauf des Finaliser-Fadens für ein Objekt, wird F auf Nihct
Finaliser gesetzt, das Objekt wird markiert und found_count und
finaliser_count werden dekrementiert.
-
Die
am Synchronisationspunkt angewandte Prozedur umfasst nun eine Bewertung
der Zählvariablen,
wobei, nach Drehung der Bedeutung von M und der Zuordnung der Stammobjekte,
die Variable "shortcut" auf das Ergebnis
(found_count = finaliser_count) gesetzt wird:
Wenn die Technik
auf einen inkrementellen Garbage-Kollektor angewandt wird, wie beschrieben,
kann der finaliser_count sich während
des Markierungsdurchgangs ändern.
Um die Zählwerte
konsistent zu machen soll der found_count keine Objekte enthalten,
die während
des Markierungsdurchgangs gefunden wurden, oder der Verglkeich wird
das falsche Ergebnis liefern. Um dies zu vermeiden kann während des
Durchgangs der found_count 1 subtrahiert haben, wenn ein markiertes
finalisierbares Objekt gefunden wird. Auf alternative Weise kann
ein zweiter beginnender Zählvorgang
processed_count eingehalten werden zum Aufzeichnen der Anzahl markierter
Finaliser, die während
einer Reinigung gefunden wurden, wobei processed_count vom found_count gelöscht wird,
und zwar vor einem Vergleich mit finaliser_count.
-
4 zeigt
dieses optimierte Finalisierungsmodell mit zusätzlicher Reklamation durch
Verwendung der "shortcut" Variablen: es dürfte einleuchten, bei
einem Vergleich mit der Technik nach 3, dass die
Technik nach 4 1-Zyklus Reklamation gewährleistet,
wenn keine Finaliser verwendet werden und maximal eine 2-Zyklen
Reklamation für
4 alle nicht-Finaliser-erreichbaren Datenobjekte.
-
In
dem im Allgemeinen seltenen Fall, dass eine Datenstruktur mit mehr
als nur einem finalisierbaren Objekt nicht erreichbar wird, wird
die Anzahl in diesem Zyklus detektierter finalisierbaren Objekte ungewiss,
und zwar wegen einer Rennbedingung zwischen dem Markierungsprozess
und dem Abtastfortschritt. So wird beispielsweise das Objekt F1 durch
die Reinigung gefunden, der Finalisierungsschlange hinzugefügt und markiert:
F1 referiert an ein anderes finalisierbares Objekt F2, das ebenfalls
in diesem Zyklus nicht erreichbar ist. Je nach dem verhalten des
Markierungsalgorithmus kann F2 von dem Markierer erreicht werden,
bevor oder nachdem die erste Reinigung ihn erreicht. F2 wird in
diesem Zyklus nur der Finalisierungsliste hinzugefügt, wenn
der Reiniger es erreicht. Eine mögliche
Lösung
wäre, Objekte
in die Finalisierungsschlange zu setzen, wenn sie markiert sind,
so dass dieselben Vorgänge
für ein Objekt
durchgeführt
werden, ungeachtet ob es durch den Reinigungs- oder den Markierungsprozess
gefunden wurde.
-
Ein
aggressiver Markierungsalgorithmus wird dazu neigen, zu vermeiden,
dass niedrige finalisierbare Objekte in einer verbundenen Datenstruktur während desselben
Zyklus wie die oberen Pegel der Struktur in die Schlange geraten,
was zu einer halbtopologischen Reihenfolge der Finaliser führt. Dies hilft
typischerweise das Neuverwenden von Raten, da höhere Objekte in einer Datenstruktur
einen größeren erreichbaren
Satz haben werden als niedrigere Terme, und werden deswegen dazu
neigen, mehr Objekte bei Löschung
unerreichbar zu machen.
-
Folglich
kann das Markieren von vorhandenen Finalisierbaren während der
Reinigung verzögert werden,
bis die Reinigung vollständig
ist, so dass alle neu nicht erreichbaren Finalisierbaren zu der
Finalisierungsschlange hinzugefügt
werden. Dies hilft die Vorhersagbarkeit und ermöglicht eine Verstärkung der
Reklamationsperiodendefinitionen: 1-Zyklus Reklamation wird gewährleistet,
wenn keine nicht erreichbaren finalisierbaren Objekte in der vorhergehenden
Markierungsphase detektiert sind.
-
Obschon
im Grunde in Termen einer Software-Stöbererimplementierung definiert,
dürfte
es dem Fachmann einleuchten, dass viele der oben beschriebenen funktionellen
Merkmale auch durchaus in Hardware oder in einer Kombination von
Hardware und Software implementiert werden könnten.
-
Text in der
Zeichnung
-
-
- 30
- Netzwerkschnittstelle
- 18
- Benutzereingangsanordnung
- 24
- Audioverarbeitung
- 28
- Wiedergabetreiberstufe
- 26
- Wiedergabeanordnung
-
-
2
- Zyklus Zeit
-
3
- Zyklus Zeit
-
4
- Zyklus Zeit