Left Up Right 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: 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