inforum 2/1994 - OS/2-PL/I "1.2"

inforum 2/1994 Inhalt - Vorheriger Artikel - Nächster Artikel - Impressum
Achtung: Teile dieses Artikels entsprechen nicht mehr den heutigen Gegebenheiten. Aktuellere Informationen finden Sie an anderer Stelle.

OS/2-PL/I "1.2"

von E. Sturm
Das Rechenzentrum hat eine Aktualisierung des OS/2-PL/I-Compilers bekommen, die sich bei Benutzung als Version 1.2 bezeichnet. Studenten können sich weiterhin die Disketten kopieren, wenn dies für Ausbildungszwecke geschieht.
In inforum Nr. 3/1993 habe ich bereits PL/I für OS/2 vorgestellt. An dieser Stelle brauche ich also nur auf das einzugehen, was sich geändert hat.

Zum einen wurden Fehler korrigiert. Wesentlich war eigentlich nur das Problem, daß das Schreiben auf die Platte eine Ewigkeit dauerte. Dies kam daher, daß intern die "Lazy-Write"-Möglichkeit ausgeschaltet war und das System nach jedem Schreiben den Puffer leerte. Dies ist in der neuen Version behoben worden: Ein- und Ausgabe sind jetzt so schnell, wie man es erwartet.

Zum anderen ist jetzt Multithreading möglich. Hierzu ist etliches zu erklären, da deutliche Unterschiede zum schon auf dem Großrechner bekannten Multitasking bestehen. Diese sind aber mehr syntaktischer Natur, ein Thread in OS/2 ähnelt einer Task im MVS in der Weise, daß bei beiden Systemen Unterprogramme parallel in demselben Adreßraum arbeiten.

In OS/2 braucht man Multithreading unbedingt, wenn man interaktive Programme schreiben will, die den Präsentationsmanager (PM) benutzen, da auf Benutzereingaben auch dann sofort reagiert werden muß, wenn man an sich gerade dabei ist, z. B. ein Apfelmännchen auszurechnen.

Seltsamerweise findet man noch keine deutsche Übersetzung von "thread", obwohl das Wort für deutsche Zungen denkbar schlecht auszusprechen ist. Dabei ist auch im Deutschen die wörtliche Übersetzung "Faden" in ähnlicher Bedeutung vorhanden, nämlich im Sinne von Gesprächsfaden, den man z. B. "wieder aufnehmen" kann. In gleicher Weise könnte man auch von Programmfaden sprechen, was ich im folgenden einfach mal tun werde.

Im "Mehrfadenbetrieb" (engl. multithreading) kann ein Hauptfaden einen Unterfaden starten, der dann parallel rechnet:

attach Prozedur thread (T1);
Die Variable T1 ist vom Datentyp task, was in einer entsprechenden Deklaration zum Ausdruck kommen sollte:
declare T1 task;
Im Unterschied zur call-Anweisung wartet der Hauptfaden aber nicht, bis der Unterfaden fertig ist, sondern läuft nach dem Starten einfach weiter.

Es erhebt sich nun die Frage, was für einen Nutzen kann der Hauptfaden vom Unterfaden erwarten? Natürlich wird man Argumente an den Unterfaden mitgeben, beide Fäden arbeiten ja im selben Adressraum. Da in PL/I im Normalfall Argumente (beim Aufruf) und Parameter (in der Prozedur) identisch sind, steht das Ergebnis der Bemühungen des Unterfadens z. B. in einer Variablen zur Verfügung.

Im Beispiel-Programm wird ein Paket vorgestellt, das in einem Unterfaden eine Tabelle füllt, während der Hauptfaden schon auf die Eingabe eines Benutzers wartet.

Beispiel-Programm 1. Teil:


*process names ('äöüß@#','ÄÖÜ$@#');
*process langlvl (saa3);
 Beispiel:
 package exports (Haupt);

 declare
    Obergrenze fixed bin (31) value (100000),
    Tabelle    dim (0:Obergrenze) float;

 Haupt: /*---------------------------------*/
 procedure options (main);

 declare
    Antwort char (72) var,
    Füller  task;

 attach Tabelle_füllen thread (Füller);
 display ('Wurzel aus 1 bis '
    || trim (Obergrenze) || ' ziehen?')
    reply (Antwort);
 wait thread (Füller);
 detach thread (Füller);
 ...

Im ersten Teil sehen wir, wie der Faden gestartet wird (attach). Die Variable Füller ist vom Datentyp task und dient zur Identifikation des Fadens. Danach fragen wir die Person vor dem PC schon mal, ob sie eine Wurzel ziehen möchte (display).
Während der Überlegungszeit füllt der Unterfaden die Wurzeltabelle. Nach der Eingabe garantiert einem die wait-Anweisung, daß alles geschafft wurde, so daß wir den Faden mit Hilfe der detach-Anweisung aus dem System entfernen können.

Beispiel-Programm 2. Teil:


 ...
 on conversion, subscriptrange goto Ende;

 do while (Antwort ^= '');
    (conversion, subscriptrange):
    display (Tabelle(Antwort));
    display ('Wurzel aus 1 bis '
       || trim (Obergrenze) || ' ziehen?')
       reply (Antwort);
    end;

 Ende:
 end Haupt;

 Tabelle_füllen: /*---------------------*/
 procedure options (linkage (system));

 declare
    I fixed bin (31);

 do I = 0 to Obergrenze;
    Tabelle(I) = sqrt (I);
    end;

 end Tabelle_füllen;

 end Beispiel;

Im zweiten Teil sorgen wir mittels der on-Anweisung erst einmal dafür, daß bei falschen Benutzereingaben das Programm beendet wird. (Bei einem Programm, das zu irgendetwas nützlich ist, wird man natürlich eine bessere Fehlerbehandlung vorsehen!) In der ersten display-Anweisung können die Fehler conversion und subscriptrange passieren, was durch Angabe des Bedingungspräfix explizit (in Klammern) zugelassen wird.

Die Prozedur Tabelle_füllen muß, da sie vom Betriebssystem verwaltet wird, mit der Angabe linkage(system) versehen werden und darf nicht in einer anderen Prozedur enthalten sein.

Wer noch mehr Beispiele sucht, kann im Ordner IBMPLI\SAMPLES (siehe unten) fündig werden. Das Programm PMDEMO2 erlaubt es, mit Hilfe der linken Maustaste Fäden zu starten, und sie mit der rechten Maustaste wieder zu stoppen. Bei jedem Faden handelt es sich um eine "Inkarnation" ein und derselben Prozedur, die in ein Fenster bunte Rechtecke malt. Dies ist im Grunde nichts Besonderes, da PL/I-Prozeduren gleichzeitig mehrfach benutzbar (engl. reentrant) sind.

Nun noch zu den Einzelheiten: Nach dem Kommando

net use i: ibmpli
steht einem der PL/I-Ordner als Laufwerk i: zur Verfügung. Darin finden sich außer den beiden Compiler-Ordnern IBMPLI und IBMDDM noch zwei weitere Ordner. Zum einen einer mit Beispielen und zum anderen einer mit Diskettenabbildern (engl. images) des Compilers.
Diese können von Studenten zu eigenen Ausbildungszwecken kostenlos kopiert werden, Hierzu lege man jeweils eine 9cm-Diskette ein und werfe ein Abbild auf das ebenfalls im Compiler-Ordner befindliche Programm RESTIMA.EXE ab. Der Zugriff auf den PL/I-Ordner geht nur im CIP-Raum des Rechenzentrums. Ich möchte noch einmal darauf hinweisen, daß jeder, der die Rechner des CIP-Raums benutzen darf, unterschrieben hat, keine Software an Dritte weiterzugeben.

Auch die Benutzung des Compilers kann durch Abwerfen eines Programmtexts auf eines der Symbole pmCLE.cmd, vioCLE bzw. novioCLE geschehen. Das Linken erfolgt dann für ein Präsentationsmanagerfenster, ein Textfenster oder den Gesamtbildschirm. Die .exe-Datei kann später ohne Neuübersetzung auf dem Symbol pliE.cmd abgeworfen werden. Bei Fragen wende man sich an mich (sturm@uni-muenster.de, Tel. 2609).


inforum 2/1994 Inhalt - Vorheriger Artikel - Nächster Artikel - Impressum

Zentrum für Informationsverarbeitung (Universitätsrechenzentrum)