DE112019001821B4 - Verfahren und vorrichtung zur wiedergabe eines aktivierungsrahmens für unterbrechungsfreie speicherbereinigung (pause-less garbage collection) - Google Patents

Verfahren und vorrichtung zur wiedergabe eines aktivierungsrahmens für unterbrechungsfreie speicherbereinigung (pause-less garbage collection) Download PDF

Info

Publication number
DE112019001821B4
DE112019001821B4 DE112019001821.3T DE112019001821T DE112019001821B4 DE 112019001821 B4 DE112019001821 B4 DE 112019001821B4 DE 112019001821 T DE112019001821 T DE 112019001821T DE 112019001821 B4 DE112019001821 B4 DE 112019001821B4
Authority
DE
Germany
Prior art keywords
thread
seamless
activation frame
memory
computer
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
DE112019001821.3T
Other languages
English (en)
Other versions
DE112019001821T5 (de
Inventor
Don Nilsen Kelvin
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Publication of DE112019001821T5 publication Critical patent/DE112019001821T5/de
Application granted granted Critical
Publication of DE112019001821B4 publication Critical patent/DE112019001821B4/de
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory
    • G06F12/0269Incremental or concurrent garbage collection, e.g. in real-time systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0646Horizontal data movement in storage systems, i.e. moving data in between storage devices or systems
    • G06F3/0652Erasing, e.g. deleting, data cleaning, moving of data to a wastebasket
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/0608Saving storage space on storage systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/0671In-line storage system
    • G06F3/0673Single storage device

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Human Computer Interaction (AREA)
  • Memory System (AREA)

Abstract

Verfahren für unterbrechungsfreie Speicherbereinigung, wobei das Verfahren aufweist:Scannen, durch einen Speicherbereiniger (142), eines ersten unterbrechungsfreien Aktivierungsrahmens (200), der einem ersten Verfahren aus einem Prozess (112) zugehörig ist, wobei der erste unterbrechungsfreie Aktivierungsrahmen (200) unter Verwendung eines Prozess-Threads gescannt wird, der gerade den Prozess (112) ausführt;Scannen, durch den Speicherbereiniger (142), eines zweiten unterbrechungsfreien Aktivierungsrahmens (205), der einem zweiten Verfahren aus dem Prozess (112) zugehörig ist, der gerade vom Prozess-Thread ausgeführt wird,wobei der zweite unterbrechungsfreie Aktivierungsrahmen (205) durch einen Speicherbereiniger-Thread gescannt wird, wobei:Scannen eines unterbrechungsfreien Aktivierungsrahmens ein Untersuchen und Überschreiben eines oder mehrerer aktiver Zeiger von einem Verfahren umfasst, das dem zu scannenden unterbrechungsfreien Aktivierungsrahmen entspricht.

Description

  • HINTERGRUND
  • Die vorliegende Anmeldung bezieht sich allgemein auf den Bereich des Computerspeichermanagements und insbesondere auf den Speicherbereinigungsprozess für zeitkritische Hochleistungsanwendungen.
  • Bei Computern bezieht sich die Speicherbereinigung auf einen Prozess zum Identifizieren ungenutzter Bereiche des Hauptspeichers. Gemäß einer objektorientierten Computersprache ordnet der Computer, der das Programm ausführt, jedem der Objekte Speicher zu. Der Speicher wird dem Heap (Haldenspeicher) in Blöcken zugeordnet und wieder freigegeben, deren Größe gemäß den Anwendungsanforderungen festgelegt wird. Wenn das Programm schließlich nicht mehr auf die Objekte verweist, wird der für die erzeugten Objekte zugeordnete Speicher durch eine Speicherbereinigung zurückgewonnen. Der Speicherbereinigungsprozess löscht die Objekte aus dem Speicher, wodurch der zuvor zugeordnete Speicher wieder zur Nutzung verfügbar ist. Genauer gesagt kann ein Speicherbereinigungsprozess automatisch ermitteln, welche Speicherblöcke freigegeben werden können, indem in Gebrauch befindliche Objekte markiert werden und der Speicher von nicht markierten Objekten zurückgewonnen wird. Ein solcher Speicherbereinigungsprozess wird oft als Mark-and-Sweep bezeichnet, da nützliche Teile des Speichers während einer Mark-Phase (Markierungsphase) als aktiv markiert werden und alle nicht markierten Objekte dann in einer Sweep-Phase (Reinigungsphase) aus dem zugewiesenen Speicher entfernt werden. Obwohl der Prozess der Speicherbereinigung Speicher freigibt, kann es in Anwendungen Probleme geben, bei denen ein unvorhersehbarer Verbrauch von Prozessorzeit das Ausführen der Anwendung beeinträchtigt.
  • Die US 2010 / 0 114 998 A1 offenbart ein Verfahren für gleichzeitige, inkrementelle und sperrfreie Stapelabfrage für Speicherbereinigungsroutinen. Das Verfahren verwendet eine Zusammenfassungstabelle und Rückgabesperren, um eine hohe Reaktionsfähigkeit zu ermöglichen. Das Verfahren unterstützt auch Programme, die Feinsynchronisation verwenden, um Sperren zu vermeiden, verursacht vernachlässigbaren Overhead bei der Programmausführung, kann mit bestehenden, gleichzeitig ausgeführten Speicherbereinigern verwendet werden und unterstützt die speziellen In-Stack-Referenzen, die in Sprachen wie C# existieren.
  • KURZDARSTELLUNG
  • Die Erfindung stellt ein Verfahren wie in Anspruch 1 beansprucht bereit, sowie ein entsprechendes System und Computerprogramm.
  • Figurenliste
  • Die in dem gesamten vorliegenden Dokument beschriebenen Beispiele lassen sich anhand der folgenden Zeichnungen und Beschreibungen besser verstehen. Die Komponenten in den Figuren sind nicht zwangsläufig maßstabsgetreu. Des Weiteren bezeichnen in den Figuren gleichlautende Ziffern die entsprechenden Teile in den verschiedenen Ansichten.
    • 1 zeigt ein Beispiel für ein Multitasking-Computersystem;
    • 2 zeigt ein Blockschaubild eines Programmstapels und typische Aktivierungsrahmen, die auf dem Programmstapel gespeichert sind;
    • 3 zeigt einen unterbrechungsfreien Aktivierungsrahmen für unterbrechungsfreie Speicherbereinigung gemäß einem oder mehreren Beispielen;
    • 4 zeigt ein Flussdiagramm eines Beispielverfahrens zum Durchführen eines Hintergrund-Scans eines Thread-Stapels für eine unterbrechungsfreie Speicherbereinigung;
    • 5 zeigt ein Flussdiagramm eines Beispielverfahrens zum Koordinieren des Scannens eines Thread-Stapels durch einen Anwendungs-Thread und einen Speicherbereinigungs-Thread;
    • 6 zeigt ein Flussdiagramm eines Beispielverfahrens zum Scannen eines Aktivierungsrahmens eines aufrufenden Verfahrens bei der Rückkehr von einem Vanguard-(„Vorreiter-“) Verfahren und Identifizieren eines neuen Vanguard-Verfahrens; und
    • 7 zeigt eine visuelle Darstellung eines Beispielszenarios des Programmstapel-Scans, den der Prozess-Thread für die Speicherbereinigung durchführt.
  • AUSFÜHRLICHE BESCHREIBUNG
  • Verschiedene Ausführungsformen der Erfindung werden hier unter Bezugnahme auf die zugehörigen Zeichnungen beschrieben. Alternative Ausführungsformen der Erfindung können entwickelt werden, ohne von dem Umfang dieser Erfindung abzuweichen. In der folgenden Beschreibung und in den Zeichnungen werden verschiedene Verbindungen und Positionsbeziehungen (z.B. über, unter, neben usw.) zwischen Elementen aufgezeigt. Diese Verbindungen und/oder Positionsbeziehungen können direkt oder indirekt sein, wenn nicht anders angegeben, und die vorliegende Erfindung soll in dieser Hinsicht nicht einschränkend wirken. Entsprechend kann sich eine Verknüpfung von Einrichtungen entweder auf eine direkte oder eine indirekte Verknüpfung beziehen, und eine Positionsbeziehung zwischen Einrichtungen kann eine direkte oder indirekte Positionsbeziehung sein. Darüber hinaus können die verschiedenen hier beschriebenen Aufgaben und Prozessschritte in einen umfassenderen Vorgang oder einen Prozess mit zusätzlichen, hier nicht im Detail beschriebenen Schritten oder Funktionen integriert werden.
  • Die folgenden Definitionen und Abkürzungen sind für die Interpretation der Ansprüche und der Spezifikation zu verwenden. Die hier verwendeten Begriffe „aufweist“, „aufweisen“, „umfasst“, „umfassen, „hat“, „haben“, „enthält“ oder „enthalten“ oder jede andere Variante davon dienen dazu, eine nicht ausschließliche Einbeziehung zu erfassen. Beispielsweise ist eine Zusammensetzung, eine Mischung, ein Prozess, ein Verfahren, ein Gegenstand oder eine Vorrichtung, die eine Liste von Elementen aufweist, nicht zwangsläufig auf diese Elemente beschränkt, sondern kann auch andere Elemente umfassen, die nicht ausdrücklich aufgeführt sind oder zu solch einer Zusammensetzung, einer Mischung, einem Verfahren, einem Gegenstand oder einer Vorrichtung gehören.
  • Darüber hinaus bedeutet der Begriff „beispielhaft“ hier „als Beispiel, Instanz oder Darstellung dienen“. Jede hier als „beispielhaft“ beschriebene Ausführungsform oder Gestaltung ist nicht zwangsläufig als bevorzugt oder vorteilhaft gegenüber anderen Ausführungsformen oder Gestaltungen auszulegen. Die Begriffe „mindestens eins“ und „eins oder mehrere“ sind so zu verstehen, dass sie jede ganze Zahl größer oder gleich eins umfassen, d.h. eins, zwei, drei, vier usw. Der Begriff „eine Mehrzahl“ ist so zu verstehen, dass er jede ganz Zahl größer oder gleich zwei umfasst, d.h. zwei, drei, vier, fünf usw. Der Begriff „Verbindung“ kann sowohl eine indirekte „Verbindung“ als auch eine direkte „Verbindung“ umfassen.
  • Die Begriffe „ungefähr“, „im Wesentlichen“, „annähernd“ und Variationen davon dienen dazu, den Fehlergrad zu umfassen, der mit der Messung einer bestimmten Menge auf der Grundlage der zum Zeitpunkt des Einreichens der Anmeldung verfügbaren Ausrüstung einhergeht. Beispielsweise kann „ungefähr“ einen Bereich von ± 8 % oder 5 % oder 2 % eines bestimmten Wertes umfassen.
  • Der Kürze halber können herkömmliche Techniken im Zusammenhang mit der Erstellung und Anwendung von Aspekten der Erfindung hier gegebenenfalls im Detail beschrieben werden. Insbesondere sind verschiedene Aspekte von Computersystemen und spezifischen Computerprogrammen zum Implementieren der verschiedenen hier beschriebenen technischen Merkmale weithin bekannt. Dementsprechend werden der Kürze halber viele herkömmliche Implementierungsdetails hier nur kurz erwähnt oder ganz weggelassen, ohne die bekannten System- und/oder Prozessdetails bereitzustellen.
  • Bezugnehmend auf 1 ist ein typisches Multitasking-Computersystem 100 dargestellt, das aus einer CPU 102, einer Benutzerschnittstelle 106 und einem Speicher 108 besteht, der einen Direktzugriffsspeicher (RAM) und einen nichtflüchtigen Speicher zur Datenspeicherung umfasst. Speicher 108 speichert eine verwaltete Laufzeitumgebung 110 und einen oder mehrere Prozesse 112, von denen jeder einen oder mehrere Threads umfassen kann. Jedem aktiven Prozess im System wird ein Teil des Computerspeichers zugewiesen, darunter Platz zum Speichern des von dem Prozess ausgeführten Anwendungsschicht-Codes 112, ein Heap 116, der für die dynamische Speicherzuweisung verwendet wird, Platz zum Darstellen des Zustands jedes Threads, der den Prozess ausführt, und Platz zum Speichern des Programmstapels 114 jedes Threads. Die verwaltete Laufzeitumgebung 110 umfasst außerdem einen Planungs-Supervisor 148, der dafür zuständig ist zu entscheiden, für welche der mehreren auszuführenden Aufgaben CPU-Zeit aufgewendet werden soll. Normalerweise muss Planungs-Supervisor 148 abwägen zwischen einer Ausführung von Anwendungsprozess-Threads und einer Ausführung von Speicherbereinigungs-Threads. Darüber hinaus können innerhalb der verwalteten Laufzeitumgebung 110 mehrere unabhängig voneinander entwickelte Anwendungen gleichzeitig laufen.
  • Der Programmstapel 114 jedes Threads befindet sich möglicherweise nicht in zusammenhängenden Speicherseiten des Speichers 108, und wenn er nicht zusammenhängend ist, werden die Speicherseiten oder möglicherweise größere zusammenhängende Speicherblöcke des Stapels mittels bekannter Techniken miteinander verknüpft. Es ist zu beachten, dass es innerhalb des Prozesses 112 mehrere Threads gibt und jeder Thread seinen eigenen Programmstapel 114 hat.
  • CPU 102 umfasst einen Befehlscache 120 zum Bereitstellen von Befehlen an Befehlsdecoder und Ausführungslogik 122. CPU 102 umfasst außerdem einen Stapelcache 124 zum Speichern eines Teils des Programmstapels 114 im Hochgeschwindigkeits-Cache-Speicher und einen Satz von Registern 126 zum Speichern von Datenwerten, Objektverweisen 128 und dergleichen. Programmstapel 114, darunter der Teil im Stapelcache 124, dient zur Zwischenspeicherung verschiedener Datenstrukturen und Parameter, darunter Aktivierungsrahmen (activation frame) 130 (oder Datensätze), die jeweils beim Aufruf eines Verfahrens oder eines anderen Vorgangs auf Programmstapel 114 gelegt werden.
  • Zu Beginn bestimmter Speicherbereinigungsphasen scannt der Speicherbereiniger den Stammsatz (root set) der Zeiger 132. Zwar stellt 1 einen Stammsatz 132 als einen einzigen Block dar, es ist jedoch zu beachten, dass Stammsatz 132 Maschinenregister und bestimmte globale Speicherplätze umfasst, und der Stammsatz im Speicherbereiniger als Teil der ausführbaren Computerbefehle codiert werden kann, die für ein Scannen des Stammsatzes vorgesehen sind. Der Stammsatz stellt eine endliche Anzahl von Maschinenregistern und Speicherplätzen dar, deren Anhäufung indirekten Zugriff auf alle Objekte bereitstellt, die aktuell von Prozess 112 verwendet werden. In einem unterbrechungsfreien Speicherbereinigungssystem ist die Anzahl der Variablen in Stammsatz 132 sehr gering, in der Regel weniger als 100. Der Stammsatz umfasst weder den Inhalt einzelner Thread-Stapel noch den Inhalt aller Thread-Beschreibungen. Vielmehr umfasst der Stammsatz in der Regel einen Verweis auf eine Datenstruktur, die alle Thread-Beschreibungen verfolgt. Jede Thread-Beschreibung verfolgt wiederum einen zugehörigen Thread-Stapel.
  • Es ist zu beachten, dass 1 nur eine vereinfachte Darstellung einer CPU 102 und der im Speicher gespeicherten Objekte darstellt. Es sollte auch beachtet werden, dass in einem Computersystem mehrere Prozesse gleichzeitig ausgeführt werden können, jeder mit seinem eigenen Adressraum, der die gleichen Arten von Objekten umfasst wie in Speicher 108 von 1 dargestellt.
  • Der Begriff „Objekt“ ist hier definiert als jede Datenstruktur, die durch ein Programm oder einen Prozess erzeugt wird. Die Begriffe „Verweis“ und „Objektverweis“ werden austauschbar verwendet, um eine Datenstruktur zu beschreiben, die einen Zeiger auf ein Objekt umfasst. Obwohl der Begriff „Zeiger“ oder „Objektzeiger“ mitunter austauschbar mit „Verweis“ und „Objektverweis“ verwendet wird, können Objektverweise neben einem Zeiger weitere Informationen umfassen. Ein Objektverweis kann direkt oder indirekt sein. Ein direkter Objektverweis verweist direkt auf einen Objekt-Header, während ein indirekter Objektverweis auf ein Objekt-Handle verweist. Der Begriff „Objektverweis“, wie er hier verwendet wird, bezieht sich auf beide Arten.
  • Wenn der dem Heap 116 zugehörige Prozess 112Platz zum Speichern eines Arrays oder eines anderen Programm-„Objekts“ benötigt, wird eine Speicherzuordnungsroutine 140 aufgerufen. Der Speicherzuordner 140 reagiert, indem er Prozess 112 einen Block ungenutzten Speichers in Heap 116 zuordnet. Bei zusätzlichen Speicheranforderungen werden zusätzliche Speicherblöcke zugeordnet. Wenn Prozess 112 weiterhin mehr Speicher anfordert, ist schließlich der gesamte Platz in Heap 116 belegt, und Prozess 112 kann aufgrund von Speichermangel scheitern. Daher muss der Platz entweder durch gezielte Aktionen des Programms oder durch einen anderen Mechanismus wieder freigegeben werden.
  • In der Regel „gibt“ Prozess 112 einen Großteil des Speichers „auf“, der seinen Objekten zugeordnet ist. In der Regel speichert Prozess 112 Verweise auf Programmobjekte in zugeordneten Speicherblöcken und überschreibt alle Verweise auf bestimmte Objekte, nachdem er die Verarbeitung dieser Objekte beendet hat, da er nie wieder auf diese Objekte zugreifen muss. Ein Objekt, für das es keine Verweise (auch Zeiger genannt) gibt, wird oft als „unzugängliches Objekt“ oder „Müll“ („garbage“) bezeichnet, und der von ihm belegte Speicherplatz ist „unzugänglich“ für Prozess 112, der ihn zuvor verwendet hat.
  • Dieses technische Problem wird durch die Rückgewinnung von Speicherblöcken in Heap 116 gelöst, die von Prozess 112 nicht mehr verwendet werden. Der Begriff Speicherbereinigung beschreibt automatische Verfahren zur Wiederherstellung von unbenutztem Speicher in Heap 116. Mittels eines Speicherbereinigers 142 werden unbenutzte oder aufgegebene Teile des Speichers in Heap 116 wiederhergestellt, damit Prozess 112, der den Heap verwendet, weiterhin über genügend Speicher verfügt. Die verwaltete Laufzeitumgebung der Programmiersprache umfasst einen Speicherbereiniger 142. Speicherbereiniger 142 erfasst unbenutzten Speicher und gibt ihn wieder frei, wenn ein vordefiniertes Ereignis eintritt, z.B. der Ablauf einer vordefinierten Zeitspanne oder die Nutzung einer bestimmten Menge des verfügbaren Heaps.
  • Der Speicherbereiniger 142 kann jede der verschiedenen Speicherbereinigungsmethoden verwenden, z.B. die Stop-and-Copy-Speicherbereinigung. In diesem Schema wird Heap 116 in zwei Hälften unterteilt, auch Semi-Spaces (Halbräume) genannt, und das Programm verwendet jeweils nur einen Semi-Space auf einmal. Stop-and-Copy-Speicherbereiniger gewinnen ungenutzten Speicher zurück und komprimieren den durch ein Programm zugänglichen Speicher, der von einem Prozess 112 verwendet wird, indem sie alle „zugänglichen Objekte“ im alten Semi-Space (in der Regel als From-Space bezeichnet) in einen zusammenhängenden Speicherblock im anderen Semi-Space (in der Regel als To-Space bezeichnet) kopieren und alle Verweise auf die zugänglichen Objekte so ändern, dass sie auf die neue Kopie dieser Objekte verweisen. Ein zugängliches Objekt ist jedes Objekt (d.h. ein Speicherblock), auf das direkt oder indirekt durch den „Stamm“ oder den „Stammsatz“ der Aufgabe verwiesen wird. In der Regel ist der Stammsatz 132 eines Prozesses 112 in Bezug auf die Speicherbereinigung ein Satz von Objektverweisen, die an bekannten Stellen gespeichert sind, z.B. bestimmte Maschinenregister 126 und bestimmte globale Variablen, die auf Objekte verweisen, die von einem Prozess 112 verwendet werden. Viele dieser Objekte enthalten wiederum Verweise auf andere Objekte, die von Prozess 112 verwendet werden. Die Kette (chain) oder das gerichtete Diagramm von Objektverweisen, die vom Stammsatz ausgehen, verweist indirekt auf alle zugänglichen Objekte in Heap 116.
  • Durch Kopieren aller zugänglichen Objekte in einen neuen zusammenhängenden Speicherblock in Heap 116 und anschließendes Verwenden der neuen Kopie der Objekte anstelle der alten Kopie entfernt der Stop-and-Copy-Speicherbereiniger 142 alle unbenutzten Speicherblöcke in Heap 116. Zudem „verdichtet“ er den von der Aufgabe verwendeten Speicher, so dass es keine „Löcher“ zwischen zugänglichen Objekten gibt. Verdichtung ist eine erwünschte Eigenschaft, da sie den gesamten für die Zuordnung zu einer Aufgabe verfügbaren Speicher in einen zusammenhängenden Block legt, wodurch die Notwendigkeit entfällt, zahlreiche kleine Blöcke von nicht zugeordnetem Speicher zu verfolgen. Verdichtung verbessert auch die Leistung eines virtuellen Speichers.
  • Zwar wird hier die Stop-and-Copy Speicherbereinigung beschrieben, es ist jedoch zu beachten, dass die hier beschriebenen technischen Lösungen auch dann anwendbar sind, wenn für den Speicherbereiniger 142 eine andere Technik verwendet wird, z.B. eine inkrementelle Speicherbereinigung oder jedes Speicherbereinigungssystem, das den Inhalt jedes Thread-Stapels scannen muss, um in Gebrauch befindliche Objekte zu identifizieren, sowie jedes verfolgende Speicherbereinigungssystem (tracing garbage collection system), das Objektverweise aus Thread-Aktivierungsdatensätzen schnell und effizient auffinden muss. Es ist zu beachten, dass die Stop-and-Copy Speicherbereinigung nicht für eine unterbrechungsfreie Speicherbereinigung geeignet ist, da diese Technik sehr lange Pausen (von Hunderten von ms bis zu Zehntelsekunden) verursacht, während die Anwendung während des Kopierens nicht aktiv ist. Inkrementelle Mark-and-Sweep-Techniken und inkrementelle Kopiertechniken sind für eine unterbrechungsfreie Speicherbereinigung besser geeignet.
  • In 1 sind auch Aspekte eines Computersystems dargestellt, das für die Ausführung von JAVA™-Bytecode-Programmen eingerichtet ist. Insbesondere umfasst die verwaltete Laufzeitumgebung 110 eines solchen Systems einen Bytecode-Programmprüfer 144 zur Überprüfung, ob ein bestimmtes Java-Bytecode-Programm bestimmte vordefinierte Integritätskriterien erfüllt. Die verwaltete Laufzeitumgebung 110 umfasst auch einen Objektklassenlader 146, der Objektklassen in den Heap lädt und den Bytecode-Programmprüfer 144 verwendet, um die Integrität der zu jeder geladenen Objektklasse gehörenden Verfahren zu überprüfen. In einem oder mehreren Beispielen umfasst die verwaltete Laufzeitumgebung 110 auch einen Bytecode-Programmübersetzer (nicht dargestellt) zur Ausführung von Java-Bytecode-Programmen. Wenn Befehlsdecoder und Ausführungslogik 122 für die Ausführung von Java-Bytecode-Befehlen ausgelegt ist, wird kein Bytecode-Programmübersetzer benötigt.
  • Zeitkritische Java-Software wurde erfolgreich in einer Vielzahl von Bereichen eingesetzt, darunter Steuerung der Fertigungsautomatisierung, Stromversorgungsmanagement, autonome Fahrzeuge, Telekommunikationsinfrastruktur und Waffensysteme. Diese erfolgreich eingesetzten Anwendungen zeigen, dass die überragenden Vorteile von Java zeitkritischen Entwicklern zur Verfügung gestellt werden können und von diesen geschätzt werden, obwohl in Java implementierte Echtzeitanwendungen mehr CPU- und Speicherressourcen benötigen als die gleichen in C implementierten Anwendungen. Java eignet sich am besten für große und komplexe zeitkritische Anwendungen, die nicht in großen Mengen (Unterhaltungselektronik) eingesetzt werden. Bei diesen Anwendungen sind die Kosten und Risiken, die mit der Entwicklung und Wartung von Software verbunden sind, in der Regel weitaus höher als die Gesamtkosten der Computer-Hardware, auf der die Software eingesetzt wird. Bei derartigen Anwendungen ist es von Vorteil, dass Java-Entwickler oft doppelt so produktiv bei der Implementierung neuer Funktionen sind und mehr als zehnmal so produktiv bei der Wiederverwendung, Wartung und Neuverwendung vorhandener Funktionen im Vergleich zu herkömmlichen Ansätzen auf der Grundlage von C oder C++.
  • Zwei technische Hindernisse für die Einführung zeitkritischer Java-Technologien sind, dass (1) zeitkritische virtuelle Java-Maschinen viel langsamer laufen als übliche virtuelle Java-Maschinen, da eine Feinabstimmung zwischen den Aktivitäten der Anwendungs-Threads 112 und der Speicherbereinigung 142 aufwändig ist, und (2) die Antwortlatenz üblicher Java-Threads 112 selbst auf den reaktionsschnellsten virtuellen Echtzeit-Java-Maschinen etwa 200 µs beträgt. Dies ist etwa 20-mal langsamer als die typische Antwortlatenz ähnlicher in C geschriebener Threads. Die hier beschriebenen technischen Lösungen setzen bei solchen technischen Herausforderungen an und ermöglichen einen Durchsatz, der mit traditionellem Java vergleichbar ist, und eine Antwortlatenz, die mit in C geschriebenen Anwendungen vergleichbar ist. Die hier beschriebenen technischen Lösungen setzen somit bei technischen Problemen an, die in der Computertechnologie der Leistung von Java-Programmen begründet sind, und verbessern die Ausführung von Java-Programmen, indem sie eine unterbrechungsfreie Speicherbereinigung für hochleistungsfähige zeitkritische Java-Programme ermöglichen. Zwar werden in den hier beschriebenen Beispielen Java-Programme verwendet, es ist jedoch zu beachten, dass die hier beschriebenen technischen Lösungen auf Computerprogramme anwendbar sind, die unter Verwendung einer anderen Computerprogrammiersprache oder einer Kombination davon geschrieben wurden, insbesondere wenn die Sprache(n) eine Speicherbereinigung für das Speichermanagement verwendet (verwenden).
  • Der gesamte Speicherbereinigungsaufwand eines hier beschriebenen unterbrechungsfreien Speicherbereinigungssystems ist in kleine Arbeitsinkremente unterteilt, die mit der Ausführung von Anwendungscode überlappen, der durch den Prozess 112 ausgeführt wird. Um einen zuverlässigen Betrieb zu gewährleisten, macht jedes Inkrement von Speicherbereinigung bzw. Anwendungsaufwand messbare Fortschritte, wie in 5 dargestellt. Da Java-Objekte von Anwendungs- und Speicherbereinigungs-Threads gemeinsam genutzt werden, verwendet die unterbrechungsfreie Speicherbereinigung außerdem ein Protokoll, um die Datenkohärenz zu gewährleisten. Immer wenn der Speicherbereiniger 142 ein Objekt verschiebt, um Speicher zu defragmentieren, erkennt Prozess 112 sofort die neue Position des Objekts in Speicher 108. Wenn ein Anwendungs-Thread, d.h. der Prozess 112, ein Zeigerfeld eines vorhandenen Objekts überschreibt oder einen Zeiger überschreibt, der im Aktivierungsrahmens des gegenwärtig ausgeführten Verfahrens enthalten ist, erkennt der Speicherbereiniger 142 gleichermaßen die Änderung im Objektverbindungsdiagramm sofort, da dies die Wahrnehmung des Speicherbereinigers 142 von „Müll“ ändern kann, d.h. von Speicher, der nicht mehr von Prozess 112 verwendet wird.
  • Java-Anwendungsentwickler verwenden eine spezielle Syntax, um Objekte zu markieren, die von Threads gemeinsam genutzt werden. Dadurch kann der Compiler den Zugriff auf nicht gemeinsam genutzte Objekte optimieren. Der Inhalt nicht gemeinsam genutzter Objekte kann in Maschinenregistern 126 zwischengespeichert werden, und der Zugriff auf nicht gemeinsam genutzte Objekte erfordert keine Speicherbarrieren, um eine Cachekohärenz zu erzwingen. Java-Compiler erzeugen sehr effizienten Code für Threads, die nur private (nicht gemeinsam genutzte) Objekte behandeln. Objekte, die für den Speicherbereiniger 142 sichtbar sein sollen, werden nicht durch eine solche Syntax unterschieden. Der Compiler hat die Aufgabe und die Fähigkeit, Code auszugeben, der die Kohärenz sicherstellt.
  • 2 ist ein Blockschaubild des Programmstapels und typischer Aktivierungsrahmen, die auf dem Programmstapel gespeichert sind. Der Programmstapel 114 speichert beide Aktivierungsrahmen der Verfahren (auch Stapelrahmen (stack frames)/Aktivierungssätze (activation records) genannt). Zwischenergebnisse der rechnerischen Auswertung werden innerhalb von Aktivierungsrahmen gespeichert. Immer wenn ein neues Verfahren oder ein neuer Vorgang aufgerufen wird, wird ein neuer Stapelrahmen oder Aktivierungsrahmen 130 auf den Stapel 114 gelegt.
  • Wie in 2 dargestellt, umfasst ein beispielhafter Aktivierungsrahmen 130 unter anderem einen Rückkehradressen-Programmzählerwert. Der Aktivierungsrahmen 130 umfasst ferner einen vorherigen Rahmenstapelzeigerwert (d.h. er zeigt gegebenenfalls auf den Anfang des vorhergehenden Stapelrahmens). Der Aktivierungsrahmen 130 umfasst ferner die Operanden bzw. Parameter 160, 162, die dem aufgerufenen Vorgang oder Verfahren zugehörig sind. Der Aktivierungsrahmen 130 umfasst ferner die lokalen Variablen 164, 166, die dem aufgerufenen Vorgang oder Verfahren zugehörig sind.
  • Darüber hinaus wird eine Reihe von Registern verwendet, um die Verwendung des Programmstapels 114 zu verwalten. Beispielsweise werden Register verwendet, um einen Basisrahmenzeiger (base frame pointer) 170 zu speichern, der auf das untere Ende des Stapels 114 zeigt, sowie einen Stapeloberendezeiger (top-of-stack pointer) 172, der auf das obere Ende des Stapels zeigt (d.h. den Anfang des unbenutzten Teils des Stapels), und einen aktuellen Rahmenzeiger 174, der auf das Ende des aktuellen Aktivierungsrahmens 130 zeigt.
  • In einem oder mehreren Beispielen umfasst die verwaltete Laufzeitumgebung 110 Befehle zum Speichern eines Aktivierungsrahmens 130 für jedes vom Prozess 112 aufgerufene Verfahren im zugehörigen Thread-Stapel 114. In herkömmlicher Terminologie ausgedrückt, wird ein Aktivierungsrahmen 130 immer dann auf den Programmstapel 114 gelegt, wenn ein Verfahren oder Vorgang aufgerufen wird. Immer wenn ein Vorgang beendet wird, setzt der Datenprozessor seinen Programmzähler auf die Rückkehradresse PC im aktuellen Aktivierungsrahmen 130, der aktuelle Aktivierungsrahmen 130 wird aus dem Programmstapel 114 entfernt und der vorherige Aktivierungsrahmen wird zum neuen aktuellen Rahmen 174.
  • Je nach aufgerufenem Verfahren können einer oder mehrere der Parameter 160, 162 und eine oder mehrere der lokalen Variablen 164, 166 im Aktivierungsrahmen 130 Objektverweise sein. In der Regel gibt es im Aktivierungsrahmen 130 für jedes definierte Verfahren eine feste Anzahl von Parametern und eine feste Anzahl von lokalen Variablen, und es gibt einen festen, vordefinierten Datentyp für jeden der Parameter und jede der Variablen im Aktivierungsrahmen 130. Zu den gängigen Datentypen gehören lange Ganzzahlen, kurze Ganzzahlen (vorzeichenbehaftete 16-Bit-Ganzzahlen), Gleitkommazahlen mit einfacher Genauigkeit, Gleitkommazahlen mit doppelter Genauigkeit, Byte, Zeichen und Objektverweise (gelegentlich auch Objekt-Handle genannt).
  • In einem unterbrechungsfreien Aktivierungsrahmen wird ein vorbestimmter Platz reserviert, der sich in einem festen Abstand von der oberen Adresse des Aktivierungsrahmens eines jeden Verfahrens befindet, um lokale Zeigerwerte aufzunehmen, die von Prozess 112 und den den Speicherbereiniger 142 ausführenden Threads gemeinsam genutzt werden. Im überwiegenden Teil der Zeit, in der ein Verfahren ausgeführt wird, werden Zeigervariablen in Maschinenregistern vorgehalten. Bevor ein laufender Thread zurückgestellt wird, werden alle aktiven Zeigervariablen im PointerVariablePreemptionSaveArea 230 (Zeigervariablen-Zurückstellungs-Sicherungsbereich) gesichert. Nach der Zurückstellung wird der Inhalt von Zeigerregistern durch Auslesen gesicherter Werte aus dem PointerVariablePreemptionSaveArea wiederhergestellt. Das Speichern und Abrufen dieser Zeigerwerte ist nahezu ohne Aufwand möglich, da diese Befehle die vorhandenen Befehle der Binärschnittstelle (Application Binary Interface, ABI) ersetzen, um die nichtflüchtigen Register zu sichern und wiederherzustellen, die jeden Funktionsaufruf umgeben. Zurückstellungs-Sicherheitspunkte sind so angeordnet, dass Hunderte von Befehlen auf einmal (die in der Regel etwa 1 µs Echtzeit entsprechen) ohne Koordinationsaufwand ausgeführt werden können. Die Wartung des PointerVariablePreemptionSaveArea ist sehr kostengünstig, wenn nicht sogar kostenlos, da die zu seiner Wartung durchgeführten Operationen denen entsprechen, die bereits durchgeführt werden, und das Implementieren der hier beschriebenen technischen Lösungen keine weiteren nennenswerten Rechenkosten verursacht.
  • Die meisten Zeigerparameter werden in Maschinenregistern übergeben, und die meisten lokalen Zeigervariablen werden ebenfalls in Maschinenregistern vorgehalten. Für den Fall, dass Zeigerparameter im Speicher übergeben werden, erzeugt der Compiler Code, um den Wert des Zeigerparameters in einen Slot des PointerVariablePreemptionSaveArea zu kopieren, bevor das Verfahren einer Zurückstellungsanforderung nachkommt. Für den Fall, dass eine lokale Zeigervariable im Speicher angezeigt werden muss, wird der vom Compiler für die Darstellung der lokalen Variable reservierte Slot immer aus dem PointerVariablePreemptionSaveArea entnommen.
  • 3 stellt einen unterbrechungsfreien Aktivierungsrahmen für unterbrechungsfreie Speicherbereinigung gemäß einem oder mehreren Beispielen dar. Für den unterbrechungsfreien Aktivierungsrahmen 200 wird das Ausführen eines Java-Verfahrens dargestellt. Es ist jedoch zu beachten, dass der unterbrechungsfreie Aktivierungsrahmen 200 auf jede andere Computerprogrammiersprache angewendet werden kann, die eine Speicherbereinigung verwendet. Der unterbrechungsfreie Aktivierungsrahmen 200 umfasst neben den typischen Elementen, die unter Bezugnahme auf 2 beschrieben sind, einen Objektverweis 210 auf ein nächstes Verfahren, das von dem vorliegenden Verfahren aufgerufen wird, das dem vorliegenden unterbrechungsfreien Aktivierungsrahmen 200 zugehörig ist. Darüber hinaus umfasst der unterbrechungsfreie Aktivierungsrahmen 200 in einem oder mehreren Beispielen ein echtes Rückkehradressfeld (TrueLRSave) 220, das den Kontext wiedergibt, in dem das dem vorliegenden Aktivierungsrahmen 200 zugehörige Verfahren aufgerufen wurde. Darüber hinaus umfasst der vorliegende unterbrechungsfreie Aktivierungsrahmen 200 in einem oder mehreren Beispielen einen Verweis auf einen Pointer Variable Preemption Save Area 230. Die echte Rückkehradresse 220 und der Verweis auf den Preemption Save Area 230 dürfen nicht im vorliegenden unterbrechungsfreien Aktivierungsrahmen 200 gespeichert werden, wenn das zugehörige Verfahren keine Zurückstellungspunkte hat.
  • Der Pointer Variable Preemption Save Area 230 besteht aus einer Reihe von Speicherplätzen, in denen alle aktiven Zeiger des ersten Verfahrens gespeichert werden, das dem vorliegenden unterbrechungsfreien Aktivierungsrahmen 200 zugehörig ist. In einem oder mehreren Beispielen umfasst der Preemption Save Area 230 einen fest zugeordneten Speicherplatz für einen aktiven Zeiger. Der eine oder die mehreren aktiven Zeiger im ersten Verfahren können vom Compiler (nicht dargestellt) zum Zeitpunkt der Codeerzeugung ermittelt werden.
  • 3 stellt auch einen zweiten unterbrechungsfreien Aktivierungsrahmen 205 im Programmstapel 114 dar. Der zweite unterbrechungsfreie Aktivierungsrahmen 205 ist einem aufrufenden (zweiten) Verfahren zugehörig, das das dem vorliegenden unterbrechungsfreien Aktivierungsrahmen 200 zugehörige Verfahren (erstes Verfahren) aufgerufen hat. Der zweite unterbrechungsfreie Aktivierungsrahmen 205 umfasst ebenfalls die Felder 210, 220 und 230.
  • Wenn das zweite Verfahren das Aufrufen des ersten Verfahrens vorbereitet, überschreibt es das Feld InvokedMethodlmplementation 210 (Aufgerufene-Verfahrens-Implementierung) seines Aktivierungsrahmens 205 mit einem Verweis auf das Methodimplementation-Objekt (Verfahrens-Implementierung), das die symbolischen Informationen bereitstellt, die dem ersten aufzurufenden Verfahren zugehörig sind. Diese symbolischen Informationen werden dazu verwendet, Stacktrace-Informationen (Stapelzurückverfolgung) bereitzustellen, die in jede ausgelöste Ausnahme eingebettet sind, um bestimmte Sicherheitsmanagement-Funktionen zu unterstützen (die das Ausführen riskanter Operationen nur dann erlauben, wenn die Aufrufkette bestätigt, dass der die riskante Operation anfordernde Code vertrauenswürdig ist), und um das symbolische Debugging zu ermöglichen. In einer unterbrechungsfreien Speicherbereinigungsumgebung beschreibt das Methodimplementation-Objekt 210 auch den Zustand des PointerVariablePreemptionSaveArea 220 an jedem Zurückstellungspunkt. Typische Prologe und Epiloge von Verfahren greifen nicht auf die Felder TrueLRSave 220 oder PointerVariablePreemptionSaveArea 230 des Aktivierungsrahmens zu.
  • Ein Codegenerator oder Compiler (nicht dargestellt) geht davon aus, dass jeder Aufruf eines Verfahrens zu einer Zurückstellung durch den Speicherbereiniger 142 führen kann. Dementsprechend wird jeder Aufruf als Zurückstellungspunkt behandelt und wird von den in Tabelle 1 durch die Logik beschriebenen Handlungen ergänzt. Tabelle 1
    - für jede aktive Zeigervariable
    Wert dieser Zeigervariablen in einem fest zugeordneten Slot innerhalb des Pointer Variable Preemption Save Area sichern
    - Verfahren aufrufen
    - für jede oben gesicherte Zeigervariable
    Wert der Zeigervariablen von ihrem fest zugeordneten Slot innerhalb des Pointer Variable Preemption Save Area wiederherstellen
  • Unter der Annahme, dass jede Zeigervariable in einem flüchtigen Register 126 vorgehalten wird, entspricht dieser Aufwand des Sicherns und Wiederherstellens von aktiven Zeigern im Wesentlichen dem Aufwand, der in den vorhandenen ABIs von anderen Programmiersprachen durchgeführt wird, z.B. durch C-Code für alle durch das aufrufende Verfahren gesicherten (flüchtigen) Register 126.
  • Aufgrund der Konventionen dieses Protokolls für den Verfahrensaufruf sind die nichtflüchtigen (durch das aufgerufene Verfahren gesicherten) Register 126 in der Regel nicht der Darstellung von Zeigervariablen zugeordnet. Das liegt daran, dass diese Konventionen zur Codegenerierung bewirken, dass jede Zeigervariable für alle Verfahrensaufrufe als tot wahrgenommen wird. Bei Sprachen, die den hier beschriebenen unterbrechungsfreien Aktivierungsrahmen nicht verwenden, entsprechen die Werte, die bei einer Rückkehr von einem Verfahrensaufruf in die einzelnen Zeigervariablen wiederhergestellt werden, genau den Werten, die vor dem Aufruf gesichert wurden. Bei der unterbrechungsfreien Aktivierungsrahmenvorrichtung können sich die in Zeigervariablen wiederhergestellten Werte jedoch von denen unterscheiden, die im Pointer Variable Preemption Save Area gesichert wurden. Wiederhergestellte Werte können sich von den ursprünglich im Preemption Save Area 230 gesicherten Werten unterscheiden, wenn der Speicherbereiniger 142 ein verwiesenes Objekt verschiebt, um eine Speicherfragmentierung zu verringern. Darüber hinaus können sich der Satz von Zeigervariablen, die als aktiv betrachtet werden, und die Slots, die für das Sichern der einzelnen aktiven Zeigervariablen innerhalb des Pointer Variable Preemption Save Area vorgesehen sind, für jeden Zurückstellungspunkt innerhalb der Funktion unterscheiden.
  • Wenn das erste Verfahren mehr Zurückstellungspunkte benötigt, als durch seine Aufrufe anderer Verfahren dargestellt werden, fügt der Codegenerator eine ausdrückliche Zurückstellungsprüfung in den Hauptteil des Verfahrens ein. Der Code zur Implementierung einer ausdrücklichen Zurückstellungsprüfung ist in Tabelle 2 dargestellt. Wenn der Speicherbereiniger 142 mit dem Scannen des Stapels dieses Threads beginnt, solange dieser Thread zurückgestellt ist, scannt der Speicherbereiniger 142 den Pointer Variable Preemption Save Area 230 auf das zurückgestellte Verfahren 434, bevor dieser Thread die Ausführung 438 wieder aufnehmen darf. Das zurückgestellte Verfahren wird als Vanguard-Verfahren („Vorreiter“) bezeichnet. Die unterbrechungsfreien Aktivierungsrahmen für das Vanguard-Verfahren und für alle direkt oder indirekt vom Vanguard-Verfahren aufgerufenen Verfahren müssen nicht gescannt werden. Wenn das Vanguard-Verfahren die Steuerung zurückgibt, scannt der Anwendungs-Thread automatisch den Pointer Variable Preemption Save Area des umgebenden Aktivierungsrahmens, bevor er den Code ausführt, der den Aufrufer des Vanguard-Verfahrens implementiert, und der Aufrufer des Vanguard-Verfahrens wird zum neu identifizierten Vanguard-Verfahren. Tabelle 2
    wenn (Zurückstellung dieses Threads erforderlich ist) {
    - das LR-Register im LRSave-Feld sichern, falls es dort noch nicht vorhanden ist
    - für jede aktive Zeigervariable
    o Wert dieser Zeigervariablen in einem fest zugeordneten Slot innerhalb des Pointer Variable Preemption Save Area sichern
    - der Zurückstellungsanforderung nachkommen
    - für jede oben gesicherte Zeigervariable
    o Wert der Zeigervariablen von ihrem fest zugeordneten Slot innerhalb des Pointer Variable Preemption Save Area wiederherstellen
    - das LR-Register aus LRSave-Feld wiederherstellen, wenn sein Wert oben gesichert wurde }
  • Durch das Verzögern eines Kontextwechsels, bis der aktuelle Thread des Prozesses 112 seinen nächsten ausdrücklichen Zurückstellungspunkt erreicht, wird zwar die Antwortlatenz erhöht, aber es wird auch die Effizienz des Codes erhöht, der zwischen den Zurückstellungspunkten ausgeführt wird. Das Aufrechterhalten des unterbrechungsfreien Aktivierungsrahmens 200 verursacht nur einen sehr geringen Ausführungsaufwand für die laufenden Threads des Prozesses 112, solange der Speicherbereiniger 142 im Leerlauf ist, was in der Regel mehr als 90 % der Laufzeit einer Anwendung der Fall ist. Das Aufrechterhalten des unterbrechungsfreien Aktivierungsrahmens 200 während der Laufzeit verbessert die Antwortlatenz des Prozesses 112, da dadurch der Programmstapel 114 jedes Threads inkrementell gescannt werden kann.
  • Ohne an Allgemeingültigkeit zu verlieren, wird angenommen, dass jeder Anwendungs-Thread mit einem einzelnen Speicherbereinigungs-Thread gepaart ist, der für das Scannen des Stapels des Anwendungs-Threads zuständig ist. Die gepaarten Threads teilen sich den Zugriff auf einen einzigen Hardware-Thread-Kern, so dass immer nur einer der beiden Threads zu einem bestimmten Zeitpunkt ausgeführt werden darf. Kontextwechsel zwischen den beiden Threads finden nur an festgelegten zurückstellungssicheren Ausführungspunkten statt, die für Anwendungs-Threads durch den Compiler vorgegeben werden und für Speicherbereinigung-Threads durch den Entwickler der verwalteten Laufzeitumgebung. Indem sichergestellt wird, dass der Speicherbereiniger 142 und der Anwendungs-Thread des Prozesses 112 nicht gleichzeitig denselben Stapel scannen, entfällt die Notwendigkeit von Sperrprotokollen zur Verhinderung von Konflikten beim Zugriff auf gemeinsam genutzte Slots desselben Aktivierungsrahmens. Alternative Viele-zu-Viele-Zuordnungen zwischen Anwendungs-Threads und Speicherbereinigungs-Threads können mittels Thread-Synchronisierungssperren oder mit einem intelligenten integrierten Thread-Scheduler implementiert werden, der sorgfältig verhindert, dass ein Anwendungs-Thread so geplant wird, dass er zu derselben Zeit läuft wie der zugehörige Speicherbereinigungs-Thread.
  • 4 stellt ein Flussdiagramm eines Beispielverfahrens zum Durchführen eines unterbrechungsfreien Scans eines Thread-Stapels als eine Speicherbereinigungsaktivität dar, die zeitgleich im Hintergrund einer zeitkritischen Anwendungsarbeitslast ausgeführt wird. Es können mehrere Instanzen dieses Verfahrens gleichzeitig laufen, eine Instanz für jeden aktiven Thread in Prozess 112. Das Verfahren umfasst einen Speicherbereiniger-Thread 142, der parallel zu einem zugehörigen Anwendungs-Thread läuft, der als Teil des Prozesses 112 ausgeführt wird. Der Speicherbereiniger-Thread 142 scannt den Stapel 114 eines Prozess-Threads, der im System 100 ausgeführt wird, für den der Speicherbereiniger 142 die Absicht zu scannen gemeldet hat. In der Regel scannt der Speicherbereiniger 142 die Thread-Stapel 114, indem er vom unteren Ende eines jeden Stapels (höhere Speicheradressen) zum oberen Ende des jeweiligen Stapels scannt. Das Scannen der Thread-Stapel 114 erfolgt als Hintergrundaktivität.
  • Der Speicherbereiniger 142 stellt fest, dass ein Scannen von Thread-Stapeln erforderlich ist, wenn eine vorhergehende Phase der Speicherbereinigung abgeschlossen wurde, oder wenn die Größe des Speicherzuordnungs-Pools unter einen bestimmten Schwellenwert gefallen ist, oder wenn ein zuvor für den Beginn einer bestimmten Speicherbereinigungsphase festgelegter Zeitpunkt erreicht wurde, oder wenn eine andere vorgegebene Bedingung vorliegt. Für jeden der Threads, dessen Stapel gescannt werden muss, führt der Speicherbereiniger 142 das in 4 beschriebene Verfahren durch. Der unterste Aktivierungsrahmen eines jeden Thread-Stapels wird als zugehörig zu einem einfachen Bootstrap-Verfahren (Ladeprogramm) angenommen, das keine ausdrücklichen Zurückstellungspunkte hat und keine weiteren Zeiger außer dem Wert des InvokedMethodlmplementation-Feldes seines Aktivierungsrahmens enthält.
  • Sobald der Speicherbereiniger einen Prozess-Thread auswählt, um dessen Stapel zu scannen, stellt der Speicherbereiniger sicher, dass sich der Anwendungs-Thread in einem zurückgestellten Zustand befindet. Das Prozess-Thread-Verfahren, das zum Zeitpunkt der letzten Zurückstellung des Threads lief, wird als Vanguard-Verfahren identifiziert. Wenn der Prozess-Thread für den entsprechenden zu scannenden Programmstapel 114 ausgewählt wird, aktiviert der Speicherbereiniger 142 die Felder scan_base (unteres Ende scannen) und scan_top (oberes Ende scannen) des zugehörigen Thread-Deskriptors, um den Bereich der zu scannenden unterbrechungsfreien Aktivierungsrahmen zu identifizieren 432, scannt den Pointer Variable Preemption Save Area 230 des Vanguard-Verfahrens 434 und benachrichtigt den Prozess-Thread des Prozesses 112, damit dieser das Scannen seiner eigenen Stapelrahmen unterstützt, indem er die Rückkehradresse des Vanguard-Verfahrens mit der Adresse einer speziellen Trampolin-Funktion 436 überschreibt. Am Ende dieser Einrichtungsarbeit 430 setzt der Speicherbereiniger 142 aus, damit der Anwendungs-Thread bei Bedarf seine Ausführung fortsetzen kann. Der Zeitaufwand für diese Einrichtungsarbeit 430 ist sehr gering, in der Regel weniger als 1 µs. Daher wird die Interferenz des Speicherbereinigers 142 bei der zeitgerechten Ausführung von Anwendungs-Threads als unterbrechungsfrei beschrieben.
  • 5 stellt ein Flussdiagramm eines Beispielverfahrens zum Planen des zeitlichen Ablaufs von Aufwandsinkrementen dar, die zwischen Anwendungsverarbeitung und Hintergrund-Speicherbereinigungaktivitäten abwechseln. Während der Prozess 112 ausgeführt wird, ist die Speicherbereinigung meist im Leerlauf. Ein Thread-Supervisor 148, der Bestandteil der verwalteten Laufzeitumgebung 110 ist, ist für ein Planen von Arbeitsinkrementen verantwortlich, die vom Speicherbereiniger 142 und dem Prozess-Thread ausgeführt werden sollen. Wenn die Speicherbereinigung im Leerlauf ist (460) oder wenn das Ausführen des Anwendungs-Threads dringender erforderlich ist als das Ausführen des Speicherbereinigers (462), werden Inkremente der CPU-Zeit für das Ausführen eines Prozess-Threads verwendet (464). Wenn das Ausführen des Speicherbereinigers dringender erforderlich ist als das Ausführen des Prozess-Threads (462), werden Inkremente der CPU-Zeit für Speicherbereinigungsaktivitäten verwendet (468). In dem seltenen Fall, dass Threads des Prozesses 112 mit sehr hoher Priorität darauf warten, dass der Heap wieder aufgefüllt wird, damit neue Objekte zugeordnet werden können, erben Speicherbereinigungsaktivitäten die hohe Planungspriorität der wartenden Prozess-Threads. Das häufigste Szenario besteht darin, dass die Speicherbereinigung mit niedriger Priorität läuft und Zustände mit fehlendem Speicher vermieden werden, indem die Speicherbereinigung proaktiv zu Zeiten durchgeführt wird, in denen die zeitkritischen Prozess-Threads mit hoher Priorität auf neue Arbeit warten. Sowohl Prozess-Threads als auch Speicherbereinigung-Threads kommen häufig Zurückstellungsanforderungen nach (466, 470), so dass jede Aufgabe mit hoher Priorität, die neu zur Ausführung bereitsteht, schnell auf CPU 102 zugreifen kann, um ihre Arbeit zügig zu vollenden.
  • Wenn es die Ressourcen erlauben, scannt ein Hintergrund-Speicherbereinigungs-Thread weiterhin den Thread-Stapel als Hintergrundaktivität, so dass Threads des Prozesses 112 mit höherer Priorität im Vordergrund laufen können. Solange ein Thread unterbrechungsfreie Aktivierungsrahmen hat, die gescannt werden müssen, was dadurch angezeigt wird, dass scan_base einen größeren Wert hat als scan_top (440), scannt der Speicherbereinigungs-Thread in einer Wiederholungsschleife den Inhalt des PointerVariablePreemptionSaveArea-Feldes, das zu dem unterbrechungsfreien Aktivierungsrahmen gehört, der sich unmittelbar unter dem scan_base-Zeiger (452) befindet. Nach dem Scannen dieses Aktivierungsrahmens passt der Speicherbereiniger den Wert der scan_base-Variablen an den neuen Bereich der unterbrechungsfreien Aktivierungsrahmen an, die noch gescannt werden müssen (454). Wenn nach dem Scannen eines Aktivierungsrahmens in diesem Thread keine Aktivierungsrahmen mehr zu scannen sind (455), überschreibt der Speicherbereiniger das LRSave-Feld für den Aufrufer des aktuellen Vanguard-Verfahrens des Threads, so dass die Steuerung zum ursprünglichen Aufrufer des Vanguard-Verfahrens zurückkehrt und nicht zum Trampolin-Unterprogramm, wenn das Vanguard-Verfahren zurückkehrt (456). Der Speicherbereiniger 142 kommt häufig Zurückstellungsanforderungen nach, so dass Prozess-Threads mit höherer Priorität, die zur Ausführung bereit sind, schnell auf CPU 102 zugreifen können, um ihre Arbeit zügig zu vollenden (458).
  • Wenn das Vanguard-Verfahren die Steuerung zurückgibt, wird eine Sonderbehandlung bereitgestellt. Anstatt direkt zu dem Verfahren zurückzukehren, das ursprünglich das Vanguard-Verfahren aufgerufen hat, kehrt die Steuerung zu einem speziellen Trampolin-Unterprogramm zurück, das durch das in 6 dargestellte Flussdiagramm wiedergegeben wird. Das Trampolin-Unterprogramm prüft, ob der Aktivierungsrahmen des Aufrufers bereits durch den Hintergrund-Speicherbereinigungs-Thread 480 gescannt wurde. Wenn der Rahmen des Aufrufers noch nicht gescannt wurde, scannt das Trampolin-Unterprogramm den Aktivierungsrahmen 482 und passt den Wert der scan_top-Variablen des Thread-Deskriptors an, um den neu gescannten Aktivierungsrahmen als zu dem neu gewählten Vanguard-Verfahren gehörend zu identifizieren.
  • Für den Fall, dass das Trampolin-Unterprogramm den Aktivierungsrahmen des neu gewählten Vanguard-Verfahrens scannt, prüft das Trampolin-Unterprogramm weiter, ob der Aktivierungsrahmen des Aufrufers des neu gewählten Vanguard-Verfahrens ebenfalls gescannt werden muss 486. Wenn dies der Fall ist, veranlasst das Trampolin-Unterprogramm, dass dieser Aktivierungsrahmen gescannt wird, wenn die Steuerung von dem neu gewählten Vanguard-Verfahren zurückkehrt, indem es das LRSave-Feld und das TrueLRSave-Feld des unterbrechungsfreien Aktivierungsrahmens 488 des Aufrufers überschreibt.
  • Die letzte vom Trampolin-Unterprogramm ausgeführte Aktion besteht darin, die Steuerung an den Aufrufer des zuvor laufenden Verfahrens zurückzugeben, indem es zu der Adresse verzweigt, die im TrueLRSave-Feld des neuen aktuellen Aktivierungsrahmens vorgehalten wird.
  • Die Aktivierungsrahmen von Verfahren, die vom Prozess-Thread nach Beginn des Scannens des Programmstapels 114 aufgerufen werden, werden nicht gescannt. 7 stellt eine visuelle Darstellung eines Beispielszenarios des Programmstapel-Scans bereit, den der Prozess-Thread für die Speicherbereinigung durchführt. Der Programmstapel 114 umfasst unterbrechungsfreie Aktivierungsrahmen 510, die vom Speicherbereiniger 142 gescannt wurden. Die unterbrechungsfreien Aktivierungsrahmen 510 sind Verfahren zugehörig, die weitere Verfahren aufgerufen haben und darauf warten, dass die aufgerufenen Verfahren von ihrer Ausführung zurückkehren. Die weiteren aufgerufenen Verfahren umfassen das dem unterbrechungsfreien Aktivierungsrahmen 200 zugehörige Vanguard-Verfahren, wobei das Vanguard-Verfahren von dem Verfahren des Aufrufers aufgerufen wird, das dem unterbrechungsfreien Aktivierungsrahmen 205 des Aufrufers zugehörig ist. Darüber hinaus umfasst der Programmstapel 114 unterbrechungsfreie Aktivierungsrahmen 530, die Verfahren entsprechen, die von und nach der Vanguard-Methode aufgerufen werden. Die Reihenfolge, in der die Verfahren aufgerufen werden, wird durch die Reihenfolge der entsprechenden unterbrechungsfreien Aktivierungsrahmen wiedergegeben, die auf den Programmstapel 114 gelegt werden.
  • Parallel dazu scannt der Speicherbereiniger 142 die unterbrechungsfreien Aktivierungsrahmen 510 der einen oder mehreren Verfahren aus dem Prozess-Thread, für die er die Absicht zu scannen gemeldet hat, bei 450. Beispielsweise wird das Scannen als Hintergrundaktivität gleichzeitig mit dem Ausführen des Prozess-Threads durchgeführt.
  • Dementsprechend verwendet der Speicherbereiniger 142 den Prozess-Thread, um ein inkrementelles Scannen des Stapels durchzuführen, wobei der Prozess-Thread einen oder mehrere unterbrechungsfreie Aktivierungsrahmen scannt, während der Speicherbereiniger 142 im Wesentlichen gleichzeitig andere unterbrechungsfreie Aktivierungsrahmen im Stapel 114 scannt. Wie hier beschrieben, umfasst der Stapel 114 mehrere unterbrechungsfreie Aktivierungsrahmen, wobei jeder Rahmen einem jeweiligen Verfahrensaufruf durch das Computerprogramm entspricht, das von Computersystem 100 ausgeführt wird. Anders ausgedrückt erzeugt jeder Verfahrensaufruf im Prozess 112 einen entsprechenden unterbrechungsfreien Aktivierungsrahmen 200 im Programmierstapel 114 des Threads, der den Prozess 112 ausführt. In einem oder mehreren Beispielen hat jeder Prozess-Thread seinen eigenen Programmierstapel 114. Wenn ein Verfahren, z.B. Verfahren-3 (7), ein anderes Verfahren aufruft, z.B. Verfahren-4 (5), läuft Verfahren-3 erst, wenn die Steuerung von Verfahren-4 zurückkehrt. Der Aktivierungsrahmen von Verfahren-3 kann jedoch immer noch „aktive“ Zeiger enthalten. Dementsprechend muss der Speicherbereiniger 142 den unterbrechungsfreien Aktivierungsrahmen 200 von Verfahren-4 (Vanguard-Aktivierungsrahmen) und den unterbrechungsfreien Aktivierungsrahmen 205 von Verfahren-3 (Aufrufer-Aktivierungsrahmen) scannen. Dieses Scannen wird durchgeführt, um die aktiven Zeiger zu identifizieren, damit sie von der Speicherbereinigung verarbeitet werden können. Verfahren-4 wiederum kann andere Verfahren aufrufen, z.B. Verfahren-5, das wiederum Verfahren-6 aufruft. Speicherbereiniger 142 verschiebt dementsprechend aktive Objekte an aneinander angrenzende Plätze, so dass unbenutzte Objekte, die sich zwischen den aktiven Objekten befinden, zu einem einzigen großen freien Segment zusammengeführt werden können. Dadurch werden nachfolgende Speicherzuordnungsoperationen wesentlich effizienter. Ferner ist zu beachten, dass in dem oben beschriebenen Szenario, wenn Verfahren-4 Verfahren-5 aufruft, das Verfahren-6 aufruft, Verfahren-4 nicht mehr das „vorliegende“ Verfahren ist, weil Verfahren-6 das vorliegende Verfahren ist. Verfahren-4 ist immer noch das Vanguard-Verfahren, weil es das „vorderste“ Verfahren beim Scannen des Stapels ist. Andere Verfahren, die von dem Vanguard-Verfahren aufgerufen werden, müssen nicht gescannt werden. Auch wenn der Rahmen des Vanguard-Verfahrens gescannt wurde, ist das Vanguard-Verfahren immer noch am Scannen beteiligt.
  • Wie hier beschrieben, sollen die unterbrechungsfreien Aktivierungsrahmen 530, die dem Verfahren-5 und dem Verfahren-6 entsprechen, nicht gescannt werden, da sie nach dem Zurückstellungspunkt ausgelöst werden, welcher in diesem Fall aus einem Aufruf des Verfahrens-4 bestand. In diesem Beispiel beginnt der Speicherbereiniger 142 mit dem Scannen vom unteren Ende des Stapels 114, mit dem unterbrechungsfreien Aktivierungsrahmen für Verfahren-1, gefolgt von dem unterbrechungsfreien Aktivierungsrahmen für Verfahren-2 (510). Gleichzeitig übernimmt der Prozess-Thread die Verantwortung für das Scannen aller zuvor nicht gescannten Aktivierungsrahmen, die zu einem Verfahren gehören, das der Aufrufer des Vanguard-Verfahrens ist, wenn die Steuerung vom Vanguard-Verfahren zurückkehrt. Wenn das Vanguard-Verfahren zurückkehrt, bevor der Speicherbereiniger 142 den Aktivierungsrahmen für Verfahren-3 scannt, wird der unterbrechungsfreie Aktivierungsrahmen 205 für Verfahren-3 durch ein Trampolin-Unterprogramm (6) gescannt, zu dem die Steuerung übergeht, wenn das Vanguard-Verfahren zu der Adresse zurückkehrt, die im LRSave-Feld 220 des Aktivierungsrahmens 482 seines Aufrufers wiedergegeben ist. Alternativ kann der Speicherbereiniger den Aktivierungsrahmen 452 für Verfahren 3 scannen, bevor der Prozess-Thread von dem Vanguard-Verfahren zurückkehrt. Wenn der Speicherbereiniger 142 den unterbrechungsfreien Aktivierungsrahmen 205 für Verfahren-3 bereits zu dem Zeitpunkt gescannt hat, an dem der Prozess-Thread vom Vanguard-Verfahren zurückkehrt, führt der Prozess-Thread den Scan nicht erneut durch. Sobald diese Situation erkannt wird, gilt das gleichzeitige Scannen der unterbrechungsfreien Aktivierungsrahmen als ausgeführt.
  • Das Scannen der unterbrechungsfreien Aktivierungsrahmen durch den Speicherbereiniger 142 umfasst ein Auffinden der aktuell aktiven Zeiger für jeden gescannten Aktivierungsrahmen. Bezugnehmend auf 4 sucht der Speicherbereiniger 142 die aktiven Zeiger des unterbrechungsfreien Aktivierungsrahmens 200, indem er das Methodimplementation-Objekt sucht, das den aktuellen Zustand des PointerVariablePreemptionSaveArea des Aktivierungsrahmens beschreibt, indem er den Wert des InvokedMethodlmplementation-Feldes 210 aus dem Aktivierungsrahmen 205 des Aufrufers abruft, bei 434. Das InvokedMethodlmplementation-Feld 210 im unterbrechungsfreien Aktivierungsrahmen 205 speichert die Adresse des Methodlmplementation-Objekts, das das Verfahren beschreibt, das zuletzt von Verfahren-3 aufgerufen wurde. Ferner wird der Wert des LRSave-Feldes 220 des unterbrechungsfreien Aktivierungsrahmens 200 des Vanguard-Verfahrens in Kombination mit den im Methodlmplementation-Objekt gespeicherten Informationen verwendet, um zu ermitteln, welche Slots innerhalb des PointerVariablePreemptionSaveArea 230 aktive Zeiger für diesen bestimmten Zurückstellungspunkt enthalten, bei 434.
  • Die Scan-Aktivitäten des Speicherbereinigers 142 (450) treffen schließlich mit den Selbst-Scan-Aktivitäten des Prozess-Threads zusammen, bei 455. Wenn der Speicherbereiniger 142 feststellt, dass alle unterbrechungsfreien Aktivierungsrahmen des Thread-Stapels gescannt wurden, überschreibt er das LRSave-Feld 240 dieses unterbrechungsfreien Aktivierungsrahmens mit dem aktuellen Inhalt seines TrueLRSave-Feldes 220, bei 455 und 456. An diesem Punkt betrachtet der Speicherbereiniger 142 den Scan des Stapels 114 des Prozess-Threads als vollständig ausgeführt. Andernfalls fährt der Speicherbereiniger 142 mit dem Scannen anderer unterbrechungsfreier Aktivierungsrahmen 205 im Programmierstapel 114 fort. Im Allgemeinen kann der Speicherbereiniger 142 seine aktuelle Ausführung erst dann beenden, wenn die Stapel 114 aller Prozess-Threads vollständig gescannt worden sind.
  • Die hier beschriebenen technischen Lösungen ermöglichen eine unterbrechungsfreie Speicherbereinigung in einer Computerprogrammiersprache wie Java. Die unterbrechungsfreie Speicherbereinigung wird durch unterbrechungsfreie Aktivierungsrahmen ermöglicht. Ein unterbrechungsfreier Aktivierungsrahmen umfasst einen festen Platz am oberen Ende für ein Vorhalten lokaler Zeigerwerte, die vom Prozess-Thread und den Speicherbereinigung-Threads gemeinsam genutzt werden, darunter ein Methodimplementation-Objektzeiger. Die Prozess-Threads speichern die lokalen Zeigerwerte an zurückstellungssicheren Punkten, die von einem Compiler festgelegt werden, und entnehmen sie dort wieder. Jeder Verfahrensaufruf wird als Zurückstellungspunkt behandelt. Der Prozess-Thread unterstützt die Speicherbereinigung durch Scannen des Aktivierungsrahmens des Aufrufers bei der Rückkehr vom Vanguard-Verfahren eines bestimmten Prozess-Threads. Der Methodimplementation-Objektzeiger stellt Stacktrace-Informationen bereit, die in eine Ausnahme eingebettet werden können. Das Methodlmplementation-Objekt beschreibt den Zustand des „Pointer Variable Preemption Save Area“ an jedem Zurückstellungspunkt.
  • Die hier beschriebenen technischen Lösungen ermöglichen dementsprechend eine Verbesserung der Speicherbereinigungs-Computerprogrammiersprachen, um hochleistungsfähige zeitkritische Anwendungen zu implementieren, die eine unterbrechungsfreie Speicherbereinigung auf der Grundlage eines inkrementellen Scannens von Stapeln verwenden. Durch die Verwendung der hier beschriebenen unterbrechungsfreien Aktivierungsrahmen für das Durchführen einer unterbrechungsfreien Speicherbereinigung ermöglichen die hier beschriebenen technischen Lösungen eine zeitkritische Anwendungs-Thread-Leistung im Wesentlichen innerhalb von 10 % herkömmlicher Threads, und es können Zurückstellungslatenzen von nur 10 µs erreicht werden.
  • Bei den vorliegenden technischen Lösungen kann es sich um ein System, ein Verfahren und/oder ein Computerprogrammprodukt auf jeder möglichen technischen Detailstufe der Integration handeln. Das Computerprogrammprodukt kann (ein) durch einen Computer lesbare(s) Speichermedium (oder -medien) umfassen, auf dem/denen durch einen Computer lesbare Programmanweisungen gespeichert ist/sind, um einen Prozessor dazu zu veranlassen, Aspekte der vorliegenden technischen Lösungen auszuführen.
  • Bei dem durch einen Computer lesbaren Speichermedium kann es sich um eine physische Einheit handeln, die Anweisungen zur Verwendung durch ein System zur Ausführung von Anweisungen behalten und speichern kann. Bei dem durch einen Computer lesbaren Speichermedium kann es sich zum Beispiel um eine elektronische Speichereinheit, eine magnetische Speichereinheit, eine optische Speichereinheit, eine elektromagnetische Speichereinheit, eine Halbleiterspeichereinheit oder jede geeignete Kombination daraus handeln, ohne auf diese beschränkt zu sein. Zu einer nicht erschöpfenden Liste spezifischerer Beispiele des durch einen Computer lesbaren Speichermediums gehören die folgenden: eine tragbare Computerdiskette, eine Festplatte, ein Direktzugriffsspeicher (RAM), ein Nur-Lese-Speicher (ROM), ein löschbarer programmierbarer Nur-Lese-Speicher (EPROM bzw. Flash-Speicher), ein statischer Direktzugriffsspeicher (SRAM), ein tragbarer Kompaktspeicherplatte-Nur-Lese-Speicher (CD-ROM), eine DVD (digital versatile disc), ein Speicher-Stick, eine Diskette, eine mechanisch codierte Einheit wie zum Beispiel Lochkarten oder erhabene Strukturen in einer Rille, auf denen Anweisungen gespeichert sind, und jede geeignete Kombination daraus. Ein durch einen Computer lesbares Speichermedium soll in der Verwendung hierin nicht als flüchtige Signale an sich aufgefasst werden, wie zum Beispiel Funkwellen oder andere sich frei ausbreitende elektromagnetische Wellen, elektromagnetische Wellen, die sich durch einen Wellenleiter oder ein anderes Übertragungsmedium ausbreiten (z.B. ein Lichtwellenleiterkabel durchlaufende Lichtimpulse) oder durch einen Draht übertragene elektrische Signale.
  • Hierin beschriebene, durch einen Computer lesbare Programmanweisungen können von einem durch einen Computer lesbaren Speichermedium auf jeweilige Datenverarbeitungs-/Verarbeitungseinheiten oder über ein Netzwerk wie zum Beispiel das Internet, ein lokales Netzwerk, ein Weitverkehrsnetz und/oder ein drahtloses Netzwerk auf einen externen Computer oder eine externe Speichereinheit heruntergeladen werden. Das Netzwerk kann Kupferübertragungskabel, Lichtwellenübertragungsleiter, drahtlose Übertragung, Leitwegrechner, Firewalls, Vermittlungseinheiten, Gateway-Computer und/oder Edge-Server aufweisen. Eine Netzwerkadapterkarte oder Netzwerkschnittstelle in jeder Datenverarbeitungs-/Verarbeitungseinheit empfängt durch einen Computer lesbare Programmanweisungen aus dem Netzwerk und leitet die durch einen Computer lesbaren Programmanweisungen zur Speicherung in einem durch einen Computer lesbaren Speichermedium innerhalb der entsprechenden Datenverarbeitungs-/Verarbeitungseinheit weiter.
  • Bei durch einen Computer lesbaren Programmanweisungen zum Ausführen von Arbeitsschritten der vorliegenden technischen Lösungen kann es sich um Assembler-Anweisungen, ISA-Anweisungen (Instruction-Set-Architecture), Maschinenanweisungen, maschinenabhängige Anweisungen, Mikrocode, Firmware-Anweisungen, zustandssetzende Daten, Konfigurationsdaten für integrierte Schaltungen oder entweder Quellcode oder Objektcode handeln, die in einer beliebigen Kombination aus einer oder mehreren Programmiersprachen geschrieben werden, darunter objektorientierte Programmiersprachen wie Smalltalk, C++ o.ä. sowie herkömmliche prozedurale Programmiersprachen wie die Programmiersprache „C“ oder ähnliche Programmiersprachen. Die durch einen Computer lesbaren Programmanweisungen können vollständig auf dem Computer des Benutzers, teilweise auf dem Computer des Benutzers, als eigenständiges Software-Paket, teilweise auf dem Computer des Benutzers und teilweise auf einem fernen Computer oder vollständig auf dem fernen Computer oder Server ausgeführt werden. In letzterem Fall kann der entfernt angeordnete Computer mit dem Computer des Benutzers durch eine beliebige Art Netzwerk verbunden sein, darunter ein lokales Netzwerk (LAN) oder ein Weitverkehrsnetz (WAN), oder die Verbindung kann mit einem externen Computer hergestellt werden (zum Beispiel über das Internet unter Verwendung eines Internet-Dienstanbieters). In einigen Ausführungsformen können elektronische Schaltungen, darunter zum Beispiel programmierbare Logikschaltungen, vor Ort programmierbare Gatter-Anordnungen (FPGA, field programmable gate arrays) oder programmierbare Logikanordnungen (PLA, programmable logic arrays) die durch einen Computer lesbaren Programmanweisungen ausführen, indem sie Zustandsinformationen der durch einen Computer lesbaren Programmanweisungen nutzen, um die elektronischen Schaltungen zu personalisieren, um Aspekte der vorliegenden technischen Lösungen durchzuführen.
  • Aspekte der vorliegenden technischen Lösungen sind hierin unter Bezugnahme auf Ablaufpläne und/oder Blockschaltbilder bzw. Schaubilder von Verfahren, Vorrichtungen (Systemen) und Computerprogrammprodukten gemäß Ausführungsformen der technischen Lösungen beschrieben. Es wird darauf hingewiesen, dass jeder Block der Ablaufpläne und/oder der Blockschaltbilder bzw. Schaubilder sowie Kombinationen von Blöcken in den Ablaufplänen und/oder den Blockschaltbildern bzw. Schaubildern mittels durch einen Computer lesbare Programmanweisungen ausgeführt werden können.
  • Diese durch einen Computer lesbaren Programmanweisungen können einem Prozessor eines Universalcomputers, eines Spezialcomputers oder einer anderen programmierbaren Datenverarbeitungsvorrichtung bereitgestellt werden, um eine Maschine zu erzeugen, so dass die über den Prozessor des Computers bzw. der anderen programmierbaren Datenverarbeitungsvorrichtung ausgeführten Anweisungen ein Mittel zur Umsetzung der in dem Block bzw. den Blöcken der Ablaufpläne und/oder der Blockschaltbilder bzw. Schaubilder festgelegten Funktionen/Schritte erzeugen. Diese durch einen Computer lesbaren Programmanweisungen können auch auf einem durch einen Computer lesbaren Speichermedium gespeichert sein, das einen Computer, eine programmierbare Datenverarbeitungsvorrichtung und/oder andere Einheiten so steuern kann, dass sie auf eine bestimmte Art funktionieren, so dass das durch einen Computer lesbare Speichermedium, auf dem Anweisungen gespeichert sind, ein Herstellungsprodukt aufweist, darunter Anweisungen, welche Aspekte der/des in dem Block bzw. den Blöcken des Ablaufplans und/oder der Blockschaltbilder bzw. Schaubilder angegebenen Funktion/Schritts umsetzen.
  • Die durch einen Computer lesbaren Programmanweisungen können auch auf einen Computer, eine andere programmierbare Datenverarbeitungsvorrichtung oder eine andere Einheit geladen werden, um das Ausführen einer Reihe von Prozessschritten auf dem Computer bzw. der anderen programmierbaren Vorrichtung oder anderen Einheit zu verursachen, um einen auf einem Computer ausgeführten Prozess zu erzeugen, so dass die auf dem Computer, einer anderen programmierbaren Vorrichtung oder einer anderen Einheit ausgeführten Anweisungen die in dem Block bzw. den Blöcken der Ablaufpläne und/oder der Blockschaltbilder bzw. Schaubilder festgelegten Funktionen/Vorgänge umsetzen.
  • Die Ablaufpläne und die Blockschaltbilder bzw. Schaubilder in den Figuren veranschaulichen die Architektur, die Funktionalität und den Betrieb möglicher Ausführungen von Systemen, Verfahren und Computerprogrammprodukten gemäß verschiedenen Ausführungsformen der vorliegenden technischen Lösungen. In diesem Zusammenhang kann jeder Block in den Ablaufplänen oder Blockschaltbildern bzw. Schaubildern ein Modul, ein Segment oder einen Teil von Anweisungen darstellen, die eine oder mehrere ausführbare Anweisungen zur Ausführung der bestimmten logischen Funktion(en) aufweisen. In einigen alternativen Ausführungen können die in den Blöcken angegebenen Funktionen in einer anderen Reihenfolge als in den Figuren gezeigt stattfinden. Zwei nacheinander gezeigte Blöcke können zum Beispiel in Wirklichkeit im Wesentlichen gleichzeitig ausgeführt werden, oder die Blöcke können manchmal je nach entsprechender Funktionalität in umgekehrter Reihenfolge ausgeführt werden. Es ist ferner anzumerken, dass jeder Block der Blockschaltbilder bzw. Schaubilder und/oder der Ablaufpläne sowie Kombinationen aus Blöcken in den Blockschaltbildern bzw. Schaubildern und/oder den Ablaufplänen durch spezielle auf Hardware beruhende Systeme umgesetzt werden können, welche die festgelegten Funktionen oder Schritte durchführen, oder Kombinationen aus Spezial-Hardware und Computeranweisungen ausführen.
  • Eine zweite Aktion kann als „in Reaktion auf“ eine erste Aktion bezeichnet werden, unabhängig davon, ob sich die zweite Aktion direkt oder indirekt aus der ersten Aktion ergibt. Die zweite Aktion kann zu einem wesentlich späteren Zeitpunkt erfolgen als die erste Aktion und immer noch eine Reaktion auf die erste Aktion sein. In ähnlicher Weise kann man die zweite Aktion als eine Reaktion auf die erste Aktion bezeichnen, auch wenn zwischen der ersten und der zweiten Aktion Zwischenaktionen stattfinden, und selbst dann, wenn eine oder mehrere der Zwischenaktionen direkt ein Durchführen der zweiten Aktion bewirken. Beispielsweise kann eine zweite Aktion als Reaktion auf eine erste Aktion erfolgen, wenn die erste Aktion eine Markierung setzt und eine dritte Aktion später die zweite Aktion immer dann auslöst, wenn die Markierung gesetzt wird.
  • Zur Klarstellung der Verwendung folgender Formulierungen und zur Bereitstellung von Informationen für die Öffentlichkeit sind die Formulierungen „mindestens einer von <A>, <B>, ... und <N>“ oder „mindestens einer von <A>, <B>, ... <N> oder Kombinationen davon“ oder „<A>, <B> und/oder <N>“ im weitesten Sinne auszulegen und ersetzen, sofern nicht ausdrücklich das Gegenteil erklärt wird, alle anderen impliziten Definitionen, die vorstehend oder nachstehend aufgeführt sind, um ein oder mehrere Elemente aus der Gruppe bestehend aus A, B, ... und N zu bezeichnen. Anders ausgedrückt bedeuten die Formulierungen jede Kombination eines oder mehrerer der Elemente A, B, ... oder N, darunter jedes dieser Elemente für sich genommen oder das eine Element in Kombination mit einem oder mehreren der anderen Elemente, wobei darunter auch zusätzliche, nicht aufgeführte Elemente in Kombination vorhanden sein können.
  • Es ist auch zu berücksichtigen, dass alle hier beispielhaft beschriebenen Module, Einheiten, Komponenten, Server, Computer, Endgeräte oder Einheiten, die Befehle ausführen, computerlesbare Medien wie Speichermedien, Computerspeichermedien oder Datenspeichereinheiten (wechselbar und/oder nicht wechselbar) wie beispielsweise Magnetplatten, optische Platten oder Bänder umfassen oder anderweitig Zugriff darauf haben können. Computerspeichermedien können flüchtige und nichtflüchtige, wechselbare und nicht wechselbare Medien umfassen, die in einem beliebigen Verfahren oder einer beliebigen Technologie zum Speichern von Informationen implementiert sind, z.B. computerlesbare Befehle, Datenstrukturen, Programmmodule oder andere Daten. Solche Computerspeichermedien können Teil der Einheit sein oder darauf zugreifen oder daran angeschlossen sein. Jede hierin beschriebene Anwendung oder jedes hierin beschriebene Modul kann mittels computerlesbarer/ausführbarer Befehle implementiert werden, die auf solchen computerlesbaren Medien gespeichert oder anderweitig vorgehalten werden können.

Claims (9)

  1. Verfahren für unterbrechungsfreie Speicherbereinigung, wobei das Verfahren aufweist: Scannen, durch einen Speicherbereiniger (142), eines ersten unterbrechungsfreien Aktivierungsrahmens (200), der einem ersten Verfahren aus einem Prozess (112) zugehörig ist, wobei der erste unterbrechungsfreie Aktivierungsrahmen (200) unter Verwendung eines Prozess-Threads gescannt wird, der gerade den Prozess (112) ausführt; Scannen, durch den Speicherbereiniger (142), eines zweiten unterbrechungsfreien Aktivierungsrahmens (205), der einem zweiten Verfahren aus dem Prozess (112) zugehörig ist, der gerade vom Prozess-Thread ausgeführt wird, wobei der zweite unterbrechungsfreie Aktivierungsrahmen (205) durch einen Speicherbereiniger-Thread gescannt wird, wobei: Scannen eines unterbrechungsfreien Aktivierungsrahmens ein Untersuchen und Überschreiben eines oder mehrerer aktiver Zeiger von einem Verfahren umfasst, das dem zu scannenden unterbrechungsfreien Aktivierungsrahmen entspricht.
  2. Verfahren nach Anspruch 1, wobei das zweite Verfahren das erste Verfahren aufruft.
  3. Verfahren nach Anspruch 1, wobei es sich bei dem zweiten unterbrechungsfreien Aktivierungsrahmen (205) um eine Mehrzahl von unterbrechungsfreien Aktivierungsrahmen handelt.
  4. Verfahren nach Anspruch 1, wobei der Prozess-Thread den ersten unterbrechungsfreien Aktivierungsrahmen (200) im Wesentlichen zu demselben Zeitpunkt scannt, zu dem der Speicherbereiniger-Thread den zweiten unterbrechungsfreien Aktivierungsrahmen (205) scannt.
  5. Verfahren nach Anspruch 1, wobei ein unterbrechungsfreier Aktivierungsrahmen für ein Verfahren einen Objektzeiger (210) auf ein Objekt umfasst, das symbolische Informationen wiedergibt, die einem dritten Verfahren zugehörig sind, das durch dieses Verfahren aufgerufen wird.
  6. Verfahren nach Anspruch 1, wobei ein unterbrechungsfreier Aktivierungsrahmen für ein Verfahren einen Zeiger umfasst, der eine Rückkehradresse (220) zu einem Verfahren anzeigt, das dieses Verfahren aufgerufen hat.
  7. Verfahren nach Anspruch 1, wobei ein unterbrechungsfreier Aktivierungsrahmen für ein Verfahren einen Pointer-Variable-Preemption-Save Area (230) umfasst, der einen Wert jedes aktiven Zeigers in diesem Verfahren speichert.
  8. System (100), das geeignete Mittel zum Ausführen aller Schritte des Verfahrens nach einem der vorhergehenden Verfahrensansprüche aufweist.
  9. Computerprogramm, das Anweisungen zum Ausführen aller Schritte des Verfahrens nach einem der vorhergehenden Verfahrensansprüche aufweist, wenn das Computerprogramm auf einem Computersystem (100) ausgeführt wird.
DE112019001821.3T 2018-06-25 2019-06-18 Verfahren und vorrichtung zur wiedergabe eines aktivierungsrahmens für unterbrechungsfreie speicherbereinigung (pause-less garbage collection) Active DE112019001821B4 (de)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US16/017,107 US10459656B1 (en) 2018-06-25 2018-06-25 Method and apparatus to represent activation frame for pause-less garbage collection
US16/017,107 2018-06-25
PCT/IB2019/055073 WO2020003050A1 (en) 2018-06-25 2019-06-18 Method and apparatus to represent activation frame for pause-less garbage collection

Publications (2)

Publication Number Publication Date
DE112019001821T5 DE112019001821T5 (de) 2021-01-21
DE112019001821B4 true DE112019001821B4 (de) 2022-04-21

Family

ID=68314973

Family Applications (1)

Application Number Title Priority Date Filing Date
DE112019001821.3T Active DE112019001821B4 (de) 2018-06-25 2019-06-18 Verfahren und vorrichtung zur wiedergabe eines aktivierungsrahmens für unterbrechungsfreie speicherbereinigung (pause-less garbage collection)

Country Status (6)

Country Link
US (2) US10459656B1 (de)
JP (1) JP7304119B2 (de)
CN (1) CN112219196B (de)
DE (1) DE112019001821B4 (de)
GB (1) GB2586769B (de)
WO (1) WO2020003050A1 (de)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11132294B2 (en) * 2019-03-28 2021-09-28 International Business Machines Corporation Real-time replicating garbage collection
US10936483B2 (en) 2019-04-15 2021-03-02 International Business Machines Corporation Hybrid garbage collection
US11550714B2 (en) 2019-04-15 2023-01-10 International Business Machines Corporation Compiling application with multiple function implementations for garbage collection
US11620215B2 (en) 2019-06-26 2023-04-04 International Business Machines Corporation Multi-threaded pause-less replicating garbage collection

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100114998A1 (en) 2008-10-30 2010-05-06 Microsoft Corporation Incremental lock-free stack scanning for garbage collection

Family Cites Families (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5848423A (en) * 1997-04-23 1998-12-08 Sun Microsystems, Inc. Garbage collection system and method for locating root set pointers in method activation records
US6049810A (en) * 1997-04-23 2000-04-11 Sun Microsystems, Inc. Method and apparatus for implementing a write barrier of a garbage collected heap
US5873105A (en) 1997-06-26 1999-02-16 Sun Microsystems, Inc. Bounded-pause time garbage collection system and method including write barrier associated with a source instance of a partially relocated object
US6308319B1 (en) 1999-02-22 2001-10-23 Sun Microsystems, Inc. Thread suspension system and method using trapping instructions in delay slots
US6249793B1 (en) 1999-06-10 2001-06-19 Sun Microsystems, Inc. Mostly concurrent compaction in a garbage collection system
US6381738B1 (en) 1999-07-16 2002-04-30 International Business Machines Corporation Method for optimizing creation and destruction of objects in computer programs
US6625808B1 (en) * 1999-12-10 2003-09-23 Microsoft Corporation Method and apparatus for facilitating memory management in a program comprised of heterogeneous components
US6484188B1 (en) 1999-12-30 2002-11-19 Intel Corporation Optimization of garbage collection code in the context of raw native interface function calls in the java programming language
JP4569926B2 (ja) * 2003-06-30 2010-10-27 パナソニック株式会社 ガーベジコレクションシステム
WO2006069484A1 (en) * 2004-12-30 2006-07-06 Intel Corporation Methods and apparatuses to maintain multiple execution contexts
US7548940B2 (en) 2005-06-10 2009-06-16 International Business Machines Corporation Generational real-time garbage collection
CN101046755B (zh) * 2006-03-28 2011-06-15 郭明南 一种计算机自动内存管理的系统及方法
JP2009266113A (ja) 2008-04-28 2009-11-12 Internatl Business Mach Corp <Ibm> メモリ管理方法およびシステム
US8065349B2 (en) * 2008-06-30 2011-11-22 Oracle America, Inc. Method and apparatus for performing concurrent garbage collection
CN101706756A (zh) * 2009-12-10 2010-05-12 金蝶软件(中国)有限公司 一种元数据的缓存方法及装置
US8862640B2 (en) * 2011-04-25 2014-10-14 Microsoft Corporation Conservative garbage collecting and tagged integers for memory management
US9229858B2 (en) * 2013-10-08 2016-01-05 Red Hat, Inc. Concurrent garbage collector thread
CN103577335B (zh) * 2013-10-23 2016-09-07 中国科学院计算技术研究所 一种内存垃圾回收系统及方法
JP5889270B2 (ja) * 2013-12-13 2016-03-22 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation スタック・スキャンのコストを削減するための方法、プログラム及びシステム

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100114998A1 (en) 2008-10-30 2010-05-06 Microsoft Corporation Incremental lock-free stack scanning for garbage collection

Also Published As

Publication number Publication date
JP7304119B2 (ja) 2023-07-06
US10459656B1 (en) 2019-10-29
GB202019822D0 (en) 2021-01-27
JP2021530756A (ja) 2021-11-11
US20190391753A1 (en) 2019-12-26
US10831400B2 (en) 2020-11-10
GB2586769B (en) 2021-08-04
CN112219196A (zh) 2021-01-12
DE112019001821T5 (de) 2021-01-21
GB2586769A (en) 2021-03-03
CN112219196B (zh) 2023-12-26
WO2020003050A1 (en) 2020-01-02

Similar Documents

Publication Publication Date Title
DE112019001821B4 (de) Verfahren und vorrichtung zur wiedergabe eines aktivierungsrahmens für unterbrechungsfreie speicherbereinigung (pause-less garbage collection)
DE69738101T2 (de) Verwaltung des Zugangs zu Objekten mit Hilfe von Referenzen mit drei Zuständen
DE102010051477B4 (de) Verfahren in einer computerplattform sowie computerplattform zum gemeinsamen benutzen von virtuellen speicherbasierten mehrversionsdaten zwischen den verschiedenartigen prozessoren der computerplattform
DE112012000693B4 (de) Ausführen einer Vielzahl von Instanzen einer Anwendung
DE112017001027B4 (de) Seitenfehlerbehebung
DE202010017613U1 (de) Datenspeichervorrichtung mit host-gesteuerter Speicherbereinigung
DE112012000635T5 (de) Dynamische Speicherverwaltung in einer virtualisierten Datenverarbeitungsumgebung
DE202012013432U1 (de) Speichern von Daten auf Speicherknoten
DE202010017665U1 (de) Datenverteilung bei einer Datenspeichervorrichtung mit Flash-Speicherchips
DE112013000656T5 (de) System und Verfahren zum Verringern der Speichernutzung durch optimales Platzieren von virtuellen Maschinen in einem virtualisierten Rechenzentrum
DE60034702T2 (de) Verfahren und vorrichtung zur verbesserung der wirksamkeit von kopierender speicherbereinigung
DE102015007709A1 (de) Invalidationsdatenbereich für einen Cache
DE112018005898T5 (de) Dynamische bereitstellung von software-funktionen
DE102013200508A1 (de) Ersetzungsreihenfolge von Cache-Sets auf der Grundlage von zeitbezogener Set-Aufzeichnung
EP1639475B1 (de) Prozessorarchitektur für exakte zeigeridentifizierung
DE112011103406T5 (de) Verwaltung von nicht geänderten Objekten
DE112020000865T5 (de) Speicherverwaltungssystem
DE102021131418A1 (de) Dedizierte registerdatei mit begrenzungsinformationen zum schützen vor speicherreferenzen ausserhalb der begrenzungen
DE112016003466T5 (de) Vorinstallieren von Seitentabellen-Cachezeilen einer virtuellen Maschine
DE19600428C2 (de) Vorrichtung und Verfahren zum Reduzieren eines durch einen Prozeß verwendeten tatsächlichen Arbeitssatzes eines Prozesses in einem Computersystem mit virtuellem Speicher
DE102012221261A1 (de) Verfahren zum Zwischenspeichern und System zum Ausführen des Verfahrens zum Zwischenspeichern zum Betreiben eines mindestens einen Host-Computer aufweisenden Computerserversystems
DE112019000402T5 (de) Chronologisch geordnetes out-of-place-aktualisierungs-schlüssel-wert-speichersystem
DE112012002562T5 (de) Unterbringung von Daten in Partitionen auf einer Speichereinheit
DE112016000776T5 (de) Effiziente Durchführung von Einfüge- und Punktabfrage-Operationen in einem Spaltenspeicher
DE60318993T2 (de) Eingebettete Speicherbereinigung

Legal Events

Date Code Title Description
R012 Request for examination validly filed
R016 Response to examination communication
R018 Grant decision by examination section/examining division
R084 Declaration of willingness to licence
R020 Patent grant now final