-
Diese Erfindung bezieht sich auf
eine Anordnung und ein Verfahren für die Verwaltung eines Speichers in
einem Datenverarbeitungssystem.
-
Hintergrund
der Erfindung
-
In Datenverarbeitungssystemen besteht
eine allgemeine Notwendigkeit einer Speicherverwaltung, weil der
verfügbare
Speicherraum fragmentiert werden kann, während neue Daten gespeichert
und alte Daten aus einem Speicher gelöscht werden. Über eine
Zeitperiode kann dies zu einer Fragmentierung von neu gespeicherten
Daten mit einer entsprechenden Vergrößerung der Zeit führen, die
erforderlich ist, um diese Daten aus dem Speicher zurückzugewinnen.
Die übliche
Lösung
dieses Problems besteht darin, den Speicher über die Funktionsaufrufe brk,
sbrk, malloc, calloc, realloc, usw. zu verwalten. Die Funktionen
brk und sbrk sind Grundelemente der niedrigen Ebene, die zur dynamischen Änderung
des Speicherplatzes verwendet werden, der dem Datensegment oder
dem Speicher eines aufrufenden Prozesses zugeteilt wird. Diese letzteren
zwei Funktionen werden allgemein für heutige Systeme als zu primitiv
angesehen.
-
Heutige Anwendungen können die „Malloc"-Familie von Funktionsaufrufen
verwenden, um Speicherblöcke
zur Laufzeit zuzuteilen. Malloc verwendet sbrk oder brk zur Änderung
der Größe des verfügbaren Prozess-Speichers
und verwaltet den Speicher als eine Liste von zugeteilten und freien
Blöcken
von bestimmten Größen. Malloc
kann einer Anwendung bei Bedarf einen Speicherblock mit irgendeiner
Größe liefern.
Dies erfolgt durch Führen
einer Liste von freien Speicherblöcken und ihrer jeweiligen Größen, um
einen Block zurückzuliefern,
der zumindest so groß ist,
wie der von dem Benutzer angeforderte Block. Daher muss Malloc aus den
verfügbaren
Blöcken
diejenigen Blöcke
auswählen,
die für
die Zuteilung an die Anwendung am besten geeignet sind. Die Realisierung
der malloc-Familie
von Funktionen ist systemabhängig
und ändert
sich wahrscheinlich von Maschine zu Maschine.
-
Dieser Prozess leidet an dem Nachteil,
dass die Verwendung des Speichers wenig effizient sein kann, weil
es allgemein erforderlich ist, einen Speicherblock zuzuteilen, der
größer ist
als erforderlich, um eine ausreichende Kapazität sicherzustellen, weil irgendein
kleinerer verfügbarer
Block zu klein sein kann. Es ist weiterhin erforderlich, Prozessorzeit
bei der Suche und Identifikation von Blöcken mit passender Größe aufzuwenden,
bevor diese Blöcke
zugeteilt werden können.
-
Die US-A-5 493 652 beschreibt eine
Speicherverwaltungs-Anordnung zur Verwendung in einem Speicher,
wobei die Anordnung eine Speicherverwaltungsstruktur und einen Satz
von Speicherblöcken
einschließt, in
denen Daten unter der Steuerung der Verwaltungsstruktur gespeichert
werden können,
wobei die Speicherverwaltungs-Struktur einen ersten Verwaltungszeiger
und einen zweiten Verwaltungszeiger beinhaltet.
-
Die EP-A-0 439 920 offenbart ein
System und Verfahren zur Verwaltung von Speicher in einem Mikrocomputer,
das eine Zeigertabelle von sich ändernder
Länge an
einem Ende eines Datenspeicherbereiches zuteilt und in ähnlicher
Weise ein Datenfeld, das Datenblöcke
umfaßt,
an dem anderen Ende des Datenspeicherbereichs zuteilt, wobei Datenzeiger
in der Zeigertabelle auf die Speicherplätze der Datenblöcke zeigen,
und wenn die Datenblöcke
hinzugefügt
werden, so wachsen das Datenfeld und die Zeigertabelle in Richtung
aufeinander.
-
Zusammenfassung
der Erfindung
-
Ein Ziel der Erfindung besteht in
der weitgehenden Verringerung oder Beseitigung der Nachteile, die in
dem dritten vorhergehenden Absatz erläutert wurden.
-
Ein weiteres Ziel der Erfindung besteht
in der Schaffung einer verbesserten Anordnung und eines Verfahrens
für die
Speicherverwaltung und Zuteilung der Speicherkapazität.
-
Gemäß einem Gesichtspunkt der Erfindung
wird eine Speicherverwaltungsanordnung zur Verwendung in einem Speicher
geschaffen, wobei die Anordnung eine Speicherver waltungsstruktur
und einen Satz von Speicherblöcken
mit der gleichen Größe einschließt, in denen
Daten unter der Steuerung der Verwaltungsstruktur gespeichert werden
können,
wobei die Speicherverwaltungsstruktur einen ersten Verwaltungszeiger und
einen zweiten Verwaltungszeiger beinhaltet, dadurch gekennzeichnet,
dass die Speicherverwaltungsanordnung einen Stapel von Zeigern auf
freie Speicherblöcke
innerhalb des Satzes von Speicherblöcken einschließt, und
wobei der erste Verwaltungszeiger auf den Stapel von Zeigern zeigt,
und der zweite Verwaltungszeiger auf einen ersten Speicherblock
in dem Stapel zeigt, so dass sich eine automatische Zuteilung von Speicherblöcken ergibt.
-
Gemäß einem weiteren Gesichtspunkt
der Erfindung wird ein Verfahren zur Datenspeicherung in einer Speicherverwaltungsanordnung
zur Verwendung in einem Speicher geschaffen, wobei das Verfahren
eine Speicherverwaltungsstrukur und einen Satz von Speicherblöcken der
gleichen Größe einschließt, in denen
Daten unter der Steuerung der Verwaltungsstruktur gespeichert werden
können,
wobei das Verfahren die Bereitstellung eines ersten Verwaltungszeigers
und eines zweiten Verwaltungszeigers durch die Verwaltungsstruktur einschließt, wobei
das Verfahren dadurch gekennzeichnet ist, dass der Speicherverwaltungsanordnung
ein Stapel von Zeigern auf freie Speicherblöcke in dem Satz von Speicherblöcken bereitgestellt
wird, und die Speicherverwaltungsstruktur so angeordnet ist, dass
der erste Verwaltungszeiger auf den Stapel von Zeigern zeigt und
der zweite Verwaltungszeiger auf einen ersten Speicherblock in dem
Stapel von Zeigern zeigt, wodurch ein Verfahren zur automatischen
Zuteilung von Speicherblöcken
geschaffen wird.
-
Gemäß einem weiteren Gesichtspunkt
der Erfindung wird ein Verfahren zur Zuteilung von Sätzen von Speicherblöcken zur
Verwendung durch eine Anwendung während der Ausführung dieser
Anwendung geschaffen, wobei das Verfahren die Schaffung, über die
Anwendung, einer Speicherverwaltungsanordnung umfasst, die eine
Speicherverwaltungsstruktur und einen Satz von Speicherblöcken mit
der gleichen Größe umfasst,
in denen Daten unter der Steuerung der Verwaltungsstruktur gespeichert
werden können,
wobei die Speicherverwaltungsstruktur einen ersten Verwaltungszeiger
und einen zweiten Verwaltungszeiger beinhaltet, wobei das Verfahren
dadurch gekennzeichnet ist, dass die Speicherverwaltungsanordnung
so geschaffen wird, dass sie einen Stapel von Zeigern auf freie
Speicherblöcke
in dem Satz von Speicherblöcken
hat und so angeordnet ist, dass der erste Verwaltungszeiger auf
den Stapel von Zeigern zeigt und der zweite Verwaltungszeiger auf
einen ersten Speicherblock in dem Stapel von Zeigern zeigt, so dass
ein Verfahren zur automatischen Zuteilung von Speicherblöcken geschaffen
wird, wobei das Verfahren weiterhin dadurch gekennzeichnet ist,
dass die Anwendung eine Anzahl von Speicherverwaltungsanordnungen
schafft, wobei die Speicherverwaltungsanordnungen vor dem Ablauf
der Anwendung geschaffen werden und wobei jede dieser Speicherverwaltungsanordnungen
mit einer Speicherkapazität
versehen wird, die durch die Anwendung zum Zeitpunkt der Schaffung
der Verwaltungsanordnung bestimmt wird.
-
Die Speicherverwaltungsanordnung
verwaltet Speicherblöcke
lediglich der gleichen Größe. Daher
ist es nicht erforderlich, nach verfügbaren Blöcken zu suchen, um einen Block
mit der richtigen Größe zu finden. Insbesondere
ermöglicht
es die Anordnung einer Anwendung, eine Serie von vollständig getrennten
Listen von Speichern mit der gleichen Größe zu führen und einen schnellen Zugriff
auf diese Blöcke
auszuführen.
Zusätzlich
ermöglicht
es die Anordnung der Anwendung, den Speicher, den sie benötigt, zuzuteilen,
bevor sie diesen Speicher verwendet, statt die Zuteilung so lange
zu verzögern,
bis der Speicher tatsächlich
benötigt
wird. Die Anwendung bestimmt daher den Speicherbedarf vor der Laufzeit,
so dass eine passende Speicherkapazität für diese Anwendung zur Verwendung
während
der Ausführung
der Anwendung verfügbar
gemacht wird.
-
Die Speicherverwaltungsanordnung
hat den Nutzen einer verbesserten Betriebsleistung aufgrund der Einfachheit
ihres Algorithmus, der verringerten Speicherfragmentierung (das
heißt
Verwaltung des Speichers als eine Sammlung von kleineren und kleineren
Blöcken)
und der Fähigkeit,
die Speicherblöcke
der Anwendung zuzuteilen, bevor sie benötigt werden, wodurch die Notwendigkeit
eines dynamischen Zuteilung von Speicher während der Ausführung der
Anwendung verringert wird.
-
Kurze Beschreibung
der Zeichnungen
-
Ein Ausführungsbeispiel der Erfindung
wird nunmehr unter Bezugnahme auf die beigefügten Zeichnungen beschrieben,
in denen:
-
1 ein
schematisches Funktionsdiagramm der Speicherverwaltungsanordnung
ist, und
-
2 die
Datenstruktur in der Speicherverwaltungsanordnung nach 1 zeigt.
-
Beschreibung
einer bevorzugten Ausführungsform
-
Gemäß den Zeichnungen beinhaltet
die Speicherverwaltungsanordnung einen Speicher, der ausreichend
groß ist,
um die verwalteten Datenblöcke 11 aufzunehmen.
In dem Speicher sind diese Datenblöcke entweder belegt oder frei,
und freie Blöcke
sind entweder ungefüllt
oder mit Daten gefüllt,
die nicht mehr länger erforderlich
sind, so dass Raum zum Überschreiben
mit neuen Daten geschaffen wird. Ein Stapel von Zeigern 12 auf
diese freien Blöcke
wird geführt
und die Blöcke,
und die Blöcke
werden über
Auflege- und Abhebe- (push- und pop-) Operationen zugeteilt. Eine
Speicherverwaltungsstruktur 13 steuert den Zugang an die
Datenblöcke 11 über den
Zeigerstapel 12. Die Speicherverwaltungsstruktur nach 1 ist in dem Speicher als kontinuierlicher
Speicherblock dargestellt, wie dies in 2 gezeigt ist, wobei auf die Speicherverwaltungsstruktur 13 Datenblöcke 11 und
der Zeigerstapel 12 am Ende der Datenblöcke folgen.
-
Zweckmäßigerweise wird die Speicherverwaltung
in der C-Programmiersprache durch den Typ ON_Mm dargestellt. Dies
ist ein Zeiger auf die Struktur. ON_Mms werden von einer ON_mm_create
(Erzeugungs-) Funktion zurückgeliefert,
die von der Sprache bereitgestellt wird.
-
Die S_ON_Mm-Struktur ist wie folgt:
-
-
-
Das size- (Größen-) Feld ist die Anzahl von
Blöcken
in der Speicherverwaltungsstruktur, das blocksize-(Blockgrößen-)Feld
gibt die Größe jedes
einzelnen Blocks an. Das mm_grow-Feld wird zur Festlegung der Aktion
verwendet, die vorgenommen werden sollte, wenn die Speicherverwaltungsstruktur
keine verfügbaren
Blöcke
auf dem Stapel hat. Das mm stack-Feld der Struktur ist ein void
** und zeigt auf einen Teil des Speichers, der Zeiger auf derzeit
nicht zugeteilte Datenblöcke
enthält.
Das mm_stack_index-Feld ist der Offsetwert in den Stapelbereich
des nächsten
freien Blocks. mm_base ist der Zeiger auf den Speicherblock, von
dem die Datenblöcke
zugeteilt werden.
-
Die Reihenfolge der Felder in der
S_ON_Mm-Struktur ist kritisch. Das Speicherverwaltungsstruktur-Modul
nimmt an, dass das mm base-Feld das letzte Feld in der Struktur
ist. Auf diese Weise ist das mm-base-Feld die Adresse des ersten
Datenblocks in der Speicherverwaltungsstruktur. Die Hinzufügung von
Feldern nach dem mm base-Feld führt
wahrscheinlich zu Segmentierungsverletzungen und einem Fehlschlag
einer korrekte Funktionsweise der Speicherverwaltungsstruktur-Algorithmen.
-
Die Konstruktion der Speicherverwaltungsstruktur
beruht auf den Betriebsleistungs-Vorteilen,
die erzielt werden können,
durch
Zuteilen des zur Laufzeit verwendeten Speichers während der
Initialisierung, und
durch Verringern der Speicherfragmentierung
durch Verwalten großer
Speicherblöcke.
-
Jede Speicherverwaltungsanordnung,
die geschaffen wird, hat eine feste Blockgröße. Die Blockgröße und die
Anzahl von Blöcken
werden bei der Speicherverwaltungsstruktur-Schaffung (ON_mm_create) festgelegt,
zusammen mit dem Bool'schen
Wert grow, der das Verhalten der Speicherverwaltungsstruktur bestimmt, wenn
diese ihren Vorrat an verfügbaren
Blöcken
verbraucht hat. Ein abschließendes
Feld für
den ON_mm_create-Aufruf
ist der Namensparameter (name parameter), wobei dies lediglich dann
verwendet wird, wenn das Speicherverwaltungsstruktur-Modul unter
Definition der ON_MM_REPORT-Compiler-Flagge kompiliert wird.
-
Die bedingte ON_MM_REPORTS-Kompilations-Flagge
wird dazu verwendet, um es zu ermöglichen, dass zusätzliche
Informationen während
der RNI-Entwicklung zusammengestellt und berichtet werden. Zusätzliche
Felder werden zu der S_ON_Mm-Struktur
hinzugefügt,
um es zu ermöglichen,
dass Informationen über
einen Speicherverwaltungsstruktur-Namen die maximale zu erreichende
Größe und die
derzeitige Größe gespeichert
werden können,
um von der ON_mm_report-Funktion berichtet zu werden, die die gesamte
Statusinformation für
vorhandene Speicherverwaltungsstrukturen ausgibt, wenn sie aufgerufen
wird.
-
Zusätzlich werden, wenn die ON_MM_REPORT-Kompilierungs-Flagge
verwendet wird, ON_mm_pop und ON_mm_push als Funktionen und nicht
als Makros realisiert, um auf diese Weise die Fehlersuche und das
Warten des Codes zu unterstützen.
Es ist jedoch wichtig festzustellen, dass dies bedeutet, dass zwei
Versionen der push- (Auflege-) und pop- (Abhebe-) Funktionalität aufrechterhalten
werden.
-
Wenn die Speicherverwaltungsanordnung
geschaffen wird, wird ein Speicherblock mit der Größe
zugeteilt,
beispielsweise unter Verwendung von malloc. Dies gibt Raum für die S-ON-Mm-Datenstruktur, den Speicher
für die
Datenblöcke
und Raum für
den Stapel von freien Zeigern, der geführt wird. Dies ist in
2 gezeigt. Die Summe no_of_nodes-1
wird anstelle von no-of-nodes benötigt, weil der Zeiger mm_base
auf den ersten Knoten zeigt.
-
Eine Speicherverwaltungsstruktur
wird von ON_mm_pop und ON_mm_push manipuliert. Diese Funktionalität wird aus
Effizienzgründen
als Makros realisiert. Die verwendeten Algorithmen sind relativ
einfach.
-
ON_mm_pop – wird aufgerufen, wenn Speicher
zugeteilt wird (malloc)
- 1. Prüfe den Stapel-Index,
um festzustellen, ob es irgendwelche freien Blöcke gibt.
- 2. Wenn ein freier Block vorhanden ist, so bewege den Stapel-Zeiger
und liefere einen Zeiger auf den freien Block zurück.
- 3. Andernfalls prüfe,
ob die Speicherverwaltungsstruktur wachsen kann.
- 4. Wenn sie wachsen kann, so malloc einen neuen Block und liefere
dessen Adresse zurück
oder liefere NULL zurück,
wenn malloc fehlschlug.
- 5. Andernfalls liefere einen NULL-Zeiger zurück.
-
Es ist verständlich, dass die vorstehende
Beschreibung lediglich als Beispiel angegeben ist, und dass insbesondere
die Technik in keiner Weise auf die C-Programmiersprache beschränkt ist.
Die Anwender anderer Programmiersprachen kennen irgendwelche Modifikationen,
die erforderlich sind, um die Technik an diese Sprachen anzupassen.
-
Die Speicherverwaltung ergibt eine
Maßnahme
zur schnellen Zuteilung und Freigabe von Speicher in einem System.
Eine Anwendung ist in der Lage, viele Speicherverwaltungen zu schaffen,
die jeweils Speicherblöcke
mit einer festen Größe schaffen
und führen.
Die Anzahl und Größe der Speicherblöcke in einer
Speicherverwaltung wird durch die Anwendung konfiguriert. Die Speicherverwaltung
teilt alle die Speicherblöcke
in einem aneinandergrenzenden Teil von Speicher zu, wenn die Speicherverwaltung
geschaffen wird, und die Speicherverwaltung verwaltet dann diesen
Teil des Speichers. Die Speicherverwaltung führt einen Stapel von Zeigern
auf ihre freien Speicherblöcke.
Diese Blöcke
können
dann sehr schnell aufgelegt und von dem Stapel von freien Blöcken abgehoben
werden.
-
Die Vorteile, die die Speicherverwaltung
bietet, sind eine verringerte Systemspeicher-Fragmentierung, eine schnelle Speicherzuteilung
und die Zuteilung von Speicher zur System-Initialisierungszeit,
bevor die Anwendung diesen verwendet.
-
Die Speicherverwaltung kann in irgendwelchen
Systemen verwendet werden, die die dynamische Zuteilung von Speicherblöcken mit
fester Größe erfordern.
Insbesondere kann die Speicherverwaltung bei der Bereitstellung
einer Echtzeit-CORBA -(Gemeinsame Objektanforderungs-Vermittlungsarchitektur-)
Realisierung verwendet werden.