-
Technisches Gebiet
-
Die
vorliegende Erfindung bezieht sich auf das Gebiet von Objektverweisen
und insbesondere auf das Gebiet der Objektverweisoptimierung.
-
Hintergrund der Erfindung
-
Einige
Computeranwendungen, wie zum Beispiel CAD/CAM-Anwendungen greifen
typischerweise auf große
Sätze von
Datenobjekten („Objekte") zu, entwerfen,
pflegen und ändern
diese über
einen langen Zeitraum, unter Verwendung eines einzelnen Computersystems
oder unter Verwendung einer Anzahl verbundener Computersysteme.
Für derartige Objekte
ist es üblich,
dass sie Verweise auf andere Objekte in dem Objektsatz enthalten.
Derartige Anwendungen verwenden oft ständige Objektsysteme, um diese
Objekte zu pflegen und sie für
den Zugriff und für Änderungen
auf einem beliebigen verbundenen Computersystem zugänglich zu
machen. Ständige
Objektsysteme stellen die stetige Verfügbarkeit von ständigen Objekten
sicher, indem sie diese auf eine nichtflüchtige Art auf einem Objektserver
speichern, wie zum Beispiel einer Datenbank oder einem Dateisystem,
während
ständige
Objekte in den Hauptspeicher eines Computersystems verschoben werden
können,
damit auf dem Computersystem ausgeführte Programme darauf zugreifen
und sie verarbeiten können.
-
Wenn
ein auf dem Computersystem ausgeführtes Programm den Zugriff
auf ein Objekt und Änderungen
an diesem auf seinem Hauptspeicher beendet, überträgt das ständige Objektsystem das Objekt
auf den Objektserver, so dass das Objekt auf eine nichtflüchtige Art
gespeichert wird. Das übertragene
Objekt kann Verweise auf andere Objekte in dem Objektsatz enthalten.
Zu dem Zeitpunkt der Übertragung
umfasst jeder dieser Verweise im Allgemeinen einen Pointer auf eine
Adresse in dem Hauptspeicher des gleichen Computersystems, in das
das referenzierte Objekt geladen wurde. Derartige Verweise hängen von
der Identität
des Computersystems, die durch den Pointer nicht wiedergegeben wird,
sowie dem bestimmten Inhalt des Hauptspeichers des Computersystems
ab, der vollkommen verschieden sein kann, wenn ein Programm das
nächste Mal
das übertragene
Objekt von dem Objektserver überträgt. Wenn
der Objektserver zu einem späteren Zeitpunkt
die Version des Objekts, die Hauptspeicherpointer enthält, ei nem
Programm auf einem anderen Computersystem zur Verfügung stellt,
werden die Hauptspeicherpointer in dem Objekt ungültig sein.
Als Teil des Verfahrens zum Übertragen
des Objekts auf den Objektserver, führt das ständige Objektsystem deshalb
ein als „Passivierung" („passivation") bezeichnetes Verfahren
durch. Passivierung umfasst das Ersetzen der Verweise des Hauptspeicherpointers
in dem passivierten Objekt, die dazu verwendet werden, die referenzierten
Objekte in dem Hauptspeicher des gegenwärtigen Computersystems zu lokalisieren,
durch die von dem ständigen Objektsystem
verwendeten ständigen
Pointer, um die referenzierten Objekte auf dem Objektserver zu lokalisieren.
(Ständige
Pointer werden auch als „Objektidentifikatoren" (OID) bezeichnet
und können
unter Verwendung von Datenstrukturen mit globalen eindeutigen Identifikatoren
(GUID) dargestellt werden.) Das derartige Ersetzen eines Hauptspeicherpointers
durch einen ständigen
Pointer wird als „Rückgängigmachen
des Umwandelns" ("unswizzling") des Hauptspeicherpointers
bezeichnet.
-
Wenn
ein Programm zu einem späteren
Zeitpunkt das ständige
Objektsystem verwendet, um auf das auf den Objektserver übertragene
Objekt zuzugreifen oder dieses zu ändern, überträgt das ständige Objektsystem das Objekt
von dem Objektserver zu dem Hauptspeicher des Computersystems, auf
dem das Programm ausgeführt
wird, und führt
ein Verfahren zur „Entpassivierung" ("depassivation") durch. Entpassivierung
umfasst das Ersetzen der ständigen Pointer
in dem übertragenen
Objekt, die im Allgemeinen von dem Programm nicht verwendet werden können, um
auf die referenzierten Objekte, auf die durch die ständigen Pointer
Bezug genommen wird, zuzugreifen und diese zu ändern, durch Hauptspeicherpointer,
die das Programm verwenden kann, um auf die referenzierten Objekte
zuzugreifen und diese zu ändern.
Das derartige Ersetzen eines ständigen Pointers
durch einen Hauptspeicherpointer wird als „Umwandeln" („swizzling") des ständigen Pointers bezeichnet.
-
Herkömmliche
Umwandlungsverfahren werden in drei Kategorien eingeteilt, von denen
jedes wesentliche Nachteile aufweist. Die Hardwareumwandlung verwendet
die Seitenspeichertechnik eines vorhandenen virtuellen Speicherverwaltungssystems,
um referenzierte Objekte zu laden, wenn die auf sie gerichteten
Hauptspeicherpointer durch das Programm, das das entpassivierte
Objekt verwendet, aufgelöst
werden. Virtuelle Speicherverwalter teilen einen Adressraum des
Hauptspeichers, der größer als
der tatsächliche
Hauptspeicher ist, in Seiten mit einer festen Länge ein. Einige der Seiten
in dem Hauptspeicherraum werden tatsächlich in dem Hauptspeicher
abgebildet, während
andere „seitenausgelagert" („paged
out") werden. Wenn
ein Programm versucht, einen Poin ter auf eine seitenausgelagerte
Seite zu dereferenzieren, führt
der Versuch zu einem Hardware-Interrupt, der als „Seitenfehler" („page fault") bezeichnet wird.
Seitenfehler werden von einer Interrupt-Dienstroutine (ISR) bearbeitet,
die die fehlerhafte Seite „seiteneinlagert", indem sie Platz
für sie
im Hauptspeicher findet (in den meisten Fällen durch Seitenauslagern
einer anderen Seite), die fehlerhafte Seite von einer Festplatte
in den Hauptspeicher lädt,
die fehlerhafte Seite als seiteneingelagert markiert und indem sie
der Dereferenzierungsoperation ermöglicht, fortzufahren.
-
Nach
dem Hardwareumwandlungsverfahren wird, wenn das entpassivierte Objekt
geladen wird, jeder ständige
Pointer durch einen Hauptspeicherpointer auf eine „Geisterseite" („ghost
page") ersetzt, die
als seitenausgelagert markiert wird. Wenn ein Programm versucht,
einen Hauptspeicherpointer auf eine Geisterseite zu dereferenzieren,
wird ein Seitenfehler erzeugt und eine geänderte Bearbeitungsroutine
des Seitenfehlerinterrupts lädt
das referenzierte Objekt von dem Objektserver unter Verwendung seines
ständigen
Pointers, markiert die Geisterseite als seiteneingelagert und ermöglicht der
Dereferenzierungsoperation fortzufahren. Nachfolgende Versuche,
den Hauptspeicherpointer zu dereferenzieren, laufen ohne weitere
Verzögerung
ab. Die Hardwareumwandlung hat den Vorteil, dass referenzierte Objekte
nicht geladen werden, bis auf sie tatsächlich zugegriffen wird. Die
Hardwareumwandlung weist jedoch auch zwei wichtige Nachteile auf:
(1) Das Seitenfehlerverfahren und das Seiteneinlagern sind kostspielige
Operationen, die ungefähr
so lange dauern wie das Ausführen
von 2000 Befehlen auf einigen Prozessoren. (2) Die von virtuellen
Speicherverwaltungssystemen verwendete feste Seitengröße ist zum
Speichern von Objekten mit variabler Größe schlecht geeignet – das führt dazu,
dass ein Teilabschnitt des Hauptspeichers, der größer als
das geladene Objekt ist, ausschließlich für das geladene Objekt reserviert
ist, und Objekte, die mit der Zeit so groß werden, dass sie die Größe der zugeordneten Seiten überschreiten,
nicht aufnehmen kann.
-
Die
indirekte Softwareumwandlung verwendet einen Speicherplatz, der
als ein „residenter
Objektdeskriptor" („resident
object descriptor")
bezeichnet wird, um einen Grad an Umleitung zwischen einem Pointer
in dem entpassivierten Objekt und dem referenzierten Objekt zu schaffen.
Nachdem ein entpassiviertes Objekt geladen wurde, wird jeder ständige Pointer
in dem entpassivierten Objekt in einen residenten Objektdeskriptor
verschoben und durch einen Pointer auf den residenten Objektdeskriptor
ersetzt. Das erste Dereferenzieren der Pointer auf einen residenten
Objektdeskriptor führt
dazu, dass das referenzierte Objekt geladen und ein Hauptspeicherpointer
auf das geladene referenzierte Objekt in dem Objektdeskriptor gespeichert
wird. Dann wird der Hauptspeicherpointer auf das geladene referenzierte Objekt
in dem residenten Objektdeskriptor dereferenziert, um den Zugriff
auf das referenzierte Objekt möglich
zu machen. Wenn der Pointer auf einen residenten Objektdeskriptor
danach dereferenziert wird, wird der Hauptspeicherpointer auf das
geladene referenzierte Objekt in dem residenten Objektdeskriptor dazu
verwendet, um auf das referenzierte Objekt zuzugreifen. Genau wie
die Hardwareumwandlung weist die indirekte Softwareumwandlung den
Vorteil auf, dass referenzierte Objekte nicht geladen werden; bis
auf sie tatsächlich
zugegriffen wird. Ferner kann die Ladung von referenzierten Objekten
rückgängig gemacht
werden oder die Objekte können, ohne
Pointer ungültig
zu machen, in den residenten Objektdeskriptor, der in den entpassivierten
Objekten gespeichert ist, verschoben werden. Die indirekte Softwareumwandlung
weist jedoch auch einen wichtigen Nachteil auf: Das Dereferenzieren
von zwei Hauptspeicherpointern (der erste in dem entpassivierten
Objekt, der zweite in dem residenten Objektdeskriptor), das jedes
Mal erforderlich ist, wenn das Programm auf das referenzierte Objekt
zugreift, dauert doppelt so lange wie das Dereferenzieren eines einzelnen
Hauptspeicherpointers oder ungefähr
genauso lange wie das Ausführen
von 90 Befehlen auf einigen Prozessoren dauert.
-
Die
direkte Softwareumwandlung umfasst das Ersetzen jedes ständigen Pointers
durch einen Hauptspeicherpointer direkt auf das referenzierte Objekt.
Während
diese Herangehensweise den zusätzlichen
durch die indirekte Softwareumwandlung angefallenen Zeitaufwand
der Doppelumleitung überwindet,
weist sie den Nachteil auf, dass das Rückgängigmachen des Ladens von referenzierten Objekten
oder das Verschieben dieser, die in den entpassivierten Objekten
gespeicherten direkten Hauptspeicherpointer ungültig macht. Dies kann Versuche, den
Speicher aus Objekten, die durch entpassivierte Objekte referenziert
werden, zu verschieben oder zu regenerieren, schwierig oder unmöglich machen.
-
In
Anbetracht der Nachteile der herkömmlichen Umwandlungsverfahren
würde ein
Umwandlungsverfahren mit einem niedrigen Zeitaufwand, das das Rückgängigmachen
des Ladens referenzierter Objekte und deren Verschieben erleichtert,
einen wesentlichen Nutzen bringen.
-
MCAULIFFE,
M. L., SOLOMON, M. H.: "A trace-based
simulation of pointer swizzling techniques" DATA ENGINEERING, 1995. PROCEEDINGS OF
THE ELEVENTH INTERNATIONAL CONFERENCE ON TAIPEI; TAIWAN, 6.–10. März 1995, LOS
ALAMITOS, CA, USA, IEEE COMPUT. SOC., 10. März 1995, Seite 52–61 bezieht
sich auf verschiedene Umwandlungsverfahren, die in Abhängigkeit von
der Zeit der Umwandlung als „eifrig" ("eager") oder „träge" ("lazy") und als „direkt" ("direct") oder „indirekt" ("indirect") in Bezug auf Gültigkeitspflege
klassifiziert werden. Wann immer ein Objekt in den Speicher eingelesen
wird, werden bei der eifrigen indirekten Umwandlung alle Pointer
innerhalb des Objekts umgewandelt, um auf OTE zu zeigen. Jeder OTE (Object
Table Entry = Objektverzeichniseintrag) in einem Objektverzeichnis,
das einen Eintrag für
jedes gegenwärtig
von einer Anwendung verwendete Objekt enthält, enthält einen (möglicherweise Null-)Pointer
auf ein Objekt in dem virtuellen Speicher und andere Informationen über den
Zustand des Objekts. Wenn ein Pointer in dem eifrigen indirekten Umwandlungsverfahren
dereferenziert wird, wird der OTE geprüft, um zu erkennen, ob das
Zielobjekt resident ist. Wenn es resident ist, wird der OTE einen Pointer
darauf enthalten. Wenn es nicht resident ist, wird der OTE einen
Nullpointer enthalten, und in dem Fall muss das Objekt aus der Datenbank
abberufen werden. Das träge
indirekte Verfahren wandelt Pointer träge um, um auf OTE zu zeigen.
Ein träges
Verfahren wird warten, bis ein Pointer tatsächlich verwendet wird, bevor
es ihn umwandelt. Um einen Pointer beim trägen Umwandeln zu dereferenzieren, wird
er zuerst geprüft,
um zu erkennen, ob er umgewandelt wird oder nicht. Wenn er umgewandelt
ist, wird wie beim indirekten Umwandeln fortgefahren. Wenn er nicht
umgewandelt ist, wird nach dem OID in dem OID-Index gesucht, wobei
OID auf OTE abgebildet werden, und der entstandene OTE wird zum Lokalisieren
des Zielobjekts im Speicher sowie zum Umwandeln des Pointers verwendet.
Das Verfahren zum Dereferenzieren eines Pointers beim trägen direkten
Umwandeln ist das gleiche wie beim trägen indirekten Umwandeln, mit
der Ausnahme, dass die virtuelle Adresse des Zielobjekts, anstatt
die Adresse seines OTEs, zum Umwandeln der Pointer verwendet wird.
-
CHONG-MOK
PARK ET AL: "Providing
orthogonal persistence to C++ using forced inheritance", COMPUTER SOFTWARE
AND APPLICATIONS CONFERENCE, 1994. COMPSAC 94. PROCEEDINGS., EIGHTEENTH
ANNUAL INTERNATIONAL, TAIPEI, TAIWAN, 9.–11. NOVEMBER 1994, LOS ALAMITOS,
CA, USA, IEEE COMPUT. SOC., 9. November 1994, Seite 64–70 bezieht
sich auf zwei Arten zum Unterstützen
von ständigen
Pointern. Eine Art ist die Verwendung von Speicherpointern als ständige Pointer.
Die andere Art ist das zur Verfügung
stellen von Smartpointern, die als ständige Pointer wirken. Smartpointer
sind Objekte in Kategorien, die zusätzliche Aufgaben ausführende Pointer nachbilden.
Diese Pointer speichern die OID sowie Speicheradressen von ständigen Objekten.
-
KORDALE,
R., AHAMAD, M.: "Objekt
Caching in a CORBA Compliant System", TECHNICAL REPORT GIT-CC-95-23, COLLEGE
OF COMPUTING, GEORGIA INSTITUTE OF TECHNOLOGY, ATLANTA, GA 30332,
USA, Nr. 23, 1995, Seite 1–12 legt
Kennzeichnungsverweise offen, als eine Art der Unterscheidung zwischen
Verweisen auf residente und nicht residente Objekte. Ein nicht gekennzeichneter
Verweis ist ein direkter Speicherpointer auf das Objekt in dem Speicher.
Ein gekennzeichneter Verweis enthält einen Objektidentifikator,
der zum Lokalisieren des Objekts auf einer Festplatte oder auf einem
Fernserver ausreicht. Jedes Mal, wenn ein Verweis verschoben wird,
wird das Kennzeichen geprüft, um
zu gewährleisten,
dass es auf ein residentes Objekt zeigt. Wenn es nicht auf ein residentes
Objekt zeigt, wird ein Objektfehler ausgelöst.
-
DAY,
M. S.: "Client Cache
Management in a Distributed Objekt Database", PHD THESIS, MASSACHUSETTS INSTITUTE
OF TECHNOLOGY, 1995 bezieht sich auf Client-Cache-Verwaltung in
einer verteilten Objektdatenbank und zeigt die Experimentergebnisse
des Testens verschiedener Lösungen
für drei
Probleme, die bei der Durchführung
des Abrufens und der Cache-Verwaltung in Bezug auf die Objektgrößeneinheiten,
anstatt fester Größeneinheiten,
wie zum Beispiel Seiten, auftreten: Welche Objekte vorausgelesen
werden sollen; wie Interobjektverweise aus dem Cache übersetzt
oder umgewandelt werden sollen, wenn sie vom Server zum Client abgerufen
werden und welche Objekte aus dem Cache verlagert werden sollen.
-
HOSKING,
A. L., MOSS, J. E. B.: "Object fault
handling for persistent programming languages: a performance evaluation", 8" ANNUAL ACM CONFERENCE
ON OBJECTORIENTED PROGRAMMING SYSTEMS, LANGUAGES AND APPLICATIONS,
OOPSLA 1993, WASHINGTON DC, USA, 26. SEPTEMBER–1. OKTOBER 1993 beschreibt
Fehlererkennung in einem Knoten-Markierungsschema, bei dem es erforderlich
ist, dass alle Objektverweise in residenten Objekten zu Pointern
umgewandelt werden. Kleine als Fehlerblöcke bezeichnete Proxyobjekte übernehmen
den Platz der nicht residenten Objekte. Ein Fehlerblock enthält den OID
des Zielobjekts und kann von einem normalen Objekt unterschieden
werden. Wann immer ein sich auf einen Fehlerblock beziehender Verweis
befolgt wird, wird das Zielobjekt resident gemacht. Der Fehlerblock wird
auf das jetzt residente Objekt geändert. Der aktualisierte Fehlerblock
wird als ein indirekter Block bezeichnet. Wenn sich ein zu befolgender
Verweis auf einen indirekten Block bezieht, kann das Zielobjekt
durch eine Umleitung lokalisiert werden. Wenn ein Objekt resident
gemacht wird, werden seine Pointerfelder nach dem für die Fehlererkennung
angewendeten Mechanismus umgewandelt. Alle Felder, die sich auf
schon resi dente Objekte beziehen, werden so umgewandelt, dass sie
direkt auf jene Objekte zeigen.
-
KEMPER,
A., KOSSMAN, D.: "Adaptable Pointer
swizzling strategies in object bases", PROCEEDINGS OF THE INTERNATIONAL CONFERENCE
ON DATA ENGINEERING, WIEN, 19. APRIL BIS 23. APRIL 1993, LOS ALAMITOS,
IEEE COMP. SOC. PRESS, US, BD. KONF. 9, 23. APRIL 1993, Seite 155–162 klassifiziert
und bewertet verschiedene Herangehensweisen, um den Zugriff auf
residente ständige
Objekte in dem Hauptspeicher zu optimieren, was als Pointerumwandlung
bezeichnet wird. Um den Zugriff auf Interobjektverweise zu beschleunigen,
werden die ständigen
Pointer in Hauptspeicherpointer umgewandelt. Eifrige und träge, direkte und
indirekte Umwandlungsverfahren werden bewertet und mit der Leistung
eines Objektverwalters, der keine Pointerumwandlung verwendet, verglichen.
-
Übersicht über die Erfindung
-
Es
ist das Ziel der vorliegenden Erfindung, die Ladung eines Objekts
auf eine Art und Weise rückgängig zu
machen, welche die Pointer auf das Objekt, die auf Anwendungen enthalten
und in anderen Objekten gespeichert sind, nicht ungültig macht.
-
Dieses
Ziel wird durch den Inhalt der unabhängigen Ansprüche erreicht.
Ausführungsformen sind
in den Unteransprüchen
festgelegt.
-
Die
vorliegende Erfindung verwendet Dreizustand-Verweise, um den Zugriff
auf referenzierte Objekte zu verwalten. In einer bevorzugten Ausführungsform
nach der Erfindung, ersetzt eine Umwandlungsvorrichtung der ständigen Pointer
(„die
Vorrichtung") einen
ständigen
Pointer, der für
das Erlangen eines referenzierten Objekts aus dem Objektserver verwendbar
ist, durch einen Smartpointer. Der Smartpointer kann entweder direkt
auf den Platz in dem Hauptspeicher, auf den das referenzierte Objekt geladen
wurde, zeigen oder er kann indirekt auf das referenzierte Objekt
durch einen Umleitungsslot zeigen. Die Vorrichtung speichert anfänglich den
ständigen
Pointer für
das referenzierte Objekt in dem Umleitungsslot. Wenn der Smartpointer
erstmalig dereferenziert wird, enthält der Smartpointer einen Pointer
auf den Umleitungsslot. An dieser Stelle wird der ständige Pointer
in dem Umleitungsslot dafür
verwendet, das referenzierte Objekt vom Objektserver auf den Hauptspeicher
zu laden. Nachdem das referenzierte Objekt geladen wurde, wird ein
Pointer auf das geladene Objekt in dem Umleitungsslot sowie in dem
Smartpoin ter gespeichert. Wenn der Smartpointer danach dereferenziert
wird, enthält
er einen direkten Pointer auf das geladene Objekt, der direkt dereferenziert
wird, um sofort, ohne den Umleitungsslot zu verwenden, auf das referenzierte
Objekt zuzugreifen.
-
Um
das geladene referenzierte Objekt „stillzulegen", ersetzt die Vorrichtung
den direkten Pointer in dem Smartpointer durch einen Pointer auf
den Umleitungsslot. Wenn sich das geladene referenzierte Objekt
in dem stillgelegten Zustand befindet, kann die Vorrichtung das
Objekt in den Hauptspeicher verschieben, ohne den Smartpointer ungültig zu
machen, indem der Pointer lediglich in dem Umleitungsslot eingestellt
wird. Die Vorrichtung kann auch das referenzierte Objekt aus dem
Hauptspeicher entfernen, wenn es sich in dem stillgelegten Zustand
befindet. Wenn die Vorrichtung das referenzierte Objekt aus dem
Hauptspeicher entfernt, speichert sie den ständigen Pointer für das referenzierte
Objekt in dem Umleitungsslot, so dass ein nachfolgendes Dereferenzieren
des Smartpointers dazu führt,
dass das referenzierte Objekt geladen wird. Diese Eigenschaften der
Vorrichtung werden vorzugsweise in einem Speicherbereinigungsschema
zum Regenerieren von unbenutztem Speicher verwendet, in dem referenzierte
Objekte stillgelegt werden, wenn sie nicht vor kurzem verwendet
und zum Entfernen aus dem Hauptspeicher verfügbar gemacht wurden.
-
Kurze Beschreibung der Zeichnungen
-
1 ist
ein Blockdiagramm der oberen Ebene des Universal-Computersystems,
in dem die Vorrichtung vorzugsweise angewendet wird.
-
2 ist
ein Flussdiagramm, das die Schritte zeigt, die vorzugsweise von
der Vorrichtung durchgeführt
werden, um ein ständiges
Objekt zu laden und zu entpassivieren.
-
3 ist
ein Diagramm des Speichers, das die Ergebnisse des Arbeitsschritts 201 zeigt.
-
4 ist
ein Diagramm des Speichers, das die Ergebnisse der Arbeitsschritte 203 und 204 zeigt.
-
5 ist
ein Flussdiagramm, das die Schritte zeigt, die vorzugsweise durch
die Aktivität
in Erwiderung auf einen Versuch eines Anwendungsprogramms, einen
Smartpointer zu dereferenzieren, durchgeführt werden.
-
6 ist
ein Diagramm des Speichers, das die Ergebnisse der Arbeitsschritte
aus 5 zeigt.
-
7 zeigt
die Schritte, die vorzugsweise von der Vorrichtung durchgeführt werden,
um ein Objekt zum Rückgängigmachen
des Ladens vorzubereiten.
-
8 ist
ein Diagramm des Speichers, das die Ergebnisse der in 7 gezeigten
Arbeitsschritte darstellt.
-
9 ist
ein Flussdiagramm, das die Schritte zeigt, die vorzugsweise von
der Vorrichtung durchgeführt
werden, um die Ladung eines Objekts rückgängig zu machen.
-
10 ist
ein Flussdiagramm, das die Schritte zeigt, die vorzugsweise von
der Vorrichtung durchgeführt
werden, um ein Objekt in den Hauptspeicher zu verschieben.
-
11 ist
ein Flussdiagramm, das die Schritte zeigt, die vorzugsweise von
der Vorrichtung durchgeführt
werden, um das Stilllegungsverfahren im großen Stil durchzuführen.
-
12 ist
ein Flussdiagramm, das die Schritte zeigt, die vorzugsweise von
der Vorrichtung durchgeführt
werden, um die Flush-Operation durchzuführen.
-
Genaue Beschreibung der Erfindung
-
Die
vorliegende Erfindung verwendet Dreizustand-Verweise, um den Zugriff
auf referenzierte Objekte zu verwalten. Nach der Erfindung ersetzt
eine Umwandlungsvorrichtung für
ständige
Pointer („die Vorrichtung") in einem referenzierenden
Objekt einen ständigen
Pointer auf ein referenziertes Objekt, dessen Ladung rückgängig gemacht
wurde, durch einen Smartpointer auf das referenzierte Objekt.
-
Wenn
ein referenziertes Objekt geladen wird, verschiebt die Vorrichtung
in einer bevorzugten Ausführungsform
zuerst den ständigen
Pointer von dem referenzierten Objekt in einen Umleitungsslot in
einem Verzeichnis von Umleitungsslots, wo er mit einer Anzeige,
dass er ein ständiger
Pointer ist, gespeichert wird. Die Vorrichtung ersetzt an dieser
Stelle auch den ständigen
Pointer in dem referenzierenden Objekt durch einen Smartpointer,
der einen Pointer auf den Umleitungsslot enthält und der anzeigt, dass er
keinen direkten Pointer auf das referenzierte Objekt enthält. Bei
Smartpointer, die einen Pointer auf den Umleitungsslot enthalten,
spricht man vom „indirekt
Referenzieren" des
referenzierten Objekts.
-
Wenn
der Smartpointer in dem referenzierenden Objekt zu einem späteren Zeitpunkt
dereferenziert wird, bestimmt die Dereferenzierungsoperation, dass
der in dem Smartpointer enthaltene Pointer kein direkter Pointer
auf das referenzierte Objekt ist und benutzt ihn, um auf den ständigen Pointer
in der zentralen Datenstruktur zuzugreifen. Dann verwendet die Vorrichtung
ständige
Pointer, um das referenzierte Objekt auf den Hauptspeicher unter
einer geeigneten Adresse zu laden. Die Vorrichtung speichert diese
Adresse in dem Verweis in dem referenzierenden Objekt sowie in dem
Umleitungsslot mit Anzeigen darauf, dass sie ein direkter Pointer
auf das referenzierte Objekt ist. Danach verlaufen Zugriffe auf das
referenzierte Objekt schnell, indem der in dem referenzierenden
Objekt gespeicherte direkte Pointer sofort verwendet wird, ohne
das referenzierte Objekt erneut zu laden oder auf das Slotverzeichnis
zuzugreifen. Wenn andere referenzierende Objekte Verweise auf die
gleichen referenzierten Objekte enthalten, werden diese, wie die
Verweise auf das referenzierte Objekt in dem ersten referenzierenden
Objekt, durch Pointer auf den gleichen Umleitungsslot ersetzt. Wenn
diese anderen Pointer auf den Umleitungsslot dereferenziert werden,
bestimmt die Vorrichtung, dass der Umleitungsslot einen direkten Pointer
auf das geladene referenzierte Objekt enthält und kopiert den direkten
Pointer in das andere referenzierende Objekt, um auf das geladene
referenzierte Objekt direkt zuzugreifen, ohne es erneut zu laden.
-
Wenn
die Verwendung des referenzierten Objekts abgeschlossen ist, konvertiert
die Erfindung vorzugsweise alle Smartpointer, die das referenzierte Objekt
direkt referenzieren, um das referenzierte Objekt indirekt zu referenzieren,
indem alle direkten Pointer in referenzierenden Objekten auf das
referenzierte Objekt durch Pointer auf den zentralen Datenstrukturslot
ersetzt werden. Dadurch kann das referenzierte Objekt gegebenenfalls
zu einem späteren Zeitpunkt
in den Arbeitsspeicher verschoben werden, indem der Pointer in dem
zentralen Datenstrukturslot lediglich aktualisiert wird, ohne dass
ein Smartpointer in referenzierenden Objekten aktualisiert werden muss.
Referenzierte Objekte können
auch sicher freigegeben werden, wenn keiner der Verweise direkt auf
sie zeigt. Referenzierte Objekte können in Erwiderung auf eine
Anforderung von einem anderen Benutzer des referenzierten Objekts,
ausschließlich selbst
das referenzierte Objekt zu verwenden, freigegeben werden oder in
Erwiderung auf einen Anstoß zum
Regenerieren von Speicherabschnitten, die von unbenutzten Objekten
belegt sind.
-
1 ist
ein Blockdiagramm der oberen Ebene des Universal-Computersystems,
in dem die Vorrichtung vorzugsweise angewendet wird. Die Figur zeigt
ein Computersystem 100, das auf ein Objekt zugreift. Das
Computersystem 100, das auf ein Objekt zugreift, enthält einen
Prozessor (CPU) 110, Ein-/Ausgabeeinrichtungen 120 und
einen Hauptspeicher 130. Unter den Ein-/Ausgabeeinrichtungen 120 befindet
sich eine Speichereinrichtung 121, wie zum Beispiel ein
Festplattenlaufwerk. Die Ein-/Ausgabeeinrichtungen 120 umfassen
ebenfalls eine Netzwerkverbindung 122, über die das Computersystem,
das auf ein Objekt zugreift, Daten mit anderen Computersystemen
austauschen kann. Die Ein-/Ausgabeeinrichtungen 120 umfassen
ferner ein entfernbares Medienlaufwerk 123, das zum Installieren
von Softwareprodukten, einschließlich der Vorrichtung, verwendet
werden kann, die auf einem Computerlesbaren Medium, wie zum Beispiel
einer CD-ROM, zur Verfügung
gestellt werden. Der Hauptspeicher 130 enthält ein ständiges Objektsystem 131 zum
beständigen
Pflegen eines Objektsatzes. Die Umwandlungsvorrichtung 132 ist
in dem ständigen Objektsystem 131 enthalten
und wird auf dem CPU 110 ausgeführt. Der Hauptspeicher 130 umfasst
ferner ein entpassiviertes Objekt 133, das einen Smartpointer 134 enthält. Das
entpassivierte Objekt 133 wird hier ebenfalls als das referenzierende
Objekt behandelt. Der Hauptspeicher 130 enthält ferner
ein Slotverzeichnis 135, das aus einem Umleitungsslot 136 sowie
anderen Umleitungsslots (nicht gezeigt) besteht. Das Slotverzeichnis
entspricht vorzugsweise einem Bearbeitungsverzeichnis, das von dem Speicherverwalter
benutzt wird. Zu bestimmten Zeitpunkten enthält der Hauptspeicher 130 ferner
ein referenziertes Objekt 137 sowie andere referenzierte Objekte
(nicht gezeigt).
-
1 zeigt
ebenfalls, dass die Netzwerkverbindung 122 des Computersystems 100,
das auf ein Objekt zugreift, mit einer Netzwerkverbindung 152 eines
Computersystems 150 eines Objektservers verbunden ist.
Das Computersystem 150 eines Objektservers enthält einen
Objektserver 153, der den Satz ständiger Objekte pflegt, indem
er sie auf eine nichtflüchtige
Weise speichert. Der Objektserver 153 reagiert auf Anforderungen
von anderen Teilen des ständigen
Objektsystems, ständige
Objekte an den Objektserver und aus diesem zu übertragen. Das Computersystem 150 des
Objektservers enthält
ebenfalls einen Prozessor 151, der von dem Objektserver 153 verwendet
wird. Während
die Vorrichtung vorzugsweise auf Computersystemen implementiert
wird, die wie oben beschrieben, konfiguriert sind, werden Kenner
der Technik erkennen, dass sie auch auf Computersystemen implementiert
werden kann, die unterschiedliche Konfigurationen aufweisen. Zum
Beispiel werden die Computersysteme oft nicht alle in 1 gezeigten
Funktionen enthalten oder sie können Funktionen,
die nicht in 1 gezeigt sind, enthalten. Ferner
kann der Objektserver 153 in dem Computersystem 100,
das auf ein Objekt zugreift, lokalisiert sein, anstatt in dem Computersystem 150 des
Objektservers.
-
2 ist
ein Flussdiagramm, das die Schritte zeigt, die vorzugsweise von
der Vorrichtung durchgeführt
werden, um ein ständiges
Objekt zu laden und zu entpassivieren. Die Vorrichtung kann ein
ständiges
Objekt in Erwiderung auf eine direkte Anforderung von einer Anwendung
laden und entpassivieren. Wie unten erläutert, kann die Vorrichtung
ebenfalls ein ständiges
Objekt in Erwiderung auf einen Versuch durch eine Anwendung, einen
Smartpointer auf das ständige
Objekt zu dereferenzieren, laden und entpassivieren. In Schritt 201 verwendet
die Vorrichtung einen ständigen
Pointer für
das ständige
Objekt, um das Objekt aus dem Objektserver 153 (1)
zu erhalten und das Objekt in dem Hauptspeicher 130 zu speichern.
Das in Schritt 201 geladene Objekt kann einen oder mehrere
Pointer auf andere ständige
Objekte enthalten. Derartige Pointer auf andere Objekte sind im
Allgemeinen ständige
Pointer, die verwendet werden können,
um die durch sie referenzierten Objekte aus dem Objektserver als
ein Ergebnis der vorherigen Passivierung des in Schritt 201 geladenen Objekts,
zu erlangen. Schritt 203 speichert ebenfalls vorzugsweise
eine Anzeige in dem Umleitungsslot, so dass der Pointer in dem Umleitungsslot
ein ständiger
Pointer auf das referenzierte Objekt ist, kein Hauptspeicherpointer
direkt auf das dereferenzierte Objekt.
-
3 ist
ein Diagramm des Speichers, das die Ergebnisse des Arbeitsschritts 201 zeigt. 3 zeigt
den Hauptspeicher 330 sowie einen Abschnitt des Inhalts
des Hauptspeichers. Im Hauptspeicher sind das in Schritt 201 geladene
referenzierende Objekt 333 und ein Slotverzeichnis 335 gezeigt.
Das Slotverzeichnis enthält
eine Anzahl von Slots, einschließlich Slots 336, 341, 342, 343 und 344.
Wenn das referenzierende Objekt 333 in Schritt 201 geladen
wird, enthält
es einen ständigen
Pointer 371.
-
Noch
einmal auf 2 bezugnehmend, entpassiviert
die Vorrichtung das geladene Objekt in Schritten 202–205.
Die Vorrichtung durchläuft
die Schritte 202–205 für jeden
in dem geladenen Objekt enthaltenen ständigen Pointer in einer Schlaufe.
In Schritt 203 weist die Vorrichtung dem Objekt, das durch
den ständigen
Pointer referenziert wird, einen Umleitungsslot in dem Slotverzeichnis 135 (1) zu,
indem der ständige
Pointer in einen leeren Umleitungsslot in dem Slotverzeichnis kopiert
wird.
-
4 ist
ein Diagramm des Speichers, das die Ergebnisse der Arbeitsschritte 203 und 204 zeigt. In 4 kann
man erkennen, dass der ständige Pointer 371 (3)
aus dem referenzierenden Objekt 333 in einen leeren Slot 436 des
Slotverzeichnisses 435 gemäß Schritt 202 kopiert
wurde. Wenn jedoch ein Umleitungsslot in dem Slotverzeichnis schon
dem referenzierten Objekt zugewiesen wurde, weist die Vorrichtung
vorzugsweise dem referenzierten Objekt in Schritt 203 keinen
weiteren Umleitungsslot zu. Die Vorrichtung bestimmt vorzugsweise,
ob dem referenzierten Objekt schon ein Slot in dem Slotverzeichnis
zugewiesen wurde, indem ein index auf dem Slotverzeichnis gepflegt
wird, der von den ständigen
Pointern der referenzierten Objekte hin auf Slots in dem Slotverzeichnis
zeigt, das jenen referenzierten Objekten zugewiesen ist. Dieser
index kann sich separat von dem Slotverzeichnis befinden oder er
kann direkt in das Slotverzeichnis integriert sein. Wenn der index
anzeigt, dass ein Umleitungsslot in dem Slotverzeichnis nicht bereits
dem referenzierten Objekt zugewiesen wurde und die Vorrichtung dem
referenzierten Objekt einen Slot in dem Slotverzeichnis zuweist,
aktualisiert die Vorrichtung vorzugsweise ebenfalls diesen Index,
um eine Abbildung von dem ständigen
Pointer des referenzierten Objekts zu dem zugewiesenen Slot einzubeziehen.
-
In
Schritt 204 ersetzt die Vorrichtung den ständigen Pointer
in dem geladenen Objekt durch einen Smartpointer, der einen Pointer
auf den Umleitungsslot für
das referenzierte Objekt enthält.
Als Teil von Schritt 204 ersetzt die Vorrichtung einen
ständigen
Pointer durch einen Smartpointer und speichert eine Anzeige in dem
Smartpointer, die der im Smartpointer enthaltene Pointer auf einen
Umleitungsslot richtet, anstatt direkt auf das referenzierte Objekt
zu zeigen. In 4 kann man erkennen, dass die
Vorrichtung in Schritt 204 den ständigen Pointer 371 in einem
referenzierenden Objekt 333 (3) durch
einen Smartpointer 434 ersetzt. Der Smartpointer 434 umfasst
einen Pointer auf den Slot 436 sowie eine Anzeige („1") 462, die
der im Smartpointer enthaltene Pointer 461 auf einen Slot
richtet, anstatt direkt auf das referenzierte Objekt zu zeigen.
Um die Länge des
Smartpointers genauso lang wie die Länge eines Hauptspeicherpointers
zu machen, den die Anwendung in dem entpassivierten Objekt verarbeiten
soll, speichert die Vorrichtung vorzugsweise diese Anzeige als ein
Bit in einer unbenutzten Bit-Stellung in dem Pointer auf den Umleitungsslot.
Auf Grund von Speicherbyte-Ausrichtungsanforderungen
sind ein oder mehrere der niedrigstwertigen Bits des Pointers auf
den Umleitungsslot unbenutzt, genauso wie die niedrigstwertigen
Bits von Pointern auf andere Objekte. Deshalb speichert die Vorrichtung
die Anzeige vorzugsweise in dem Smartpointer in dem niedrigstwertigen
Bit des Hauptspeichersortierers, die in dem Smartpointer enthalten
ist. Kenner der Technik werden erkennen, dass die Anzeige auch auf
viele andere Arten nützlich
gespeichert werden kann. In Schritt 205 schleift die Vorrichtung
auf Schritt 202 zurück, um
den nächsten
ständigen
Pointer in dem geladenen Objekt zu verarbeiten. Nach Schritt 205 werden diese
Schritte abgeschlossen. Nachdem die Vorrichtung das Objekt, wie
in 2 gezeigt, lädt
und erstpassiviert, kann die Anwendung, für die das Objekt geladen wurde,
auf das Objekt in dem Hauptspeicher zugreifen und sie kann insbesondere
die in dem Objekt erscheinenden Smartpointer, wie zum Beispiel Smartpointer 434 (4),
dereferenzieren.
-
5 ist
ein Flussdiagramm, das die Schritte zeigt, die vorzugsweise von
der Vorrichtung in Erwiderung auf einen Versuch eines Anwendungsprogramms,
einen Smartpointer zu dereferenzieren, durchgeführt wird. Diese Schritte werden
vorzugsweise als die Implementierung eines Dereferenzierungsoperators
für eine
Klasse festgelegt, zu der alle Smartpointer gehören. In der Programmiersprache C++
kann eine Vorlage verwendet werden, um den Dereferenzierungsoperator
für die
Smartpointerklasse festzulegen, so dass diese Schritte einbezogen werden
können.
-
Wenn
in Schritt 501 ein bitweises UND des Smartpointers mit
dem Wert „1" gleich 1 ist (d.
h. wenn das niedrigstwertige Bit des Smartpointers „1" ist, wodurch angezeigt
wird, dass der Smartpointer einen Pointer auf einen Slot anstatt
einen direkten Pointer auf das referenzierte Objekt enthält), fährt die Vorrichtung
dann mit Schritt 503 fort, andernfalls ist das Ergebnis
dieses bitweisen UND „0", wodurch angezeigt
wird, dass der in dem Smartpointer enthaltene Pointer ein direkter
Pointer auf das referenzierte Objekt ist, und die Vorrichtung fährt mit
Schritt 502 fort. In Schritt 502 sendet die Vorrichtung
das referenzierte Objekt zurück,
indem der direkte Pointer, der in dem Smartpointer gespeichert ist,
unter Verwendung des Dereferenzierungsoperators des Standardpointers
dereferenziert wird. In Schritt 503 ändert die Vorrichtung das niedrigstwertige
Bit des Smartpointers von 0 auf 1. Wenn in Schritt 504 ein
bitweises UND des Pointers in dem Slot, auf den durch den Slotpointer
gezeigt wird, mit dem Wert „1" gleich „1" ist (d. h. wenn
das niedrigstwertige Bit gleich „1" ist, wodurch angezeigt wird, dass der
Pointer in dem Slot ein ständiger
Pointer anstatt ein direkter Pointer auf das referenzierte Objekt
ist), fährt
die Vorrichtung dann mit Schritt 507 fort, andernfalls
ist das niedrigstwertige Bit des Pointers in dem Slot eine „0" und der Pointer in
dem Slot ist ein direkter Pointer auf das referenzierte Objekt und
die Vorrichtung fährt
mit Schritt 505 fort. In Schritt 505 kopiert die
Vorrichtung den direkten Pointer auf den Smartpointer aus dem Slot,
auf den durch den Smartpointer gezeigt wird. In Schritt 506 sendet
die Vorrichtung das referenzierte Objekt zurück, indem der in dem Smartpointer
gespeicherte direkte Pointer unter Verwendung des Dereferenzierungsoperators
des Standardpointers dereferenziert wird. In Schritt 507 ändert die
Vorrichtung die „1" in dem niedrigstwertigen
Bit des Pointers in dem Slot, auf den durch den Smartpointer gezeigt
wird, auf eine „0". In Schritt 508 ruft
die Vorrichtung das ständige Objektsystem
auf, um das referenzierte Objekt aus dem Objektserver unter Verwendung
des in dem Slot, auf den durch den Smartpointer gezeigt wird, enthaltenen
ständigen
Pointers zu erhalten. In Schritt 508 speichert die Vorrichtung
ferner einen direkten Pointer auf das geladene referenzierte Objekt
in dem Slot, auf den durch den Slotpointer gezeigt wird. Nach Schritt 508 fährt die
Vorrichtung mit Schritt 505 fort, um den direkten Pointer
auf das referenzierte Objekt in den Smartpointer zu kopieren und
das referenzierte Objekt zurückzusenden.
-
6 ist
ein Diagramm des Speichers, das die Ergebnisse der Arbeitsschritte
aus 5 zeigt. Beim Vergleich von 6 mit 4 kann
man erkennen, dass die Vorrichtung das referenzierte Objekt 637 gemäß Schritt 508 geladen
hat. Das geladene referenzierte Objekt 637 enthält vorzugsweise
seinen eigenen ständigen
Pointer 638, der zusammen mit dem Slotverzeichnisindex,
der von den ständigen Pointern
bis zu den Umleitungsslots abgebildet wird, verwendet werden kann,
um den Slot des referenzierten Objekts in dem Slotverzeichnis zu
lokalisieren. Die Vorrichtung speichert ferner direkte Pointer auf
das referenzierte Objekt 637 in dem Slotpointer 634 und
in dem Slot 636, auf den vorher durch den Smartpointer 634 gezeigt
wurde. Auf Grund der Byteausrichtungsanforderungen für den Platz
des referenzierten Objekts 637 ist das niedrigstwertige
Bit des Smartpointers 634 und des Slots 636 ferner „0", wodurch angezeigt
wird, dass diese Pointer direkte Pointer auf das referenzierte Objekt
sind.
-
Nachdem
die in 5 gezeigte Dereferenzieroperation für einen
Smartpointer durchgeführt wurde,
laufen nachfolgende Dereferenzieroperationen schnell ab. Da das
niedrigstwertige Bit des Smartpointers „0" ist, führt die Vorrichtung lediglich Schritte 501 und 502 aus,
um das referenzierte Objekt 637, auf das durch den direkten
Pointer 661 des Smartpointers 634 gezeigt wird,
zurückzusenden.
Da dieses verkürzte
Verfahren nur einen einzigen Zugriff auf den Hauptspeicher einschließt, ist
es zweimal so schnell wie herkömmliche
indirekte Softwareumwandlungsverfahren, bei denen Pointer auf ein
referenziertes Objekt immer durch einen anderen Pointer umgeleitet
werden.
-
In
einigen Fällen
muss die Ladung eines referenzierten Objekts aus dem Speicher rückgängig gemacht
werden. Wenn zum Beispiel eine andere Anwendung, möglicherweise
auf einem anderen Computersystem, das Objekt mit dem richtigen Zugriff
laden muss. Ein weiteres Beispiel ist, wenn ein von dem Objekt belegter
Speicher für
einen anderen Zweck verwendet werden muss. In diesen Fällen kann
die Vorrichtung das Objekt zum Rückgängigmachen
des Ladens derartig vorbereiten, dass keine Smartpointer auf das
Objekt, die auf Anwendungen enthalten und in anderen geladenen,
entpassivierten Objekten gespeichert sind, ungültig gemacht werden.
-
7 zeigt
die Schritte, die vorzugsweise von der Vorrichtung durchgeführt werden,
um ein Objekt zum Rückgängigmachen
des Ladens vorzubereiten. Die Vorrichtung führt diese Schritte vorzugsweise
ebenfalls aus, um ein Objekt zum Verschieben an eine andere Adresse
innerhalb des Hauptspeichers vorzubereiten. Das Vorbereiten eines
Objekts vor dem Rückgängigmachen
des Ladens oder vor dem Verschieben ist als „Stilllegen" des Objekts bekannt. Diese
Schritte identifizieren vorzugsweise das Objekt, das für das Rückgängigmachen
des Ladens vorbereitet werden soll, indem der dem Objekt zugewiesene
Umleitungsslot identifiziert wird. In Schritten 701–703 durchläuft die
Vorrichtung in einer Schlaufe jeden Smartpointer, der einen direkten
Pointer auf das stillzulegende Objekt enthält, der den gleichen Wert wie
der direkte Pointer zum stillzulegenden Objekt aufweist, der in
dem identifizierten Slot gespeichert ist. In einer bevorzugten Ausführungsform
umfasst Schritt 701 das Verschieben einer Liste der Smartpointer,
die dem Umleitungsslot, der dem stillzulegenden Objekt zugeordnet
ist, zugewiesen sind. Bei dieser Ausführungsform ist der Zeitaufwand
relativ gering, sie erfordert jedoch das Pflegen einer Liste der
Smartpointer, die jedem Umleitungsslot zugeordnet sind. In einer
alternativen Ausführungsform
umfasst Schritt 701 das Verschieben der Liste aller Smartpointer,
die in dem Hauptspeicher geschaffen wurden. Während die alternative Ausführungsform den
Nachteil hat, dass der Zeitaufwand relativ hoch ist, hat sie den
Vorteil, dass sie die Speicher- und Verarbeitungsanforderungen des
Pflegens einer Liste von Smartpointern für jeden Umleitungssiot vermeidet.
Für jeden
Smartpointer, der einen direkten Pointer auf das stillzulegende
Objekt enthält,
speichert die Vorrichtung in Schritt 702 einen Pointer
auf den identifizierten Slot in dem Smartpointer, anstelle des direkten
Pointers. Als Teil des Schritts 702 ändert die Vorrichtung ebenfalls
das niedrigstwertige Bit des Smartpointers auf „1", um anzuzeigen, dass der Smartpointer
jetzt einen Pointer auf einen Umleitungsslot, anstatt einen direkten
Pointer auf das referenzierte Objekt, enthält. In Schritt 703 schleift
die Vorrichtung auf Schritt 701 zurück, um den nächsten Smartpointer,
der einen direkten Pointer auf das stillzulegende Objekt enthält, zu verarbeiten.
Nachdem jeder derartige Smartpointer verarbeitet wurde, werden diese
Schritte abgeschlossen. Beim Abschluss dieser Schritte gibt es keine
Smartpointer in dem Hauptspeicher, die direkte Pointer auf das stillgelegte Objekt
enthalten. Stattdessen bezieht sich jeder Smartpointer, der sich
auf das stillgelegte Objekt bezieht, durch den Umleitungsslot auf
das stillgelegte Objekt.
-
8 ist
ein Diagramm des Speichers, das die Ergebnisse der Arbeitsschritte,
die in 7 gezeigt sind, zeigt. Beim Vergleich von 8 mit 6 kann
erkannt werden, dass die Vorrichtung den direkten Pointer 661 in
dem Smartpointer 634 (6) durch
einen Poin ter auf den Slot 836 für das referenzierte Objekt
ersetzt hat. Die Vorrichtung hat ferner das niedrigstwertige Bit
des Smartpointers auf „1" verändert, wodurch
angezeigt wird, dass der Smartpointer einen Pointer auf einen Umleitungsslot,
anstatt einen direkten Pointer auf das referenzierte Objekt, enthält.
-
9 ist
ein Flussdiagramm, das die Schritte zeigt, die vorzugsweise von
der Vorrichtung durchgeführt
werden, um die Ladung eines Objekts rückgängig zu machen. In Schritt 901 legt
die Vorrichtung, wie in 7 gezeigt, den Umleitungsslot
still, der zu dem Objekt gehört
dessen Ladung rückgängig zu
machen ist. In Schritt 902 hebt die Vorrichtung die Zuordnung für den Abschnitt
des Hauptspeichers auf, der von dem Objekt, dessen Ladung rückgängig gemacht werden
soll, belegt ist. In Schritt 903 ersetzt die Vorrichtung
den direkten Pointer in dem Umleitungsslot, der dem Objekt, dessen
Ladung rückgängig gemacht werden
soll, zugewiesen ist, durch einen ständigen Pointer auf das Objekt,
dessen Ladung rückgängig gemacht
werden soll. Diese Schritte werden dann abgeschlossen. Wenn der
Smartpointer auf ein Objekt, dessen Ladung rückgängig gemacht wurde, zu einem
späteren
Zeitpunkt dereferenziert wird, verwendet die Vorrichtung den in
dem Umleitungsslot gespeicherten ständigen Pointer, um das Objekt,
dessen Ladung rückgängig gemacht
wurde, aus dem Objektserver wieder abzuberufen.
-
Nachdem
die Vorrichtung die in 9 gezeigten Schritte durchführt, um
die Ladung des Objekts rückgängig zu
machen, wird der Hauptspeicher wieder in den in 4 gezeigten
Zustand versetzt. Und zwar enthält
der Smartpointer 434 einen Pointer 461 auf den
Umleitungsslot 436, der dem Objekt, dessen Ladung rückgängig gemacht
wurde, zugewiesen wird. Der Umleitungsslot 436 enthält einen ständigen Pointer
auf das referenzierte Objekt, den die Vorrichtung verwenden kann,
um das referenzierte Objekt erneut zu laden, wenn der Smartpointer 461 zu
einem späteren
Zeitpunkt dereferenziert wird.
-
Die
Vorrichtung berücksichtigt
ebenfalls die Verschiebung von referenzierten Objekten, während sie
in den Hauptspeicher geladen sind. 10 ist
ein Flussdiagramm, das die Schritte zeigt, die vorzugsweise von
der Vorrichtung durchgeführt
werden, um ein Objekt in den Hauptspeicher zu verschieben. Wie in 7 gezeigt,
legt die Vorrichtung in Schritt 1001 den Slot, der dem
zu verschiebenden Objekt zugewiesen ist, still. In Schritt 1002 verschiebt
die Vorrichtung das referenzierte Objekt in den Hauptspeicher, indem
es auf einen anderen Platz in dem Hauptspeicher kopiert wird und
indem der Speicher, der anfänglich
das referenzierte Objekt enthalten hat, zu dem freien Pool zurückgesendet
wird. In Schritt 1003 speichert die Vorrichtung in dem
Slot, der dem verschobenen Objekt zu gewiesen wurde, einen direkten Pointer
auf dem neuen Platz, auf den das referenzierte Objekt in Schritt 1002 verschoben
wurde. Diese Schritte werden dann abgeschlossen.
-
Die
Vorrichtung führt
vorzugsweise ein Stilllegungsverfahren aller durch Slotpointer referenzierter
Objekte zu verschiedenen Zeitpunkten durch. Dieses Verfahren wird
als „Stilllegen
im großen
Stil" ("wholesale idling") bezeichnet und
ermöglicht
der Vorrichtung, nicht häufig
dereferenzierte Smartpointer ausfindig zu machen, indem, nachdem
erhebliche Zeit seit dem Stilllegen im großen Stil vergangen ist, Slots,
die immer noch stillgelegt sind, mit Smartpointern übereinstimmen,
die seit dem Durchführen
des Verfahrens des Stilllegens im großen Stil nicht dereferenziert
wurden.
-
11 ist
ein Flussdiagramm, das die Schritte zeigt, die vorzugsweise von
der Vorrichtung durchgeführt
werden, um ein totales Stilllegungsverfahren durchzuführen. In
Schritten 1101–1104 durchläuft die Vorrichtung
jeden vorhandenen Smartpointer in einer Schlaufe. Diese Schlaufe
umfasst vorzugsweise das Verschieben einer Liste von vorhandenen
Smartpointern, die aktualisiert wird, wenn Smartpointer geschaffen
oder zerstört
werden. Wenn der Smartpointer in Schritt 1102 einen direkten
Pointer auf das referenzierte Objekt enthält, wie durch sein niedrigstwertiges
Bit angezeigt, fährt
die Vorrichtung mit dem Schritt 1103 fort, ansonsten fährt die
Vorrichtung mit Schritt 1104 fort. In Schritt 1103 speichert
die Vorrichtung einen indirekten Pointer auf das referenzierte Objekt
in dem Smartpointer, wobei er die Adresse des dem referenzierten
Objekt zugewiesenen Slots umfasst, dessen niedrigstwertiges Bit
auf „1" geändert wurde.
In Schritt 1104 schleift die Vorrichtung auf Schritt 1101 zurück, um den
nächsten
Smartpointer zu verarbeiten. Wenn keine Smartpointer übrig sind, werden
diese Schritte abgeschlossen.
-
Einige
Programmierumgebungen stellen eine Funktion zur Verfügung, die
als Speicherbereinigung bezeichnet wird, die ein periodisch durchgeführtes Verfahren
ist, um unbenutzte Datenstrukturen zu identifizieren und deren Zuordnung
aufzuheben. In vielen derartiger Programmierumgebungen ist die Speicherbereinigungsfunktion
unter Verwendung eines „Erreichbarkeitsalgorithmus" ("reachability algorithm") implementiert,
nach dem im Objekt enthaltene Pointer, die für die Verwendung bekannt sind,
rekursiv dereferenziert werden, um auf jede Datenstruktur zuzugreifen,
auf die direkt oder indirekt durch die für die Verwendung bekannte Datenstrukturen
zugegriffen werden kann. Von allen verbleibenden Datenstrukturen
wird angenommen, dass sie zurzeit nicht verwendet werden und ihre
Zuordnung aufgehoben ist. In Programmierumgebungen, in denen diese Form
von Speicherbereinigung angewendet wird, führt die Vorrichtung vorzugsweise
das Stilllegungsverfahren im großen Stil durch, indem jeder
Smartpointer stillgelegt wird, der während des rekursiven Dereferenzierens
von Pointern als Teil des Speicherbereinigungsverfahrens aufgetreten
ist, anstatt die in 11 gezeigten Schritte durchzuführen. Dadurch kann
die Vorrichtung die Kosten des Pflegens der Liste von vorhandenen
Smartpointern, die von den in 11 gezeigten
Schritten benutzt werden, vermeiden.
-
Um
Abschnitte des Hauptspeichers zu regenerieren, der von geladenen
referenzierten Objekten, auf die nicht zugegriffen wird, belegt
ist, führt
die Vorrichtung vorzugsweise eine Flush-Operation nach einer vorgegebenen
Zeitspanne nach dem Durchführen
der Operation des Stilllegens im großen Stil durch. In der Flush-Operation
werden Objekte, die immer noch stillgelegt sind, nach einer Zeitspanne seit
dem Stilllegen im großen
Stil, als unbenutzt angesehen und deren Ladung wird rückgängig gemacht. 12 ist
ein Flussdiagramm, das die Schritte zeigt, die vorzugsweise von
der Vorrichtung durchgeführt
werden, um die Flush-Operation durchzuführen. In Schritten 1201–1203 durchläuft die
Vorrichtung jeden verwendeten Smartpointer in einer Schlaufe. Wenn
der Slot in Schritt 1202 noch stillgelegt ist, das heißt, wenn
keiner der Smartpointer direkte Pointer auf das referenzierte Objekt,
dem der Slot zugewiesen ist, enthält, fährt die Vorrichtung mit Schritt 1204 fort,
um die Ladung des Objekts, dem der Slot zugewiesen ist, rückgängig zu
machen. Nach den Schritten 1202 und 1204 fährt die
Vorrichtung mit Schritt 1203 fort, um zu Schritt 1201 zurückzuschleifen,
um den nächsten
verwendeten Slot zu verarbeiten. Wenn keine Smartpointer übrig sind, werden
diese Schritte abgeschlossen.
-
Während die
vorliegende Erfindung in Bezug auf die bevorzugten Ausführungsformen
gezeigt und beschrieben wurde, wird von Kennern der Technik verstanden,
dass verschiedene Veränderungen
oder Modifikationen in der Form und im Detail vorgenommen werden
können,
ohne vom Bereich der Erfindung abzuweichen. Zum Beispiel können die Speicherbereinigungs-
und Flush-Operationen auf verschiedene Arten durchgeführt werden,
so dass jede zum Rückgängigmachen
des Ladens der unbenutzten referenzierten Objekte führt. Zum
Beispiel kann die Vorrichtung eine Liste der Objekte pflegen, die
nach dem Zeitpunkt ihres letzten Stilllegens sortiert wurden, und
sie kann die Ladung der Objekte, die zuletzt stillgelegt wurden,
zuerst periodisch rückgängig machen.
Die Smartpointer und Umleitungsslots können auch andere Anzeigen als
die, die als „0" gespeichert bezeichnet
werden, verwenden, egal ob sie einen direkten Pointer auf das referenzierte
Objekt in dem niedrigstwertigen Bit des Pointers enthalten. Zum
Beispiel kann die Vorrichtung diese Anzeigen als Merker separat
von dem Pointer speichern.