-
Bekannte Anmeldungen
-
Die vorliegende Anmeldung steht in
Zusammenhang mit den folgenden Anmeldungen: Patentanmeldung WO 0
048 077 A mit dem Titel „A
Machine Independent Memory Management System Within a Run-Time Environment", am gleichen Tag
hiermit von Harlan Sexton et al. (docket no. 50277-172; OID-199748-02)
eingereicht.
-
Patentanmeldung WO 0 048 056 A, mit
dem Titel „Address
Calculation of Invariant References Within a Run-Time Environment", am gleichen Tag
hiermit von Harlan Sexton et al. (docket no. 50277-179; OID-1997-48-03)
eingereicht.
-
Patentanmeldung WO 0 048 078 A, mit
dem Titel „A
Paged Memory Management System Within a Run-Time Environment", am gleichen Tag
hiermit von Harlan Sexton et al. (docket no. 50277-261; OID-1997-48-17)
eingereicht.
-
Gebiet der Erfindung
-
Die vorliegende Erfindung betrifft
ein Computersystem und spezieller das Verwalten von Speicher für eine Laufzeitausführungsumgebung.
-
Hintergrund
der Erfindung
-
In einer dynamischen Laufzeitumgebung
für eine
Sprache wie beispielsweise JAVA ist die Speicherverwaltung für Objekte
sehr wichtig. Im speziellen muss eine dynamische Laufzeitumgebung
die Zuweisung und die Freigabe von Speicher für Objekte abwickeln. Ein Objekt
ist eine Einheit, die Daten und, in manchen Umgebungen wie beispielsweise
JAVA Operationen, verbunden mit dem Objekt, einkapselt.
-
Wenn ein Objekt erzeugt wird muss
eine gewisse Speichermenge für
das Objekt zugewiesen werden. Wenn das Objekt nicht mehr benötigt wird,
muss der Speicher für
das Objekt freigegeben werden, so dass er für andere Zwecke wiederverwendet
werden kann. Die Speicherfreigabe kann manuell, wie in den C Programmiersprachen
erfolgen, oder automatisch von einem „Speicherbereiniger" gehandhabt werden.
Es existieren verschiedene Typen von Speicherbereinigern. Z. B.
unterscheidet ein Generationsspeicherbereiniger Objekte basierend
auf deren Lebenszeit, da ein kürzlich
zugewiesenes Objekt üblicherweise
ein kurzlebiges Objekt ist. In einer Implementierung eines Generationsspeicherbereinigers
werden Objekte in einem von zumindest zwei Speicherbereichen, bezeichnet
als „Oldspace" und „Newspace", gespeichert. Wenn
ein Objekt erstmals erzeugt wird, wird Speicher für das Objekt
aus dem Newspace zugewiesen. Nachdem das Objekt für eine Zeitdauer,
wie beispielsweise vier Rückläufe des
Newspace, angedauert hat, wird es „tenured" und in den Oldspace migriert.
-
Die Verwendung von verschiedenen
Speicherbereichen für
Objekte, wobei die verschiedenen Bereiche durch die Lebenszeit der
darin enthaltenen Objekte unterschieden wird, erlaubt es dem Generationsspeicherbereiniger
verschiedene Zuordnungs- und Speicherbereinigungsstrategien für die Speicherbereiche einzusetzen.
Z. B., da der Newspace dazu tendiert, viele Objekte, die häufig zugewiesen
und verlassen werden, zu halten, wird die Speicheryuweisung innerhalb
des Newspace vorzugsweise durch eine billige Technik wie beispielsweise „frontier
consing" (Erhöhen eines
Pointers auf den Beginn von freiem Speicher), und die Speicherbereinigung
durch einen kopierenden Speicherbereiniger implementiert. Andererseits,
da der Oldspace dazu tendiert, weniger und langlebigere Objekte
zu halten, kann es bevorzugt sein, die Speicherzweisung durch eine
Buddy- oder Best Fit-Zuweisungstechnik, und die Freigabe durch einen
Mark-Sweep Speicherbereiniger durchzuführen.
-
Das Leistungsverhalten eines Generationsspeicherbereinigers
wird bedeutend von der Effizienz der Berechnung eines „Root Set" für alle Objekte
im Newspace beeinflusst. Ein Root Set für den Newspace ist ein Satz
von Objekten, derart, dass die transitive Hülle des Satzes alle Live Objekte
im Newspace enthält.
Im speziellen ist es wichtig, alle Oldspaceobjekte, die Objekte
im Newspace referenzieren, zu ermitteln. Ein Verfahren der Vereinfachung
der Root Set Berechnung ist, eine „Erinnerungstabelle" zu pflegen, welche
eine Datenstruktur ist, die von dem Speicherbereiniger verwendet
wird, um aufzuzeichnen, welche Objekte im Newspace von einem Objekt
im Oldspace referenziert werden. Die Erinnerungstabelle wird aktualisiert,
wenn eine Zuweisungsoperationsmacht eine Referenz zu einem Newspaceobjekt
in ein Oldspaceobjekt plaziert. Die Prüfung, die eintritt, um zu ermitteln,
ob eine Zuweisungsoperation eine Referenz zu einem Newspaceobjekt
in ein Oldspaceobjekt plaziert, wird als „Write Barrier" bezeichnet. Es ist
wünschenswert,
solche Zuweisungen in einer effizienten Art und Weise zu erfassen.
-
Ein Ansatz zur Erfassung der Zuweisung
einer Referenz auf ein Newspaceobjekt in einem Oldspaceobjekt ist
es, einen zugehörigen,
zusammenhängenden
Bereich von Speicherorten für
Newspace und Oldspace zu reservieren, und den-Ort der Objekte bezüglich der
reservierten Bereiche zu untersuchen. Z. B., wenn Newspaceobjekte
immer im zusammenhängenden
Bereich 012,000,000 bis 012,777,777 (oktal) zugewiesen sind und
Oldspaceobjekte immer im zusammenhängenden Bereich 023,450,000-023,517,730
zugewiesen sind, dann kann ein Auftreten des Speicherns einer Newspacereferenz
in ein Oldspaceobjekt einfach durch Vergleichen des Speicherorts
der Objekte innerhalb der reservierten Bereiche identifiziert werden.
Folglich wird eine Referenz zu einem Objekt am Ort 012,345,670 festgelegt,
im Newspace zu sein, da der Ort 012,345,670 in den Bereich 012,000,000
bis 012,777,777 fällt.
Viele Laufzeitumgebungen sind jedoch in eine Umgebung implementiert,
die es nicht erlaubt, dass große
zusammenhängende
Speicherbereiche zugewiesen werden. In solchen Umgebungen kann der
Speicher nur als eine Vielzahl von gewöhnlichen Segmenten erhalten
werden. Als ein Ergebnis kann die Ermittlung, in welchem Speicherbereich
sich das Objekt befindet nicht bloß durch Untersuchen des Ortes
des Objekts ermittelt werden.
-
Ein Ansatz zur Ermittlung, zu welchem
Speicherbereich ein Objekt gehört,
bezieht das Durchlaufen einer ergänzenden Datenstruktur mit ein,
die auflistet, welche Segmente zu welchem Speicherbereich zugeordnet
sind. Dieser Ansatz jedoch übernimmt
viele aufwendige Pointer-Dereferenzierungen für die ergänzende Datenstuktur. Ein anderer
Ansatz bezieht das Speichern eines Headers am Beginn jedes Objekts
ein, der den Raum beschreibt, innerhalb welchem sich das Objekt
befindet. Das Abrufen der im Objektheader gespeicherten Information
jedoch erfordert das Dereferenzieren eines Speicherpointers auf
das Objekt, was aufgrund von Leerstellen in der Instruktionsleitung,
Cache-Verlusten oder sogar eines Seitenfehlers, wenn die Seite,
auf welcher sich der Objektheader befindet, vom virtuellen Speichersystem
ausgelagert worden ist, aufwendig ist.
-
Deshalb besteht ein Bedürfniss nach
einer Laufzeitumgebung, um die Speichereigenschaften für ein Objekt
zu verwalten, wie beispielsweise Eigenschaften, die anzeigen, innerhalb
welches Speicherbereichs ein Objekt zugewiesen ist. Es besteht auch
ein Bedürfnis
nach einer effizienten Ermittlung einer Speichereigenschaft für ein Objekt,
vorzugsweise ohne einen Speicherpointer dereferenzieren zu müssen. Ferner
besteht ein Bedürfnis
nach einem effizienten Weg, die Zuweisung einer Referenz auf ein
Newspaceobjekt innerhalb eines Oldspaceobjekts zu ermitteln.
-
Zusammenfassung
der Erfindung
-
Diese und andere Bedürfnisse
werden durch das Verschlüsseln
von Speichereigenschaften über
ein Objekt innerhalb einiger der am wenigsten signifikanten Bits,
ein „Tag" genannt, einer Referenz
auf das Objekt, wie beispielsweise ein Maschinenpointer, behandelt.
Deshalb können
die Speichereigenschaften einfach durch herausziehen und untersuchen
der spezifizierten Bits des „Tags" effizient ermittelt
werden, ohne dass der Maschinenpointer dereferenziert werden muss.
Die Speichereigenschaften eines Objekts, das in dem „Tag" einer Referenz auf
das Objekt verschlüsselt
werden kann, zeigen an, wie und wann das Objekt im Speicher, verwaltet
von einer Laufzeitumgebung, gespeichert wird. Z. B. kann das „Tag" Informationen über die
Lebenszeit, das Format und/ oder den Zusammenhang eines Objekts
verschlüsseln;
folglich kann das Tag anzeigen, ob das Objekt im Newspace oder im
Oldspace zugewiesen ist.
-
Folglich betrifft ein Aspekt der
Erfindung ein computerimplementiertes Verfahren und ein computerlesbares
Medium, das Instruktionen für
die Verwaltung von Informationen über eine Speichereigenschaft
für ein Objekt
trägt.
Das Objekt wird in einen Speicher, z. B. bei einer N-Bit ausgerichteten
Adresse, gespeichert und eine Referenz auf das Objekt wird durch
speichern eines Ortes des Objekts innerhalb des Speichers in einen Basisadressteil
der Referenz erzeugt. Die Methodologie beinhaltet speichern der
Information über
die Speichereigenschaft für
das Objekt in einen Tagabschnitt der Referenz. Der Tagabschnitt
der Referenz beinhaltet ein oder mehrere Bit der Referenz, die weniger
signifikant sind als Bits für
den Adressteil. In einer Ausführungsform
wird Information über
die Speichereigenschaft für
das Objekt durch abrufen des Tagabschnitts der Referenz auf das
Objekt erhalten.
-
Ein weiterer Aspekt der Erfindung
betrifft ein computerimplementiertes Verfahren und computerlesbares
Medium, das Instruktionen zum Verwalten von Speicher für eine Vielzahl
von Objekten trägt.
Die Methodologie beinhaltet die Zuweisung des Objekts in einen ersten
Speicherbereich und das Umziehen mancher der Objekte von dem ersten
Speicherbereich zu einem zweiten Speicherbereich, basierend auf
deren Lebenszeiten. Entweder der erste Speicherbereich oder der
zweite Speicherbereich oder beide beinhalten eine Vielzahl von nicht
zusammenhängenden
Segmenten. Eine Datenstruktur von Informationen über welche zweiten Objekte
in den zweiten Speicherbereich erste Objekte in den ersten Speicherbereich
referenzieren wird erhalten, indem ermittelt wird, ob ein erstes
Objekt im ersten Speicherbereich zugewiesen ist und ein zweites
Objekt im zweiten Speicherbereich zugewiesen ist, basierend auf
einer ersten Referenz auf ein erstes Objekt und einer zweiten Referenz
auf ein zweites Objekt, ohne einen Speicherpointer zu dereferenzieren.
In einer Ausführungsform
wird das Ermitteln, das das erste Objekt im ersten Speicherbereich
zugewiesen ist und das zweite Objekt im zweiten Speicherbereich
zugewiesen ist dwchgeführt,
in dem die „Tags" der Referenzen auf
die ersten und zweiten Objekte herausgezogen werden und die „Tags" verglichen werden.
-
Noch weitere Aufgaben und Vorteile
der vorliegenden Erfindung werden leicht von der folgenden detaillierten
Beschreibung ersichtlich werden, einfach mittels der Illustration
der besten Art und Weise, die für
die Ausführung
der Erfindung in Erwägung
gezogen wird. Wie erkannt werden wird ist die Erfindung geeignet
für andere
und verschiedene Ausführungsformen
und ihre vielzähligen
Details sind geeignet für
Modifikationen in verschiedenen offensichtlichen Gesichtspunkten,
alle ohne von der Erfindung abzuweichen. Folglich sollen die Zeichnung
und Beschreibung als von illustrativer Natur, und nicht als einschränkend betrachtet
werden.
-
Kurze Beschreibung
der Zeichnungen
-
Die vorliegende Erfindung wird beispielhalber,
und nicht als Beschränkung,
in den Figuren der zugehörigen
Zeichnungen veranschaulicht, und in welchen sich gleiche Referenznummern
auf gleiche Elemente beziehen, und in welchen gilt:
-
1 ist
ein Blockdiagramm, das ein Computersystem abbildet, das verwendet
werden kann, um eine Ausführungsform
zu implementieren.
-
2 ist
ein Flowchart, das Schritte für
die Erzeugung und Verwendung eines tagged Pointers beschreibt.
-
3 veranschaulicht
schematisch eine Implementierung eines tagged Pointers.
-
4 ist
ein Flowchart, das Schritte für
die Pflege einer Erinnerungstabelle an einer Write-Banier beschreibt.
-
Beschreibung
der bevorzugten Ausführungsform
-
Es werden ein Verfahren sowie eine
Vorrichtung für
das Verwalten von Speicher beschrieben. In der folgenden Beschreibung
werden zum Zwecke der Erklärung
zahlreiche spezifische Details dargelegt, um ein gründliches
Verständnis
der vorliegenden Erfindung bereitzustellen. Es wird jedoch für einen
Fachmann ersichtlich sein, dass die vorliegende Erfindung ohne diese
spezifischen Details ausgeübt
werden kann. In anderen Fällen
werden gut bekannte Strukturen und Geräte in Blockdiagrammform gezeigt,
um zu vermeiden, dass die vorliegende Erfindung unnötig verworren
wird.
-
Hardware Überblick
-
Ein Blockdiagramm, dass ein Computersystem
(100) darstellt, auf welchem eine Ausführungsform der Erfindung implementiert
werden kann. Das Computersystem (100) beinhaltet einen
Bus (102) oder einen anderen Kommunikationsmechanismus
zum kommunizieren von Information, sowie einen Prozessor (104),
gekoppelt mit dem Bus (102) zum Verarbeiten von Informationen.
Das Computersystem (100) beinhaltet auch einen Hauptspeicher
(106), wie beispielsweise einen Direktzugriffspeicher (RAM)
oder ein anderes dynamisches Speichergerät, gekoppelt an den Bus (102)
zum Speichern von Informationen und Instruktionen, die von dem Prozessor
(104) auszuführen
sind. Der Hauptspeicher (106) kann auch zum Speichern von
temporären Variablen
und anderen Zwischeninformationen während der Ausführung von
Instruktionen, die von dem Prozessor (104) auszuführen sind,
verwendet werden. Das Com putersystem (100) beinhaltet ferner
einen Festspeicher (ROM) (108) oder ein anderes statisches
Speichergerät,
gekoppelt an den Bus (102) zum Speichern von statischen
Informationen und Instruktionen für den Prozessor (104).
Ein Speichergerät
(110), wie beispielsweise eine magnetische Disk oder optische
Disk, wird bereitgestellt und an den Bus (102) zum Speichern von
Informationen und Instruktionen gekoppelt.
-
Das Computersystem (100)
kann über
den Bus (102) an ein Display (112), wie beispielsweise
eine Kathodenstrahlröhre
(CRT) zum Anzeigen von Informationen für einen Computerbenutzer, gekoppelt
sein. Ein Eingabegerät
(114), das alphanumerische und andere Tasten beinhaltet,
ist an den Bus (102) zum Kommunizieren von Informationen
und Kommandoselektionen an den Prozessor (104), gekoppelt.
Ein anderer Typ eines Benutzereingabegeräts ist die Cursorsteuerung
(116), wie beispielsweise eine Maus, ein Trackball, oder Cwsorrichtungstasten
zum Kommunizieren von Richtungsinformationen und Kommandoselektionen
an den Prozessor (104) und zum Steuern der Cwsorbewegung
auf dem Display (112). Dieses Eingabegerät hat typischerweise
zwei Freiheitsgrade in zwei Achsen, einer ersten Achse (z. B. x)
und einer zweiten Achse (z. B. y), was es dem Gerät erlaubt,
Positionen in einer Ebene anzugeben.
-
Die Erfindung betrifft die Verwendung
des Computersystems (100) für die Speicherverwaltung von
Objekten. Gemäß einer
Ausführungsform
der Erfindung wird das Verwalten von Speicher von dem Computersystem
(100) bereitgestellt als Antwort auf den Prozessor (104),
der eine oder mehrere Sequenzen von einer oder mehreren Instruktionen,
die in dem Hauptspeicher (106) enthalten sind, ausführt. Solche
Instruktionen können in
den Hauptspeicher (106) von einem anderen computerlesbaren
Medium, wie beispielsweise im Speichergerät (110), gelesen werden.
Die Ausführung
der Sequenzen von Instruktionen, die in dem Hauptspeicher (106)
enthalten sind, veranlassen den Prozessor (104), die hierin
beschriebenen Prozessschritte durchzuführen. Einer oder mehrere Prozessoren
in einer Multi-Prozessor-Anordnung
können
ebenfalls eingesetzt werden, um die Sequenzen von Instruktionen,
die in dem Hauptspeicher (106) enthalten sind, auszuführen. In
alternativen Ausführungsformen
kann eine festverdrahtete Schaltungstechnik anstelle oder in Kombination
mit Softwareinstruktionen verwendet werden, um die Erfindung zu
implementieren. Folglich sind die Ausführungsformen der Erfindung
nicht auf irgendeine spezifische Kombination einer Hardware-Schaltungstechnik
und Software beschränkt.
-
Der Begriff „computerlesbares Medium", wie hierin verwendet
bezieht sich auf jedes Medium, das an der Bereitstellung von Instruktionen
an den Prozessor (104) zur Ausführung partizipiert. Solch ein
Medium kann viele Formen annehmen, beinhaltend, jedoch nicht beschränkt auf
nicht volatile Medien, volatile Medien, und Übertragungsmedien. Nicht volatile
Medien beinhalten beispielsweise optische oder magnetische Disks, wie
beispielsweise das Speichergerät
(110). Volatile Medien beinhalten dynamischen Speicher,
wie beispielsweise den Hauptspeicher (106). Übertragungsmedien
beinhalten koaxiale Kabel, Kupferdraht und Faseroptiken, einschließlich der
Kabel, die den Bus (102) umfassen. Die Übertragungsmedien können auch
die Form von akustischen oder Lichtwellen annehmen, wie beispielsweise
jene, die durch Radiofrequenz (RF) und Infrarot (IR) Datenkommunikationen
erzeugt werden. Übliche
Formen von computerlesbaren Medien beinhalten beispielsweise eine
Floppydisk, eine flexible Disk, eine Harddisk, ein Magnetband, jedes
andere magnetische Medium, eine CD-ROM, DVD, jedes andere optische Medium,
Punchcards, ein Papierband, jedes andere physikalische Medium mit
Lochrastern, einen RAM, einen PROM, und einen EPROM, einen FLASH-EPROM,
jeden anderen Speicherchip oder Patrone, eine Trägerwelle wie hierin später beschrieben,
oder jedes andere Medium von welchem ein Computer lesen kann.
-
Verschiedene Formen von computerlesbaren
Medien können
einbezogen werden in das Tragen von einer oder mehreren Sequenzen
von einer oder mehreren Instruktionen an dem Prozessor (104)
zur Ausführung.
Beispielsweise können
die Instruktionen zunächst
auf einer magnetischen Disk eines Remote Computers getragen werden.
Der Remote Computer kann die Instruktionen in dessen dynamischen
Speicher laden und die Instruktionen über eine Telefonleitung mittels
eines Modems senden. Ein an dem Computersystem (100) befindliches
Modem kann die Daten auf der Telefonleitung empfangen und einen
Infrarottransmitter verwenden, um die Daten in ein Infrarotsignal
umzuwandeln. Ein Infrarotdetektor, gekoppelt an den Bus (102), kann
die Daten, die in dem Infrarotsignal getragen werden, empfangen
und die Daten an den Bus (102) platzieren. Der Bus (102)
trägt die
Daten zum Hauptspeicher (106), von welchem der Prozessor
(104) die Instruktionen empfängt und ausführt. Die
von dem Hauptspeicher (106) empfangenen Instruktionen können optional auf
dem Speichergerät
(110) entweder vor oder nach der Ausführung durch den Prozessor (104)
gespeichert werden.
-
Das Computersystem (100)
beinhaltet ferner ein Kommunikationsinterface (118), gekoppelt
an der Bus (102). Das Kommunikationsinterface (118)
stellt eine Zwei-Wege- Datenkommunikation,
die an einen Netzwerkanschluss (120) koppelt, die mit einem
lokalen Netzwerk (122) verbunden ist, bereit. Beispielsweise
kann das Kommunikationinterface (118) eine Dienst integrierendes
Digitalnetz (ISDN) Karte oder ein Modem sein, um eine Datenkommunikationsverbindung
an einen konespondierenden Telefonleitungstyp bereitzustellen. Als
ein weiteres Beispiel kann das Kommunikationsinterface (118)
eine Lokalnetz (LAN) Karte sein, um eine Datenkommunikationsverbindung
an ein kompatibles (LAN) bereitzustellen. Drahtlose Verbindungen
können ebenfalls
implementiert werden. In jeder solchen Implementierung sendet und
empfängt
das Kommunikationsinterface (118) elekrische, elektromagnetische
oder optische Signale, die digitale Datenströme tragen, die verschiedene
Typen von Informationen repräsentieren.
-
Der Netzwerkanschluss (120)
stellt typischerweise eine Datenkommunikation durch eines oder mehrere
Netzwerke an andere Datengeräte
bereit. Beispielsweise kann der Netzwerkanschluss (120)
eine Verbindung durch das Lokalnetz (122) zu einem Hostcomputer
(124) oder zu Datenequipment, das von einem Internetserviceprovider
(ISP) (126) betrieben wird, bereitstellen. Der ISP (126)
stellt im Gegenzug Datenkommunikationsservices durch das weltweite
Paketdatenkommunikationsnetzwerk, jetzt üblicherweise als das „Internet" (128) bezeichnet,
bereit. Das Lokalnetz (122) und das Internet (128)
verwenden beide elektrische, elektromagnetische oder optische Signale,
die die digitalen Datenströme
tragen. Die Signale durch die verschiedenen Netzwerke und die Signale
auf den Netzwerkanschluss (120) und durch das Kommunikationsinterface (118),
welche die digitalen Daten zu und von dem Computersystem (100)
tragen, sind exemplarische Formen von Trägerwellen, die die Informationen
transportieren.
-
Das Computersystem (100)
kann Nachrichten senden und Daten empfangen, einschließlich Programmcode,
durch das/die Netzwerk(e), den Netzwerkanschluss (120),
und das Kommunikationsinterface (118). Im Beispiel des
Internet kann ein Server (130) einen abgefragten Code für ein Applikationsprogramm durch
das Internet (128), dem ISP (126), das Lokalnetz
(122) und das Kommunikationsinterface (118) übertragen.
Gemäß der Erfindung
sieht eine solche heruntergeladene Applikation die Verwaltung von
Speicher wie hierin beschrieben vor.
-
Der empfangene Code kann von dem
Prozessor (104) ausgeführt
werden, wie er empfangen wird, und/ oder in dem Speichergerät (110)
oder einem anderen nicht volatilen Speicher für die spätere Ausführung gespeichert werden. Auf
diese Weise kann das Computersystem (100) den Applikationscode
in Form einer Trägerwelle
erhalten.
-
Reference Tagging
-
Die vorliegende Erfindung rührt von
der Erkenntnis her, dass eine Anordnungsvariante eingefühlt und dann
in einer dynamischen Laufzeitumgebung für eine stark typisierten Sprache,
wie beispielsweise JAVA verwertet werden kann, um Informationen über die
Speichereigenschaften des Objekts innerhalb aller Referenzen auf
das Objekt zu codieren. Ein Beispiel für eine Referenz ist ein Maschinenpointer,
der eine Ortsangabe des Objekts in Form einer realen oder virtuellen
Adresse in den Speicherbereich des Computersystems enthält. Die
innerhalb des Pointers eingebettete Information, für welche
es wahrscheinlich ist, dass sie sich in einem Schnellzugriffsmaschinenregister
befindet, kann deshalb sehr schnell abgefragt werden, ohne dass
zusätzliche
Speicherzyklen benötigt
werden, um den Header des referenzierten Objekts zu holen.
-
Bezugnehmend auf 2 werden die Objekte, die von der Laufzeitumgebung
verwaltet werden, bei einer N-Bit Anordnungsadresse (200)
gespeichert. Mit anderen Worten beginnt die Speicherung für diese
Objekte bei virtuellen Adressen, die auf 2N-Byte
Begrenzungen beginnen. Beispielsweise können die Objekte bei 3-Bit
angeordneten Adressen gespeichert werden, das bedeutet, auf 23 = 8 Byte Begrenzungen. Folglich kann eine
gültige
Startadresse, formuliert als Oktalzahl, für ein solches Objekt 02,447,630
sein, jedoch eine Adresse wie beispielsweise 02,447,634 ist keine
gültige
Startadresse für
die Speicherung eines Objekts. Somit dienen die drei letzten signifikanten
Bits des Pointers nicht dazu, verschiedene Objekte zu unterscheiden,
da nur einer der acht Werte für
die drei letzten signfikanten Bits eine gültige Adresse ist und die übrigen sieben
Werte nicht auf ein beliebiges anderes Objekt zeigen. In Anbetracht
dieser Anordnungseinschränkung
beziehen sich Maschinenpointer mit Adressen von 02,447,630 bis 02,447,637
tatsächlich
auf das selbe Objekt.
-
Deshalb kann jedes der N am wenigsten
signifikanten Bits eines Pointers auf ein N-Bit angeordnetes Objekt
verwendet werden, um andere Informationen, nämlich Speichereigenschaften
des referenzierten Objekts zu kodieren. Der verbleibende Abschnitt
des Pointers, die „Basisadresse" genannt, beinhaltet
die Ortsangabe des Objekts innerhalb des virtuellen Speichers.
-
Somit sind alle Bits in einem Pointer,
die weniger signifikant sind als die Bits für die Basisadresse, verfügbar für das Anzeigen
eines Objekts. Beispielsweise können
alle drei Bits eines Pointers auf ein 3-Bit angeordnetes Objekt
dazu verwendet werden, eine Speichereigenschaft des Objekts anzugeben.
-
Als weiteres Beispiel können die
Bits 2 und 3 dazu reserviert werden, eine Speichereigenschaft des Objekts
anzugeben, Bit 0 jedoch kann für
irgendeine andere Art einer Instanzeneigenschaft verwendet werden.
-
In einer in 3 verdeutlichten Implementierung besteht
der Pointer (300) aus einer 32-Bit virtuellen Adresse.
Wenn Objekte innerhalb der Laufzeitumgebung auf 8 Byte Begrenzungen
angeordnet sind, dann sind 3 am wenigsten signifikante Bits des
Pointers (300) für
das „Tag" (304) verfügbar und
die verbleibenden 29 Bits, die den Basisadressteil (302)
ausbilden, werden verwendet, um die Ortsangabe des referenzierten
Objekts zu halten. Obwohl 3 ein
Beispiel eines 32-Bit Pointers (300) mit einem 3-Bit „Tag" (304) abbildet,
ist die vorliegende Erfindung nicht auf diese speziellen Größen beschränkt und
die Pointergröße und Taggöße kann
sich von Implementierung zu Implementierung ändern. Beispielsweise ist das
Pointer Tagging für
16 Bit, 36 Bit und 64 Bit Pointer, und 1 Bit bis 5 Bit Tags geeignet.
-
Bezugnehmend zurück auf 2 wird, wenn eine Referenz, wie beispielsweise
ein Pointer auf ein Objekt, erzeugt wird, die Ortsangabe des Objekts
in dem Basisadressteil der Referenz (Schritt 202) gespeichert, und
die gewünschte
Speichereigenschaft des referenzierten Objekts wird im Tagabschnitt
(Schritt 204) gespeichert. Um die Speichereigenschaft für ein Objekt,
basierend auf einem Pointer (300), der das Objekt referenziert,
abzufragen, wird der Tagabschnitt (304) des Pointers (300)
abgerufen (Schritt 206) ohne den Pointer zu dereferenzieren.
Das Tag kann in einer Vielzahl von Wegen herausgezogen werden, beispielsweise
durch Maskieren des Pointers, um die am wenigsten signifikanten
Bits (304) herauszuziehen, oder durch Berechnen einer Pointerreferenz
des Pointers (300) und der tatsächlichen Startadresse des Objekts.
-
Um einen Tagpointer zu dereferenzieren
wird die Basisadresse aus dem Pointer herausgezogen und dann dereferenziert.
Beispielsweise wird ein Tagpointer 02,447,634 in die Basisadresse
02,447,630 für
die Dereferenzierung umgewandelt. Die Basisadresse kann bei spielsweise
durch wegmaskieren des Tag extrahiert werden. In den C-Programmiersprachen
kann das Tag mit folgendem Ausdruck wegmaskiert werden: (ptr & ~07).
-
Im gegensatz zu manchen SmalltalkTM und LISP MachineTM Implementierungen,
die Typeninformationen in einem Pointertag codieren, setzt eine
Ausführungsform
der Erfindung das Referenzieren des Taggings in einer dynamischen
Laufzeitumgebung für
eine stark typisierte Sprache wie beispielsweise JAVETM ein,
um nicht Typeninformationen über
die Speichereigenschaften eines Objekts zu kodieren. In einer Laufzeitumgebung
für eine
stark typisierte Sprache ist das Speichern von Typeninformationen
in einem Pointer unnötig,
da der Compiler bereits Kenntnis von der relevanten Typeninformation
hat, im allgemeinen in solchen Zusammenhängen, z. B. Nachrichtenabfertigung
in welchen es kritisch ist, den Typ eines Objekts zu kennen.
-
Eine Speichereigenschaft ist eine
stabile Instanzeneigenschaft, anders als der „Typ" die im allgemeinen betrifft, wie das
Objekt im Speicher gespeichert wird und wie lange das Objekt in
den Speicher, der von einer Laufzeitumgebung verwaltet wird, gespeichert
wird. Es hat sich als insbesondere nützlich erwiesen, innerhalb
eines Pointerag drei Arten von Speichereigenschaften zu kodieren:
Lebenszeit, Format und Zusammenhang. Zusätzlich können Kombinationen dieser Speichereigenschaften
in den Pointertag kodiert werden.
-
Die Lebenszeit-Speichereigenschaft
eines Objekts zeigt an, wie lange das Objekt existiert hat. Die
Lebenszeit kann absolut in Größen der
Zeit oder in relativen Größen zu einem
anderen Objekt oder zu einem Ereignis ausgedrückt werden. Beispielsweise
können „kürzlich" zugewiesene Objekte
mit einer 0 getagt (getagged?) werden und „ältere" Objekte können mit einer 1 getagt werden.
Präziser
ist in einem Generationsspeicherbereiniger das Tag 0 mit Objekten
im Newspace assoziiert und das Tag 1 ist mit Objekten im Oldspace assozert.
In diesem Fall kann ein älteres
Objekt definiert werden als vier Ereignisse überlebend, in welchen der Newspace
für die
Speicherbereinigung gereinigt wurde. Als ein anderes Beispiel kann
die Lebenszeit angeben, ob das Objekt während des derzeitigen SQL-Aufrufs
zugewiesen wurde, in einem früheren
Aufruf in der Session, oder zwischen Sessions persistent geblieben
ist.
-
Das Format eines Objekts zeigt an,
was die interne Darstellung des Objekts ist. Das Format weicht vom
Typ ab da der Typ ein logisches Konzept ist, während das Format ein physikali sches
Konzept ist. Folglich ist es für
zwei Objekte des selben Typs möglich,
verschiedene Formate oder interne Darstellungen zu besitzen. Ein
Beispiel für
ein Format für
ein Objekt bezieht die interne Darstellung einer Referenz auf in
anderes Objekt ein. Diese Referenz kann in ein Format als ein nativer
Maschinenpointer und als eine numerische Referenz in einem anderen
Format implementiert sein. Eine numerische Referenz ist eine Ganzzahl,
die die Ortsangabe eines Objekts als eine Versetzung oder einen
Abstand von einem impliziten Basispointer, wie beispielsweise der
Raum eines Zuweisungsbereichs des Speichers oder sogar der Start
des Objektes selbst, beschreibt. Da die interne Darstellung einer
numerischen Referenz eine Ganzzahl ist, ist eine numerische Referenz
portabler und potentiell relokatierbarer als native Maschinenpointer.
In der Tat können
numerische Referenzen selbst getagged werden, um Speichereigenschaften,
wie beispielsweise der Zusammenhang, von den Objekten aufgezeichnet
werden, auf die sich die numerischen Referenzen beziehen.
-
Eine andere Speichereigneschaft ist
die Kontiguität
des Objekts, die anzeigt, ob das Objekt bei zusammenhängenden
Speicherorten oder auf nicht zusammenhängenden Seiten gespeichert
ist. Diese Speichereigenschaft hat sich als insbesondere vorteilhaft
in Laufzeitwngebungen erwiesen, in welchen der Speicher nur als
eine Plwalität
von üblicherweise
nicht zusammenhängenden
Seiten erhalten werden kann. Eine Seite ist eine zusammenhängende Region
fester Länge
des (virtuellen) Adressraums eines Computersystems. In einer Ausführungsform
ist die Seitengröße 4096
(212); obwohl die
Seitengröße in anderen
Ausführungsformen,
wie beispielsweise von 28 (256) bis 216 (65536) Bytes reichen kann. Ein Objekt
wird als nicht zusammenhängend oder „paged" bezeichnet, wenn
es auf einer Vielzahl von Seiten gespeichert wird, speziell wenn
eine der Seiten nicht mit einer beliebigen anderen der Seiten zusammenhängend ist.
Die Adressberechnung eines Feldes, einer Instanzenvariable oder
eines „Slot" eines paged Objekts
ist ziemlich kompliziert, durch indizieren durch eine Seitentabelle,
jedoch viel einfacher für
zusammenhängende
Objekte. Deshalb ermöglicht
es die Kodierung der Kontiguität
eines Objekts in einem Referenztag, dass die geeigneten Maschineninstrutktionen
für das Abrufen
der Slots des paged Objekts abgefertigt werden.
-
Das Tag kann auch Kombinationen von
Speichereigenschaften, wie beispielsweise die Lebenszeit und das
Format des Objekts (für
ein Format) oder die Kontiguität
und das Format des Objekts (für
ein anderes Format) kodieren. Tabelle 1 listet eine mögliche Zuordnung
von Tagwerten für
solche Eigenschaften auf: Tabelle
1
-
Da die Speichereigenschaft des Objekts
in allen Referenzen auf das Objekt kodiert ist, folgt, dass Änderungen,
die in der Speichereigenschaft des Objekts gemacht wurden, in allen
Referenzen auf das Objekt widergespiegelt sein müssen. Diese Restriktion jedoch
ist für
das Tagging der Speichereigenschaften nicht problematisch. Beispielsweise
sind manche Eigenschaften im wesentlichen permanent, wie beispielsweise das
Format oder die Kontiguität,
und die Änderung
von solchen Pointertags wird kaum, wenn überhaupt jemals auftreten.
Als ein weiteres Beispiel müssen,
wenn ein Newspace Objekt in den Oldspace von einem Generations Scavenger
tenured wird, alle Referenzen auf dieses Objekt notwendiger weise
von dem Scavenger in jedem Fall verschoben werden, und, als Teil
dieser Verschiebung kann das Tag aktualisiert werden, obwohl die Lebenszeit
keine permanente Eigenschaft des Objekts ist.
-
Verwenden des Pontertags,
um eine Schreibgrenze zu implementieren
-
4 Bildet
ein Flowchart ab, das verdeutlicht, wie Pointertags verwendet werden
können,
um eine Schreibgrenze in einem Generationsspeicherbereiniger effizient
zu implementieren. Innerhalb des Generationsspeicherbereinigers
werden Objekte im Newspace (Schritt 400) zugewiesen und
manche der Objekte werden in den Oldspace migriert, basierend auf
deren Lebenszeit (Schritt 402). Eine Datenstruktur, eine
Erinnerungstabelle genannt, wird an einer Schreibgrenze gepflegt.
D. h., als Antwort auf eine Zuweisung eines Zielpointers auf ein
Ziel- Objekt in ein
Feld im Quellobjekt, referenziert durch den Quellpointer, wird eine
Erinnerungstabelle bedingt aktualisiert (Schritt 404).
Spezieller muss die Erinnerungstabelle aktualisiert werden, wenn
festgestellt wird, dass das Zielobjekt im Newspace ist und das Quellobjekt
im Oldspace ist.
-
Die Schritte 410 bis 416 beschreiben,
wie diese Bestimmung mittels der Pointertags gemäß einer Ausführungsform
durchgeführt
wird. Bei Schritt 410 wird das Zieltag aus dem Zielpointer
durch Maskieren oder Berechnen einer Pointerdifferenz herausgezogen,
und bei Schritt 412 wird das Quelltag aus dem Quellpointer
herausgezogen. Diese Operationen sind typischerweise Register-zu-Register
Operationen für
die meisten Computerarchitekturen und beziehen das Dereferenzieren
eines Speicherpointers nicht mit ein. Somit wird der Overhead, der üblicherweise
mit dem Dereferenzieren eines Speicherpointers, wie beispielsweise
das Ausgeben eines Speicherlesezyklus an einen Systembus oder das
Duchführen
eines Speicherabrufs, verbunden ist, vermieden. Deshalb dienen Pointertags
dazu, den Aufwand konventioneller Ansätze zu vermeiden, welche einen
Cache Miss oder einen Pagefehler des virtuellen Speichers übernehmen
können.
Insbesondere resultiert die Verwendung nur von Registeroperationen
in einer signifikanten Leistungsverbesserung über den konventionellen Objektheaderansatz.
-
Bei Schritt 414 werden das
Quelltag und das Zieltag überprüft, um zu
ermitteln, ob das Zuweisungsstatement in einem Oldspace Quellobjekt
resultiert, das ein Newspace Zielobjekt referenziert. Wenn diese
Prüfung
war ist, wird die Erinnerungstabelle aktualisiert (Schritt 416).
In einer Ausführungsform
kann diese Überprüfungsoperation
einfach durch vergleichen des Quelltag mit dem Oldspacewert und
das Vergleichen des Zieltag mit dem Newspacewert dwchgeführt werden.
Beispielsweise kann, in der C-Programmiersprache der folgende Ausdruck
diese Überprüfung durchführen: ((source & 07) = OLDSPACE && (target & 07) = NEWSPACE),
wobei source der Pointer auf das Quellobjekt ist, target der Pointer
auf das Zielobjekt ist, OLDSPACE und NEWSPACE offenkundige Konstanten
sind, definiert, um Werte, z. B. 1 und 0 entsprechend festzusetzen.
-
Während
der oben beschriebene Ausdruck geeignet ist, die Überprüfung durchzuführen, kann
er mit geeigneten Auswahlen von Tagwerten effizienter gemacht werden.
Z. B. kann, mit einem Oldspacetag von 1 und einem Newspacewert von
0, diese Ermittlung einfach durch einen Vergleich auf Ungleichheit
durchgeführt werden:
(source & 07) > (target & 07). Mit zusätzlichen
Tagwerten kann dieser Vergleich immernoch in einem Generationsspeicherbereiniger
verwendet werden, wenn beispielsweise alle Schreiboperationen, die
Zuweisungen in Pointerformatobjekte einbeziehen, von solchen getrennt
werden, die Schreiboperationen in numerische Referenzformatobjekte
einbeziehen. Diese Situation kann auftreten, wenn der Generationsspeicherbereiniger
nur für
Pointer-formatierte Objekte im Cal-Duration Speicher verwendet wird,
und die numerischen Referenz formatierten Objekte in einem Session-Duration
Speicher zugewiesen werden.