next up previous contents index
Next: Ein-/Ausgabe auf dem Bildschirm Up: L3 Referenzhandbuch Previous: Textdateien

Datenr�ume

Einf�hrung

Datenr�ume bilden die oberste und allgemeinste Klasse f�r Objekte, die gespeichert werden. Der Typ DATASPACE bezeichnet Objekte vom Typ Datenraum, ein elementarer Datentyp des L3-Systemkerns. Datenr�ume k�nnen Daten beliebigen Typs aufnehmen und gew�hren direkten Zugriff auf ihren Inhalt. Ein Datenraum ist als Container f�r Daten aufzufassen, es sind zun�chst keine Annahmen �ber den Inhalt (Texte, ausf�hrbarer Code oder vielleicht eine Datenbank?) n�tig. Ein Datenraum ist einfach ein St�ck linearer Speicher, das bis zu einem Gigabyte gro� werden kann.

Datenr�ume sind lokale Objekte in den Tasks eines L3 Systems, oder einfacher gesagt, jeder Datenraum hat genau eine Besitzertask. Eine Task kann bis zu 16380 Datenr�ume besitzen. Da der daf�r theoretisch erforderliche Adre�raum 16 Terabyte betr�gt, der Prozessor jedoch nur 4 Gigabyte pro Task adressieren kann, mu� noch eine Abbildung der aktuell angesprochenen Datenr�ume in den virtuellen Adre�raum der Task erfolgen. Diese Abbildung hei�t Mapping. Das Mapping erfolgt in Segmenten zu 16 MB. Bis zu 234 dieser 16 MB Segmente k�nnen gleichzeitig �gemappt� sein, die restlichen 22 Segmente werden intern beansprucht. Da Datenobjekte meistens kleiner als 16 MB sind, bedeutet das, da� gleichzeitig 234 �Dateien ge�ffnet� sein k�nnen. Falls Datenr�ume gr��er als 16 MB sind, verringert sich die Anzahl der m�glichen Mappings entsprechend, da ein solch gro�er Datenraum dann zwei oder mehr nebeneinanderliegende Eintr�ge in der Mappingliste beansprucht. Falls sehr gro�e Datenr�ume gemappt werden sollen, sollten sie sofort nach Erzeugung der Task gemappt werden, da andernfalls die Gefahr besteht, da� sich in der Mappingliste keine hinreichend gro�e �L�cke� mehr findet. Mapping- Operationen sind implizit in den �blichen Datenraumoperationen und darauf aufbauenden enthalten. Beispielsweise ist nach einem edit auf eine neue Datei der Datenraum anschlie�end gemappt. Explizites Mapping per open und close ist nur dann erforderlich, wenn sehr viele (gro�e) Datenr�ume gleichzeitig direkt adressiert werden m�ssen.

Die Datenr�ume einer Task sind in der Reihenfolge ihrer Erschaffung, bzw. ihres Empfangs, durchnumeriert. Dieser Datenraumindex kann zum Durchlaufen aller Datenr�ume einer Task benutzt werden. Datenraumindices, die nach L�schen eines Datenraums frei sind, k�nnen wiederbenutzt werden. Der Index kann also nicht zur Identifikation benutzt werden.

Bei der Beschreibung von Operationen auf Datenr�umen sind drei Zugriffsebenen zu unterscheiden. Zun�chst gibt es Operationen, die f�r den Datentyp DATASPACE Initialisierung, Zuweisungsprozeduren und dergleichen anbieten. Auf dieser Ebene ist ein Datenraum ein atomares Objekt. Er wird in seiner Ganzheit erzeugt und gehandhabt. Diese Ebene wird z.B. von der Intertask Kommunikation benutzt. Wie in Kapitel 8 beschrieben, ist es m�glich einen oder mehrere Datenr�ume in einem atomaren Botschaftstransfer zwischen Sender- und Empf�ngertask zu �bertragen.

Die n�chste Zugriffsebene betrifft die Organisation eines Datenraums. Er ist ein Objekt, das aus einer Anzahl von �Pages� im virtuellen Speicher besteht. Diese technische Struktur eines Datenraums kann Angaben �ber ben�tigten Speicherplatz liefern und wird insbesondere f�r blockorientierte Schreib- und Leseoperationen, z.B. auf Diskette, benutzt.

Die dritte Zugriffsebene betrifft den korrekten Zugriff auf den Datenrauminhalt. Diese innere Struktur wird einem Datenraum von der konkreten Anwendung �aufgepr�gt�.

Durch das Schl�sselwort BOUND bei der Deklaration einer Variablen wird in einem ELAN-Programm erreicht, da� diese Variable nicht im Standarddatenraum, sondern im jeweils angekoppelten Datenraum abgelegt wird.

Da die innere Struktur eines Datenraums anwendungsabh�ngig ist, k�nnen an dieser Stelle keine Aussagen �ber M�glichkeiten des Zugriffs auf diese Struktur gemacht werden. Ein Datenraum kann eine Typnummer erhalten. Durch Test dieser Typnummer kann dann festgestellt werden, ob die passenden Zugriffswerkzeuge zur Verf�gung stehen.

Eine gewisse Sonderbehandlung erfahren TEXTE in Datenr�umen. Texte werden als dynamische Strukturen in einem Textheap gespeichert. Die Mindestgr��e dieses Textheaps kann mit der Prozedur set min heap size vorgegeben werden. Siehe dazu auch Kap 2.3: Aufbau des Textheap in anderen Datenr�umen.

Koppelung von Datenr�umen

Eine st�ndig innerhalb des L3 Systems verwendete Technik ist die Koppelung von Datenr�umen durch faules Kopieren. Die �berlegung dabei ist, da� die virtuelle Speicherverwaltung erm�glicht, Kopieroperationen zun�chst in Bezug auf das eigentliche Datenobjekt (den Datenraum) zu unterdr�cken.

Dazu zun�chst ein Blick auf die in dieser Er�rterung aus Gr�nden der Verst�ndlichkeit vereinfacht dargestellte, technische Organisation eines Datenraums. Sie l��t sich vorstellen als ein Zeiger auf eine Seitenblocktabelle, die Eintr�ge dieser Tabelle verweisen auf die Bl�cke auf dem Hintergrundspeicher (Festplatte). Durch eine von der MMU (Memory Management Unit) des 80386 unterst�tzte Adre�umsetzung erh�lt man so ein wahlfrei adressierbares Datenobjekt.

                         Seite p1    ----->    Block a (4096 Byte) 
DATASPACEA Ptr   --->    Seite p2    ----->    Block b    " 
                         Seite p3    ----->    Block c    " 
                         ...

Um eine Kopie dieses Datenraums zu erhalten, reicht es nun zun�chst aus, einen zweiten Verweis auf die Seitenblocktabelle zu erzeugen und zu vermerken, da� der Datenraum gekoppelt ist.

                         Seite p1    ----->    Block a (4096 Byte) 
DATASPACEA Ptr  ---->    Seite p2    ----->    Block b    " 
DATASPACEB Ptr  ---->    Seite p3    ----->    Block c    " 
                         ...

Da die (internen) Datenraumnamen innerhalb des Gesamtsystems eindeutig sind, wird diese Kopiertechnik sowohl tasklokal, als auch systemweit benutzt.

Erst wenn ein Schreibzugriff stattfindet, m�ssen die betroffenen Datenraumseiten tats�chlich kopiert werden.

                         Seite p1    ----> |-->  Block a (4096 Byte) 
DATASPACEA Ptr   --->    Seite p2    ----> ||->  Block b    " 
                         Seite p3    ----> ||    Block c    " 
                                           || 
                         Seite p1    ------|| 
DSCOPY Ptr      --->     Seite p2    -------| 
                         Seite p3    --------->  Block d    " 
                                    (neu)

Dieses Verfahren erlaubt das Kopieren gro�er Datenmengen, ohne da� nennenswerte Datenmengen bewegt werden. Insbesondere im L3 Systemmantel ist diese Technik gut erkennbar. Das Tasksystem besteht von Beginn an aus mehreren Tasks, die jede logisch �ber 3MB Speicherplatz einnehmen. Da die Standarddatenr�ume der Tasks, die diesen Platz beanspruchen, sich jedoch nicht oder nur geringf�gig unterscheiden, betr�gt der Gesamtplatzbedarf eines frischen Systems nur etwa das Doppelte der Standarddatenraumgr��e, plus ca. 1,5 MB f�r den L3- Systemkern und Treiberprozesse.

Datenraumoperationen

tabular3942

:=

OP := (DATASPACE VAR dest, DATASPACE CONST source)

Wirkung: Der Datenraum 'dest' wird als Kopie von 'source' angelegt.
Bemerkung: Es handelt sich um eine logische Kopie, eine (teilweise) physische Kopie wird erst nach einem Schreibzugriff auf einen der beiden Datenr�ume n�tig.

nilspace

DATASPACE PROC nilspace

Wirkung: Liefert den leeren Datenraum nilspace, der ausschlie�lich als Quelle zum Kopieren verwendet werden darf.

copy

PROC copy (DATASPACE CONST source, DATASPACE VAR dest)

Wirkung: Der Datenraum 'dest' wird als Kopie von 'source' angelegt.

PROC copy (DATASPACE CONST source, dest, INT CONST from page, to page, pages)

Wirkung: Aus dem Datenraum 'source' werden 'pages' Seiten ab Seite 'from page' in den Datenraum 'dest' beginnend ab Seite 'to page' kopiert.
Bemerkung: Es handelt sich hier um logische Kopien, eine (teilweise) physische Kopie wird erst nach einem Schreibzugriff auf einen der beiden Datenr�ume n�tig.

PROC copy (DATASPACE CONST ds, INT CONST from page, to page, pages)

Wirkung: Innerhalb des Datenraums 'ds' werden 'pages' Seiten ab Seite 'from page' beginnend ab Seite 'to page' kopiert.

Bemerkung: Es handelt sich (nat�rlich) um �faule Kopien�. Die Seiten werden nicht entkoppelt.

close

PROC close (DATASPACE CONST ds)

Wirkung: Die Abbildung des Datenraums 'ds' in den Adre�raum der Task wird explizit beendet.

dataspace

DATASPACE PROC dataspace (TEXT CONST name)

Wirkung: Liefert den Datenraum, der mit dem Namen 'name' assoziiert ist.
Beispiel:
create ("matrix4D", ds) ; 
 
TYPE DA   = STRUCT (ROW 25 INT a), 
     DB   = STRUCT (ROW 25 DA b), 
     DC   = STRUCT (ROW 25 DB c), 
     DD   = ROW 25 DC; 
 
BOUND DD VAR sp := dataspace ("matrix4D") ; 
 
INT VAR i,j,k,l; 
 
FOR i FROM 1 UPTO 05 
REP 
   FOR j FROM 1 UPTO 05 
   REP 
      FOR k FROM 1 UPTO 05 
      REP 
         FOR l FROM 1 UPTO 05 
         REP 
         sp[i].c[j].b[k].a[l] := i * j * k * l; 
         PER; 
      PER; 
  PER; 
PER;
dataspaces

INT PROC dataspaces

Wirkung: Liefert die Anzahl aller (benannten und unbenannten) Datenr�ume der Task.

INT PROC dataspaces(TASK CONST task)

Wirkung: Liefert die Anzahl aller (benannten und unbenannten) Datenr�ume der Task 'task'.
Bemerkung: Die gr��tm�gliche Anzahl der Datenr�ume einer Task betr�gt (zur Zeit) 16383.

delete

PROC delete (DATASPACE VAR ds)

Wirkung: Der Datenraum 'ds' wird gel�scht.

PROC delete (DATASPACE CONST ds, INT CONST from page, pages)

Wirkung: Im Datemraum 'ds' werden beginnend ab Seite 'from page' 'pages' Seiten gel�scht.
Bemerkung: Durch diese Prozedur steht nicht unmittelbar mehr freier Speicherplatz auf der Festplatte zur Verf�gung. Die physische R�umung von Speicherplatz erfolgt erst durch die �M�llabfuhr�.

exists

BOOL PROC exists (DATASPACE CONST ds)

Wirkung: Liefert 'TRUE', falls der Datenraum 'ds' im Adressraum der Task existiert, sonst 'FALSE'.

move

PROC move (DATASPACE VAR source, dest)

Wirkung: Kopiert den Datenraum 'source' nach 'dest' und l�scht 'source'.

next

DATASPACE PROC next (DATASPACE CONST ds)

Wirkung: Liefert den auf 'ds' folgenden Datenraum der Task. Die vorhandenen Datenr�ume k�nnen mit dieser Prozedur zyklisch abgerufen werden. Es gilt: next (nilspace) liefert den Standarddatenraum, next ('last ds') liefert nilspace.

INT PROC next (DATASPACE CONST ds, INT CONST pageno)

Wirkung: Liefert die n�chste belegte Seite des Datenraums 'ds'. Falls 'pageno' = -1 ist, wird die erste belegte Seite geliefert, gibt es keine belegte Seite mehr, so wird -1 geliefert.
Bemerkung: In den Seitennummern k�nnen L�cken sein.

index

INT PROC index (DATASPACE CONST ds)

Wirkung: Liefert den Index des Datenraums 'ds'. Es gilt: index (next (nilspace)) = 1 Der Standarddatenraum einer Task hat den Index 1.

pages

INT PROC pages (DATASPACE CONST ds)

Wirkung: Liefert die Anzahl der durch 'ds' belegten Seiten (je 4096 Byte).

page size

INT PROC page size

Wirkung: Liefert die Gr��e einer Seite eines Datenraums in Byte.

set min heap size

PROC set min heapsize (DATASPACE CONST ds, INT CONST new limit)

Wirkung: Die Gr��e des Textheapbereiches in dem Datenraum wird ver�ndert. Standardm��ig werden vom Laufzeitsystem mindestens 10 MB eines Datenraums als Textheap reserviert, unabh�ngig davon, ob die zu speichernde Struktur TEXTe enth�lt, oder nicht. Der tats�chlich zur Verf�gung stehende Platz errechnet sich aus der Differenz der Gr��e des statischen Teils eines Datenobjekts zum n�chstgr��en Vielfachen von 16 MB. Falls der statische Teil so viel Platz einnimmt, da� weniger als 10 MB f�r den Textheap zur Verf�gung stehen, wird ein weiteres Datenraumsegment allokiert. Die Angabe 'new limit' erfolgt in Bytes, es findet keine �berpr�fung dieses Werts auf eine sinnvolle Gr��e statt. Generell braucht man nat�rlich nur dann �berlegungen zu diesem Thema anzustellen, wenn man mit gro�en Datenobjekten agiert!
Beispiel:
  1. Der Datenraum soll ROW 3 000 000 INT aufnehmen. Da kein Text ben�tigt wird, kann erreicht werden, da� der Datenraum auf ein Segment von 16 MB beschr�nkt bleibt, indem der das Datenobjekt an eine Datenraumvariable gekoppelt wird, f�r die kein Textheap vereinbart wurde.
    create ("hugo", ds); 
    set min heap size (dataspace ("hugo"), 0); 
    TYPE MI = ROW 3 000 000 INT; 
    BOUND MI VAR mio := dataspace("hugo") ; 
    INT VAR i; 
    FOR i FROM 1 UPTO 3 000 000 
      REP 
         mio [i] := i 
      PER ;
  2. Der Datenraum soll ROW 40 000 TEXT aufnehmen. Es ist abzusehen, da� die Texte durchaus bis 1000 Byte lang werden. Die Heapgr��e mu� in diesem Fall auf (sicherheitshalber) 45 000 000 hochgesetzt werden:
    create ("texte satt", ds); 
    set min heap size (dataspace ("texte satt"), 45000000); 
    TYPE TH = ROW 40 000 000 TEXT; 
    BOUND TH VAR thd := dataspace("texte satt") ; ...
  3. Der Datenraum enth�lt eine ROW 1000 INT. Offensichtlich w�rde gen�gend Platz f�r den Textheap innerhalb 16 MB zur Verf�gung stehen. Man braucht sich keine Gedanken um eine Einschr�nkung zu machen.

storage

INT PROC storage (DATASPACE CONST ds)

Wirkung: Liefert den von 'ds' belegten Speicherplatz. Die Angabe erfolgt in Bytes. Das Ergebnis ist jedoch immer ohne Rest durch 4096 teilbar, da es aus der Anzahl der Seiten des Datenraums errechnet wird.

type

PROC type (DATASPACE CONST ds, INT CONST typ)

Wirkung: Der Datenraum 'ds' erh�lt die Typnummer 'typ'. Die Typnummer mu� eine positive Zahl sein.

INT PROC type (DATASPACE CONST ds)

Wirkung: Liefert die Typnummer des Datenraums 'ds'.
Bemerkung: Falls dem Datenraum 'ds' eine Typnummer zugewiesen wurde, wird diese geliefert. Wurde 'ds' keine Typnummer zugewiesen gilt folgendes:

type ('ds') < 0 falls 'ds' nie an ein BOUND Objekt angekoppelt war,
type ('ds') = 0 falls 'ds' schon an ein BOUND Objekt angekoppelt war.

Datenr�ume in ELAN-Programmen

Durch das Schl�sselwort BOUND bei der Deklaration einer Variablen teilt man dem ELAN-Compiler mit, da� die Werte dieser Variablen in einem Datenraum gespeichert werden. Das Ablegen von Datenobjekten in Datenr�umen kann aus verschiedenen Gr�nden notwendig bzw. sinnvoll sein:

Beispiel f�r die Verwendung eines unbenannten Datenraums:

BOUND ROW 10000 REAL VAR liste; 
(* 'liste' soll in einem Datenraum abgelegt werden          *) 
DATASPACE VAR ds :: nilspace; 
(* erzeugen des Datenraums 'ds' als Kopie des nilspace      *) 
liste := ds; 
(* 'liste' wird an den Datenraum 'ds' angekoppelt           *) 
bearbeite liste; 
(* Das Datenobjekt 'liste' wird bearbeitet                  *) 
copy (ds, public, "Liste"); 
(* Der Datenraum 'ds' wird unter dem Namen "Liste" in der 
   Task "PUBLIC" gesichert                                  *) 
delete (ds); 
(* nicht vergessen, sonst wird der belegte Platz nicht 
   wieder freigegeben, bevor die Task gel�scht wird         *) 
. bearbeite liste: 
  liste [314] := pi;

Beispiel f�r die Verwendung eines benannten, von der Dateiverwaltung der Task verwalteten, Datenraums:

BOUND ROW 10000 STRUCT (REAL wert, INT position) VAR liste; 
(* 'liste' soll in einem Datenraum abgelegt werden          *) 
create ("liste2") ; 
liste := dataspace ("liste 2"); 
(* 'liste' wird an einen neuen Datenraum angekoppelt. Dieser 
   Datenraum wird unter dem Namen "liste 2" von der Dateiver- 
   waltung der Task verwaltet                               *) 
bearbeite liste; 
(* Das Datenobjekt 'liste' wird irgendwie bearbeitet        *) 
programmende;

Mapping

In den bislang er�rterten Prozeduren wurde zumindestens implizit vorausgesetzt, da� ein Datenraum ein Datencontainer ist. Er wird als Speicherobjekt f�r eine Datenstruktur aufgefa�t. Der Zugriff auf den Inhalt des Datenraums setzt Kenntnis der inneren Struktur voraus. Es kann jedoch auch notwendig sein, ohne Beachtung der inneren Struktur auf den Inhalt eines Datenraums zuzugreifen. Beispielsweise wird diese M�glichkeit benutzt, um in der Task hardware configurator in eine (Bin�r-)datei, die zum Standarddatenraum eines Treibers wird, die vom Benutzer eingestellte Interruptnummer, Portadresse und dergleichen einzutragen. Der in dieser Datei enthaltene ausf�hrbare Code kann schwerlich als Datenstruktur betrachtet werden, nichtdestotrotz m�ssen Schreib/Leseoperationen in solchen Datenr�umen m�glich sein.

F�r derartige Zwecke gibt es den Datentyp BOUNDPTR. Variablen dieses Typs liefern f�r einen gemappten Datenraum eine Basisadresse, die, durch ein Offset erg�nzt, Zugriff auf den Inhalt des Datenraums erm�glicht.

BOUNDPTR

TYPE BOUNDPTR

Wirkung: Typ f�r Variablen die Mapping eines Datenraums erlauben, der nicht �ber BOUND Variable angekoppelt werden soll oder kann.

address

REF INT PROC address (BOUNDPTR CONST boundptr)

Wirkung: Liefert die Mappingadresse.

close

PROC close (BOUNDPTR VAR bound ptr)

Wirkung: Das Mapping des mit 'bound ptr' assoziierten Datenraum wird beendet.

dataspace

DATASPACE PROC dataspace (BOUNDPTR CONST boundptr)

Wirkung: Liefert den durch 'boundptr' adressierten Datenraum.

open

PROC open (DATASPACE CONST space, INT CONST map size BOUNDPTR VAR bound ptr)

Wirkung: Mappt den Datenraum 'space' in der (in Byte) angegebenen Gr��e. Die Variable 'bound ptr' mu� solange g�ltig sein, wie das Mapping Bestand haben soll.

Beispiel:
LET mb16 = 0x 0100 0000 , 
    config area = 0x80  ; 
BOUNDPTR VAR std space ; 
.... 
open (dataspace("stdds"), mb16, std space); 
... 
drivers ip := VAL (REF INT [address (std space) 
                            + config area]) ;

Soll sagen: die Startadresse f�r die Aktivierung des Treibers, also der Anfangswert seines Befehlsz�hlers (drivers ip) wird aus dem Konfigurationsbereich des Programms gelesen. Dieses Programmsegment ist aus dem "install" Programm zu einem Treiber abgeleitet. Es zeigt ganz nebenbei, da� auch die Benutzung von BOUNDPTRn Kenntnisse �ber die innere Struktur des Datenraums erfordert, da ohne n�here Kenntnisse �ber die config area auch ein BOUNDPTR nur zum Herumstochern taugte.

Der Datentyp TASK

Einf�hrung

Prozesse und damit insbesondere auch Tasks sind die einzig globalen Objekte in einem L3 System. Es mu� f�r jeden Proze� eine eindeutige Benennung im System geben. Insbesondere m�ssen Prozesse auch �ber ihre Lebensdauer hinaus eindeutig identifizierbar sein. W�re diese Sicherheit nicht gegeben, best�nde z.B. die Gefahr, da� nach L�schen einer Task durch ihren Besitzer ein anderer Benutzer im System eine gleichnamige Task einrichtet und zum Empf�nger von Daten wird, die nicht f�r ihn bestimmt sind.

Die Sicherheit der Benennung wird bei L3 durch vom Systemkern vergebene interne Taskbezeichner erreicht. Ein solcher Bezeichner besteht aus einem Taskindex und einer Generationsnummer. Der Index ist der zeitinvariante Teil des internen Taskbezeichners. Durch Kombination des Index mit einer Generationsnummer ist sichergestellt, da� Tasks auch �ber die Zeit eindeutig identifizierbar sind. Bei erneuter Vergabe des Index wird die Generationsnummer hochgez�hlt, so da� auch bei �alten� Systemen die Eindeutigkeit der Taskbezeichner sicher ist.

Diese Taskbezeichner k�nnen mit Hilfe von Taskvariablen benutzt werden. Bei benannten Tasks kann der Bezeichner durch den Operator / bzw. die Prozedur task erhalten werden. Unbenannte Tasks, die im Taskbaum mit ihrem �Pseudonamen '-'� ausgewiesen sind, k�nnen �ber Verwandschaftsbeziehungen erreicht werden.

F�r einige standardm��ig in einem L3 System vorhandene Tasks und einige der an sich unbenannten Realprozesse gibt es vereinfachende Schreibweisen bzw. Pseudonamen, die die Identifizierung vereinfachen.

Das gesamte Tasksystem wird von der Task SUPERVISOR verwaltet. Der SUPERVISOR kann als einzige Task im System spezielle Verwaltungsoperationen auf Objekten vom Typ Task ausf�hren. Erzeugen, Anhalten und L�schen einer Task geschehen also stets durch Auftr�ge an die Task SUPERVISOR. Informationen �ber den Aufbau des Systems, also Namen und Vater/Sohn Beziehungen der Tasks verwaltet der SUPERVISOR im Systemkatalog. Falls eine Task Informationen aus dem Systemkatalog ben�tigt, kann sie durch access catalogue eine Kopie dieses Katalogs vom SUPERVISOR anfordern.

Neben den Operationen, die allgemein den Typ TASK und die Verwandschaftsbeziehungen zwischen Objekten dieses Typs betreffen, gibt es weitere, die die Interna einzelner Tasks behandeln. Darunter fallen storage (belegter Speicherplatz), Tasknummer (index) oder Statusangaben. Alle diese Angaben stammen aus dem Proze�kontrollblock (PCB) der jeweiligen Task im Systemkern. Die Prozeduren am Ende dieses Abschnitts stellen die ELAN Schnittstelle zum Systemkern dar.

Privilegien von Tasks

Die Tasks sind in drei Privilegklassen eingeteilt. Das h�chste Privileg hat die Task SUPERVISOR. Nur diese Task darf Objekte des Typs TASK anlegen und l�schen. Die mittlere Stufe, das Systemprivileg, haben die Tasks des Systemzweigs. Diese Tasks k�nnen insbesondere f�r jede Task, au�er ihren eigenen Vorfahren, einen Ende Auftrag absetzen, der von SUPERVISOR akzeptiert wird. Man kann also z.B. von der Task OPERATOR aus jede Task au�er SUPERVISOR und SYSUR l�schen (VORSICHT!).

Das niedrigste Privileg (das Benutzerprivileg) haben die Task PUBLIC und ihre Nachkommen. In diesem Zweig des Systems d�rfen bzw. k�nnen Tasks nur sich selbst oder ihre Nachkommen l�schen.

Privilegien werden vererbt, Tasks unter SYSUR haben also stets das Systemprivileg, Tasks unter PUBLIC das Benutzerprivileg.

Restriktionen f�r Tasks

Bei einem Betriebssystem mit virtueller Speicherverwaltung und Datenraumsharing (�faules Kopieren�) kann f�r eine Task nicht angegeben werden, da� sie z.B. x Prozent des Plattenplatzes einnehmen darf, da das Erreichen eines solcher Wertes nicht effizient bestimmt werden kann. Um andererseits zu verhindern, da� Tasks das System unkontrolliert bis zur Aktionsunf�higkeit vollschreiben, kann f�r alle Tasks eine Schranke vorgegeben werden, bei deren Erreichen sie von der Arbeit zeitweise suspendiert werden. So wird erreicht, da� diese Tasks keine neuen Datenr�ume anlegen etc. Zumindestens einigen Tasks mit Systemprivileg mu� zugestanden werden, bis 100% agieren zu d�rfen, um gegebenfalls von hier aus andere Tasks zu l�schen. F�r Tasks mit Benutzerprivileg sollte dagegen eine Schranke angegeben werden, die mindestens 10 MB Freiraum l��t. Die Einstellung dieser Schranke kann im privilegierten Systemzweig mit der Prozedur limit vorgenommen werden.

Priorit�ten von Tasks

L3 ist ein Timesharing Betriebssystem. Die Zuteilung von Rechenzeit an Tasks erfolgt durch den Scheduler im Systemkern, der allen Prozessen reihum eine Zeitscheibe von 10 Millisekunden anbietet. Dieses Verfahren wird trotz der gro�en Anzahl von Prozessen in einem L3 System durch einige Randbedingungen sehr effizient:

Grunds�tzlich erhalten nur Systemprozesse (Treiber, Kern) jede ihrer m�gliche Zeitscheiben. Einige wichtige Tasks (Supervisor, CONSOLE) werden nur einmal (prio = 1), normale Tasks werden generell zwei- (prio = 2) bis f�nfmal (prio = 5) bei der Vergabe �bergangen. Desweiteren warten die meisten Prozesse im System auf die �bertragung einer Botschaft. Falls die Botschaft noch nicht da ist, verbraucht der Proze� nicht seine zustehenden 10 Millisekunden, sondern teilt dem Kern per Systemcall mit, da� der Scheduler den n�chsten Proze� bedienen kann. Durch dieses Verfahren bleiben im Endeffekt nur wenige Prozesse, die ganze Zeitscheiben verbrauchen. Die Tasks haben, wie oben erw�hnt eine Priorit�t zwischen 2 und 5. Diese Priorit�t wird dynamisch vergeben: Tasks, die viel Rechenzeit verbrauchen, also selten oder garnicht warten, sondern �rechnen�, sinken in ihrer Priorit�t, Tasks, die viel von ihren Zeitscheiben �weitergeben�, weil sie z.B. im wesentlichen auf Eingaben warten, werden belohnt und behalten ihre Priorit�t 2.

Operatoren und Prozeduren

tabular4246

TASK

TYPE TASK

Wirkung: Datentyp �interner Taskbezeichner�.

:=

OP := (TASK VAR left, TASK CONST right)

Wirkung: Zuweisungsoperator f�r Taskbezeichner.

= <>

BOOL OP = (TASK CONST left, right)

BOOL OP <> (TASK CONST left, right)

Wirkung: Liefert TRUE, falls 'left' gleich (bzw. ungleich) 'right' ist.

< <=

BOOL OP < (TASK CONST left, right)

BOOL OP <= (TASK CONST left, right)

Wirkung: Pr�fung auf die Relation. Liefert 'TRUE', falls 'left' Nachkomme (Sohn, Enkel,..) von 'right' ist.

/

TASK OP / (TEXT CONST task name)

Wirkung: Liefert den internen Taskbezeichner der Task des angegebenen Namens, falls sie existiert. Der eigene Katalog wird automatisch aktualisiert (identisch mit: task (TEXT CONST task name).
Fehler: * ... gibt es nicht

brother

TASK PROC brother (TASK CONST task)

Wirkung: Liefert den n�chsten Bruder von 'task'. Falls kein Bruder existiert, wird 'niltask' geliefert. Aktualisiert den eigenen Katalog nicht automatisch!

father

TASK PROC father

Wirkung: Liefert den internen Taskbezeichner der eigenen Vatertask.

TASK PROC father (TASK CONST task)

Wirkung: Liefert den internen Taskbezeichner der Vatertask von 'task'. Existiert keine Vatertask, wird niltask geliefert. Aktualisiert den eigenen Katalog nicht automatisch!

myself

TASK PROC myself

Wirkung: Liefert den eigenen internen Taskbezeichner.

niltask

TASK CONST niltask

Wirkung: Bezeichner f�r �keine Task�. So liefern die Prozeduren 'son', 'brother' und 'father' als Resultat 'niltask', wenn keine Sohn-, Bruder- oder Vatertask existiert.

public

TASK PROC public

Wirkung: Liefert den Taskbezeichner der Task PUBLIC.

son

TASK PROC son (TASK CONST task)

Wirkung: Liefert den Taskbezeichner der ersten Sohntask von 'task'. Falls keiner im Katalog vermerkt ist, wird 'niltask' geliefert. Aktualisiert den eigenen Katalog nicht automatisch!

supervisor

TASK PROC supervisor

Wirkung: Liefert den Taskbezeichner der Task SUPERVISOR.

exists

BOOL PROC exists (TASK CONST task)

Wirkung: Liefert 'TRUE', falls der mit 'task' spezifizierte Proze� existiert. Hiermit kann also auch die Existenz von Realprozessen �berpr�ft werden.

exists task

BOOL PROC exists task (TEXT CONST taskname)

Wirkung: Liefert 'TRUE', falls eine Task mit Namen 'taskname' existiert, sonst 'FALSE'.

is niltask

BOOL PROC is niltask (TASK CONST task)

Wirkung: task = niltask

name

TEXT PROC name (TASK CONST task)

Wirkung: Liefert den Namen von 'task'. Die Task mu� noch im System existieren. Falls die 'task' noch nicht im eigenen Katalog enthalten ist, wird dieser aktualisiert.

systemtask

TASK PROC systemtask (TEXT CONST systaskname)

Wirkung: Liefert den Taskbezeichner des durch 'systaskname' spezifizierten Realprozesses. Es lassen sich alle Treiberprozesse �ber diese Prozedur erreichen, wenn ihr Name bekannt ist.

task

TASK PROC task (TEXT CONST task name)

Wirkung: Liefert den Taskbezeichner der Task des angegebenen Namens, falls sie existiert. Der eigene Katalog wird automatisch aktualisiert.
Fehler: * ... gibt es nicht

Die folgenden Prozeduren entsprechen in ihrer Wirkung den �hnlich benamten

brother, son etc. Im Gegensatz zu jenen wird das Resultat jedoch nicht �ber den

Taskkatalog erreicht, sondern direkt beim SUPERVISOR angefragt. Die Prozeduren sind also direkte Kommunikationen vermittels des SUPERVISOR Protokolls (Kap.13.6).

xbrother

TASK PROC xbrother (TASK CONST task)

Wirkung: Fragt direkt bei SUPERVISOR nach brother(task). Falls es keine derartige Task gibt, wird niltask als Resultat geliefert.

xexists task

BOOL PROC xexists task (TEXT CONST task)

Wirkung: Direkte Anfrage an die Task SUPERVISOR. Liefert 'TRUE', falls eine Task mit Namen 'task' existiert, sonst 'FALSE'.

xfather

TASK PROC xfather (TASK CONST task)

Wirkung: Fragt direkt bei SUPERVISOR nach father(task). Falls es keine derartige Task gibt, wird niltask als Resultat geliefert.

xname

TEXT PROC xname (TASK CONST task)

Wirkung: Fragt direkt bei SUPERVISOR nach name (task). Falls keine benannte Task existiert, wird niltext als Resultat geliefert.

xson

TASK PROC xson (TASK CONST task)

Wirkung: Fragt direkt bei SUPERVISOR nach son (task). Falls es keine derartige Task gibt, wird niltask als Resultat geliefert.

access catalogue

PROC access catalogue

Wirkung: Die Task SUPERVISOR wird aufgefordert eine Kopie des Systemkatalogs zu senden, mit der die eigene Version �berschrieben wird. Prozeduren, die systemglobale Informationen ben�tigen (father, brother, son) arbeiten dann auf dieser neuen Fassung des Katalogs.

Beispiel:
INT VAR i; TASK VAR t; 
taskinfo; 
(* Im Systemkatalog sind die Tasks noch nicht vorhanden *) 
page; 
FOR i FROM 5 DOWNTO 1 
   REP begin("Task " + text(i),PROC unlink,t); 
PER; 
taskinfo; 
(* Im Systemkatalog sind alle f�nf Tasks vorhanden *) 
FOR i FROM 1 UPTO 5 
   REP end (son (myself), quiet); access catalogue 
PER; 
taskinfo; 
(* Hiernach sind alle f�nf Tasks im Systemkatalog wieder gel�scht *) 
(* W�re access catalogue nicht aufgerufen worden, *) 
(* h�tte es beim L�schen des zweiten Sohnes *) 
(* die Fehlermeldung "'end' unzulaessig" gegeben, *) 
(* da der taskeigene Katalog nicht aktuell war. *)

begin

PROC begin (TEXT CONST new taskname)

Wirkung: Eine neue Task mit dem angegebenen Namen wird als Sohntask der aufrufenden Task mit der Startprozedur monitor gestartet. Falls diese Prozedur im Monitor, also interaktiv, aufgerufen wird, wird die neue Task sofort an das Terminal gekoppelt.

Fehler: Eine Task mit dem Namen 'new taskname' existiert bereits.

PROC begin (TEXT CONST new taskname, father)

Wirkung: Eine neue Task mit dem angegebenen Namen wird als Sohntask der (Manager)Task 'father' mit der Startprozedur monitor gestartet.

Fehler: falscher Auftrag f�r Task "father"(04000010,"sender") => 'fathername' ist keine Managertask passenden Typs. 40000010 ist der (gesendete) Auftragscode des Dateimanagerprotokolls.

wait for SYSIO => 'fathertask' hat sich nicht selbst vom Terminal abgekoppelt

PROC begin (TEXT CONST new taskname, PROC startproc, TASK VAR t)

Wirkung: Es wird eine Task mit dem Namen 'new taskname' als Sohn der aufrufenden Task mit der Prozedur 'startproc' gestartet. 't' identifiziert die neue Task, falls kein Fehler aufgetreten ist.

PROC begin (PROC startproc, TASK VAR t)

Wirkung: Es wird eine unbenannte Task (Pseudoname "-") als Sohn der aufrufenden Task mit der Prozedur 'startproc' gestartet. 't' identifiziert die neue Task, falls kein Fehler aufgetreten ist. Bei Verwendung des Pseudonamens kann keine Namenskollision auftreten.

end

PROC end (TASK CONST victim)

Wirkung: Nach Kontrollfrage (mit Prozedur yes) wird an die Task SUPERVISOR der Auftrag geschickt, die Task 'victim' zu l�schen. Der Auftrag wird nur akzeptiert, wenn die auftraggebende Task eine h�here Privilegstufe als 'victim' hat oder 'victim' ein Nachkomme des Auftraggebers ist. Falls der Auftrag akzeptiert wird, beendet SUPERVISOR 'victim' und damit implizit auch alle Nachkommen von 'victim'.

PROC end (TASK CONST victim, QUIET CONST quiet)

Wirkung: L�schen ohne Kontrollfrage.

PROC end

Wirkung: Wie: end (myself)

halt

PROC halt (TASK CONST victim)

Wirkung: An die Task SUPERVISOR wird der Auftrag geschickt, der Task 'victim' einen Fehler zu senden. Die Wirkung in 'victim' entspricht dem Auftreten eines Laufzeitfehler im gerade laufenden Programm. N�heres siehe Kapitel 11.

Der Auftrag wird nur akzeptiert, wenn die auftraggebende Task eine h�here Privilegstufe als 'victim' hat oder 'victim' ein Nachkomme des Auftraggebers ist.

rename myself

PROC rename myself (TEXT CONST new name)

Wirkung: An die Task SUPERVISOR wird der Auftrag geschickt, den Namen der Task in 'new name' zu �ndern. Damit werden alle Taskvariablen, die sich auf diese Task beziehen, ung�ltig. Es ist auch m�glich, eine Task mit dem Pseudonamen "-" zu benennen, bzw. eine benannte Task �zur Strichtask� zu machen (name "-").

Verwaltung von Tasks

callee

TASK PROC callee (TASK CONST task)

Wirkung: Liefert den Partner von 'task', auf den 'task' im geschlossenen Wartezustand (receive) wartet. Falls 'task' nicht im geschlossenen Warten verharrt, wird niltask geliefert.

cpu time

DINT PROC cpu time (TASK CONST task)

Wirkung: Liefert die verbrauchte Rechenzeit von 'task'.

dataspaces

INT PROC dataspaces (TASK CONST task)

Wirkung: Liefert die Anzahl der Datenr�ume von 'task'.

INT PROC dataspaces

Wirkung: Liefert die Anzahl der eigenen Datenr�ume. (put (dataspaces(myself))).

index

INT PROC index (TASK CONST task)

Wirkung: Liefert den Taskindex von 'task'. Der Index ist der zeitinvariante Teil des internen Taskbezeichners.
Bemerkung: Der Taskindex erm�glicht die eindeutige Identifikation von �Strichtasks� (Tasks mit Pseudonamen -).
Beispiel: put (hex(index(son(printer))))

limit

PROC limit (TASK CONST task, INT CONST limit)

Wirkung: 'task' wird von der Speicherverwaltung blockiert, wenn 'limit' Prozent des Speicherplatzes des Systems belegt sind. Diese Einstellung kann nur von Tasks mit Systemprivileg vorgenommen werden!
Fehler: 'limit'-Angabe mu� zwischen 1 und 100 liegen

INT PROC limit (TASK CONST task)

Wirkung: Liefert den eingestellten Wert f�r 'task'.

prio

PROC prio (TASK CONST task, INT CONST prio)

Wirkung: Die Priorit�t von 'task' wird auf 'prio' gesetzt. Diese Einstellung kann nur von Tasks mit Systemprivileg vorgenommen werden!

INT PROC prio (TASK CONST task)

Wirkung: Liefert die Priorit�t von 'task'.

privilege

INT PROC privilege (TASK CONST task)

Wirkung: Liefert das Privileg von 'task'. Die Privilegstufen sind:
2:
Supervisorprivileg; darf Tasks erzeugen. Nur Task SUPERVISOR.
1:
Systemprivileg; erlaubt �Systemverwalteroperationen�. Task SYSUR und Nachkommen.
0:
Benutzerprivileg; Task PUBLIC und Nachkommen.

Bemerkung: F�r Abfragen der vorhandenen Berechtigungsstufe gibt es wertliefernde Prozeduren sinntragenden Namens:

INT PROC user privilege

INT PROC system privilege

INT PROC supervisor privilege

status

INT PROC status (TASK CONST task)

Wirkung: Liefert den Taskstatus von 'task'. M�glich sind:
wait:
Task wartet auf Botschaft.
busy:
Task ist aktiv.
blkd:
Task ist blockiert
dead:
Exitus. Die Task kann keine Aktion mehr ausf�hren. Sie kann nur noch gel�scht werden.

storage

INT PROC storage (TASK CONST task)

Wirkung: Liefert den belegten Speicherplatz von 'task'. Die Angabe besagt, wieviel Platz die Datenr�ume von 'task' beanspruchen. Die Angabe erfolgt in Byte und ist (wegen Paging) stets durch 4096 ohne Rest teilbar.
Bemerkung: Irgendwelche R�ckschl�sse aus Angaben f�r mehrere Tasks sind nicht m�glich.

wakeup time

DINT PROC wakeup time (TASK CONST task)

Wirkung: Wenn 'task' ein timeout gesetzt hat, um auf eine Botschaft zu warten oder durch pause, so liefert diese Prozedur den Zeitpunkt, zu dem diese Wartezeit abl�uft.
Bemerkung: Das Ergebnis ist eine systemtime Angabe, die noch anstehende Wartezeit einer Task kann also z.B. durch: put ( time (wakeup time (task) - systemtime, 8,3) angezeigt werden.


next up previous contents index
Next: Ein-/Ausgabe auf dem Bildschirm Up: L3 Referenzhandbuch Previous: Textdateien

Michael Hohmuth
Sun Mar 31 04:49:53 MET DST 1996