MAL-Homepage
Inhaltsverzeichnis
MAL Dokumentation: Poolsystem
1. EINFÜHRUNG
Das Poolsystem dient zum Speichern von Daten auf Externspeicher.
Sämtliche im MAL-System dauerhaft gespeicherten Daten (auch
MAL-Programme) sind in Pools untergebracht.
Verglichen mit der direkten Verwendung von Betriebsystemdateien
hat das Poolsystem zwei entscheidende Vorteile:
MAL-Homepage Inhaltsverzeichnis
2. VERBINDUNG ZWISCHEN BETRIEBSSYSTEM UND MAL
Auf Betriebsystemebene besteht ein Pool aus zwei Dateien:
Der Pooldatei und der Indexdatei. Auf MAL-Ebene wird ein
Pool durch einen 4 Zeichen langen Namen identifiziert. Die
Zuordnung zwischen beiden Systemen erfolgt durch einen
speziellen Dateneintrag im Vokabular, den sogenannten Poolhandle.
MAL-Homepage Inhaltsverzeichnis
3. POOLHANDLES
Die MAL-interne Adressierung eines Pools erfolgt über eine eigene Variable (=Poolhandle), die den Namen 'pool_xxxx' hat, wobei 'xxxx' für den entsprechenden Poolnamen steht.
Dieser Poolhandle enthält nebst dem physikalischen Dateinamen auch einen Puffer, in dem ein Teil oder alle Adressverweise gespeichert werden. Er wird beim Öffnen des Pools (siehe später) aktualisiert.
Das Erstellen eines Poolhandles geschieht mit dem Wort
create_pool_handle:
datname indname pufferl -> handle
"test.pl" "test.ix" 500 create_pool_handle >> pool_test
MAL-Homepage Inhaltsverzeichnis
4. EINRICHTEN DER POOLDATEIEN
Mit dem wort reset_pool
werden die Dateien für einen neuen Pool eingerichtet. Falls die Dateien
bereits vorhanden sind werden sie (ohne Warnung!) gelöscht.
Syntax:
poolname ->
Beispiel:
"test" reset_pool
Der Poolhandle muß zuvor mit
create_pool_handle
eingerichtet worden sein (siehe oben).
MAL-Homepage Inhaltsverzeichnis
5. ÖFFNEN UND SCHLIESSEN
Bevor auf einen Pool zugegriffen werden kann muß er geöffnet werden.
Beim Öffnen eines Pools werden die Dateien auf Betriebsystemebene
geöffnet und die Adressverweise in den Poolhandle geladen.
MAL-Homepage Inhaltsverzeichnis
6. AUS DER SICHT DES MAL-ANWENDERS
Am besten stellt man sich unter einem Pool einen Behälter vor, in
den die Stackeinträge eingeworfen werden. Damit man auf die
eingeworfenen Einträge wieder zugreifen kann, wird jeder mit
einem Bindfaden (=Poolverweis, Pooladresse oder Poolzeiger)
versehen. Die Enden dieser Bindfäden werden am MAL-Stack
als Stackeinträge zurückgelassen. Damit hat der Benutzer die
Möglichkeit verschiedenste Adressierungsstrukturen selbst zu gestalten.
MAL-Homepage Inhaltsverzeichnis
6.1. Adressierung von Pooleinträgen
Ein Poolverweis besteht aus dem Poolnamen (vier Zeichen)
und der Eintragsnummer. Mit dem Wort
poolentry>
können diese Werte eines Poolverweises gelesen werden.
poolverweis -> eintragsnummer poolname
Umgekehrt kann mit dem Wort poolentry
ein Poolverweis mit einem bestimmten Namen und
einer bestimmten Eintragsummer erzeugt werden.
eintragsummer
poolname -> poolverweis
Diese beiden Worte werden aber nur in Sonderfällen
benötigt, da man beim Eintragen eines Datensatzes in
einen Pool automatisch den entsprechenden Poolverweis
am Stack übergeben bekommt.
Die Eintragsnummer ist eine Zahl >=0 und stellt für jeden
Eintrag im Pool eine eindeutige Kennung dar. Sie wird beim
Schreiben eines Eintrags in den Pool vergeben und bleibt auf
Dauer gleich. Auch wenn der entsprechende Eintrag gelöscht
wird, wird seine Nummer nicht wieder vergeben. Eine
Adressierungsstruktur, die unter diesen Voraussetzungen
arbeitet ist wesentlich leichter zu realisieren, als eine, die
bei Veränderungen auch die Verweise korrigieren muß.
Beispiel:
Pool "test" einrichten und öffnen:
"xxx.pl" "xxx.ix" 500 create_pool_handle >> pool_test
"test" reset_pool
"test" wopen_pool
Eintrag schreiben
3 ramp "test" put
Probelesen
get .
[ 0 1 2 ]
Eintrag schreiben, überschreiben und probelesen:
3 ramp "test" put dup
"hallo" swap update get .
hallo
MAL-Homepage Inhaltsverzeichnis
6.2. Physikalische Nutzung der Pufferung
Der RAM-residente Adresspuffer im Poolhandle enthält Einträge
bestehend aus jeweils der Eintragsnummer und einer Adresse.
Die Adresse kann entweder direkt die Adresse des Eintrags in
der Pooldatei, oder die Adresse des Verweises in der Indexdatei sein.
Ersteres ist der Fall, wenn der Puffer mehr Einträge hat als Einträge
im Pool sind. Dann kann mit einem einzigen Dateizugriff auf den
Pooleintrag zugegriffen werden.
Andernfalls ist nur ein Teil der Eintragsnummern im Puffer vertreten.
Wenn z.B. 10-mal so viele Einträge im Pool sind, wie im Puffer
Platz haben, wird nur jede zehnte Indexadresse abgespeichert.
Nachdem die Eintragsnummern sowohl im Puffer als auch in der
Indexdatei geordnet sind, kann bei der Suche folgendermaße
vorgegangen werden:
MAL-Homepage Inhaltsverzeichnis
6.3. Die Speicherverwaltung
Als MAL-Anwender braucht man sich über die Speicherverwaltung
der Pools in der Regel keine Sorgen zu manchen. Die Platzreservierung
erfolgt automatisch. Es können auch kleine Einträge mit
update
ohne explizite Verlagerung vergrößert werden (physikalisch
werden die Einträge dann gestückelt).
Zu beachten ist allerdings, daß beim Löschen von Einträgen
kein Platz freigegeben wird, das heist, die Dateien nicht verkürzt
werden (auch nicht beim Verkürzen der Einträge mit
update).
Wird in einem Pool öfter gelöscht, so sollte eine
Garbadge-Collection (=Müll-Aufräumung) durchgeführt
werden oder (wie das z.B. beim Work-Pool gemacht wird)
der Pool von Zeit zu Zeit neu eingerichtet werden.
Eine Garbadge-Collection wird durchgeführt, indem der Pool
zuerst auf Metaformat umgewandelt und anschließend
zurückgewandelt wird
(siehe Kapitel Metaformat).
MAL-Homepage Inhaltsverzeichnis
6.4. Dereferenzierungsprinzip
Es gibt in MAL drei verschiedene Typen von Stackeinträgen, die
Referenzen im weitesten Sinn darstellen:
MAL-Homepage Inhaltsverzeichnis