RAMS Konzepte
Relokierbare oder relative Zeiger
Problemstellung
In vielen UNIX-Systemen und MACH gibt es einen Memory-Map-Aufruf
mmap(2) der eine ganze oder einen Teil einer Datei in den
Adressraum eines Prozesses bzw. eines sog. Teams abbildet.
Mit den großen Adressräumen von 32 oder gar 64 bit Adressen können
also Datenstrukturen uniform auf dem Massenspeicher wie im
Arbeitsspeicher
gehalten werden, d.h der Arbeitsspeicher dient als Cache für den Massenspeicher.
Arbeitet man aber nun mit Zeigern, so ist zu bedenken, daß
verschiedene Programme die selben Datenstrukturen auf verschiedene
Adressen abbilden wollen.
Innerhalb der Datei werden die Adressen also relativ gespeichert werden.
Die Lösung sind relokierbare Zeiger.
Ideen zu relokierbaren Zeigern
Die Zeiger bestehen aus 2 Komponenten: einen Offset und eine
Basisadresse.
Ebenso wie es das mmap erst für Codeseiten gab und es dann
sozusagen für Daten verallgemeinert wurde, so müßte auch ein
dynamischer Bindemechanismus aufgebohrt werden.
Anforderungen an relokierbare Zeiger
- Operationen wie normale Hauptspeicherzeiger
- Eine Zeigerarithmetik ist sicher einfach realisierbar
Eine Zuweisung an einen Zeiger müßte in die Komponenten
aufgespalten werden.
- Ein relokierbarer Zeiger, der sich in einer Datei befindet, darf
nicht aus seiner Datei herauszeigen.
- Wohl dürfen Zeiger in privaten Bereichen in andere Bereiche
hineinzeigen.
Weitere Ideen zu den relokierbaren Zeigern
- Implementierung von Transaktionskonzepten
- Wenn der Basisadressbestandteil atomar umgeschaltet wird, kann
eine neue und eine alte Kopie einer Speicherseite gehalten werden.
- In Verbindung mit virtuell gemeinsamen Speicher hat man dann
ein verteiltes Datenbanksystem
Implementierungsidee
Die Implementierung ist einfach realisierbar, wenn die Unterscheidung
tranistenter und persistenter Speicher beibehält und an das Iteratorkonzept
von Liskov/Gutag denkt:
- Im transistenten Speicher (ein schönes Wort für den Hauptspeicher)
werden die Iteratorzeiger gehalten.
- Im persistenten Speicher (herkömmlich durch Festplatten implementiert)
werden in den Daten nur die Offsetwerte gehalten.
In herkömmlichen Systemen wie UNIX entspricht das Positionieren dem
lseek(2)-Befehl. Wird ein Datenblock nur einmal gebraucht,
ist eine read(2) Operation sinnvoll, bei haeufigen Gebrauch
ist mmap(2) sinnvoll.
(Merke: Man soll sich nicht konzeptionell verkünsteln. Ich lange
gebraucht, bis ich auf diese einfache Idee gekommen bin.
Konzeptionelle Verkünstelungen führen bestimmt zu langsamen Forschungssystemen. RAMS soll aber praktisch verwertbar und effizient sein.)
Implementierungsversuch
RAMSpersito ist eine kleine Bibliothek,
die schon wesentliches realisiert.
download
Andere Arbeiten
- ACE
- in ACE sind die Relativen Zeiger die based Pointer. Die Grundidee
ist die selbe.
Allerdings verwaltet jeder Memorypool ein Repository, welche Zeiger
darauf zeigen.
Im RAMS wird hingegen strikt zwischen den transienten Iteratorzeigern und
den persisteten Offsets im Speicher unterschieden.
Bei einem etwaigen remapping, müßten die persistenten Offsets gleich bleiben ...
Rudolf Weber