Nach dem Starten der Anwendung wird das
Einstiegsfenster (Abbildung 1) geöffnet. Hier kann der Benutzer festlegen, wie
viele Prozesse und Semaphore er benötig.
Es können maximal vier Prozesse und sechs Semaphore
verwendet werden. Alternativ kann er aus einer Liste ein vorgegebenes Beispiel
auswählen und starten.
Hat der Benutzer seine Eingaben gemacht,
werden nach der Betätigung des Buttons “OK“ die Eingabefelder für die Prozess-
und Semaphornamen, sowie für
die Semaphorwerte eingeblendet.
Nach Eingabe der Namen und der
Initialwerte für die Semaphore, wird das Hauptfenster durch betätigen des
Buttons “START“ geöffnet.
Hat der Benutzer keine Eingaben gemacht,
werden Standardnamen für die Prozesse und Semaphore vergeben und die Semaphore
mit Null initialisiert.
Es ist darauf zu achten, dass die
Beispielauswahl auf “Keine“ steht, da sonst das ausgewählte Beispiel gestartet
wird und die Benutzereingaben nicht berücksichtigt werden.
Abbildung 1:
Einstiegsfenster
Das Hauptfenster (Abbildung 2) bildet
anhand der zuvor vom Benutzer gemachten Eingaben die gewünschten Prozesse und
Semaphore ab.
Abbildung 2:
Hauptfenster
Die Prozesse werden als Texteingabefelder
dargestellt, in die der Benutzer Semaphor-Operationen eingeben kann. Zusätzlich
verfügt jeder Prozess über einen
Button mit der Beschriftung “do“. Dieser
wird zum Ausführen der Operationen verwendet.
Die Semaphore werden als Schalen mit Kugel
an der rechten Fensterseite dargestellt.
Der Button “Reset“ beendet die Ausführung
der Operationen und setzt die Semaphorwerte wieder auf die Anfangswerte.
Mit dem Button „Schriftgröße“ kann die
Schriftgröße der eingegebenen Operationen verändert werden.
Dazu steht ein Eingabefeld zur Verfügung,
in das die Schriftgröße numerisch eingegeben werden kann. Dabei sind Eingaben
von 9 bis 28 möglich. Durch drücken
der Entertaste oder des Buttons
“Schriftgröße“ wird die Änderung übernommen.
Durch den Button “Hilfe“ wird ein
Hilfefenster mit Beispielen für die Operationseingabe eingeblendet.
Der Button “Zurück“ schließt das
Hauptfenster und der Benutzer befindet sich wieder auf der Einstiegsseite.
Eingabe der Semaphor-Operationen
Die Semaphor-Operationen werden in einer
Art Pseudosprache eingegeben.
Neben einfachen Operationen ist es
möglich, Operationen zu verknüpfen und durch For- und While-Schleifen mehrfach
ausführen zu lassen.
Dabei ist zu beachten, dass Operationen
nur eingegeben werden können, wenn gerade kein Prozess ausgeführt wird. Es muss
also gegebenenfalls zunächst der Reset-Button betätigt werden.
Bei der Eingabe einer einfachen Operation
muss zunächst der Namen des Semaphors, auf den die Operation ausgeführt werden
soll, gefolgt von einem Punkt eingegeben werden.
Danach folgt ein ‘v‘ bzw. ein ‘p‘ für eine V- oder P-Operation,
anschließend eine öffnende und dann eine schließende Klammer ‘()‘.
Das “v“ bzw. “p“ kann als Groß- oder
Kleinbuchstabe eingegeben werden.
Die Eingabe wird dann mit einem Semikolon
abgeschlossen.
Beisspiel:
Semaphor1.v();
Semaphor2.p();
Bei einer einfachen Operation wird der
entsprechende Semaphorwert um Eins inkrementiert (V-Operation) bzw.
dekrementiert (P-Operation).
Darüber hinaus kann ein Semaphorwert mit
einer einzigen Operation auch um Werte größer als Eins erhöht oder verringert
werden, indem in die Klammer eine ganzzahlige
positive Zahl größer-gleich Eins
geschrieben wird.
Beispiel:
Semaphor1.p(3);
Semaphor2.v(15);
Mehrere einfache Operationen können mit
einem ‘&‘ verknüpft werden. Diese werden dann atomar ausgeführt.
Grundsätzlich ist die Anzahl der auf diese
Weise verknüpfter Operationen nicht begrenzt, aus Gründen der Übersicht sollten
die Zahl der Verknüpfungen aber mit Bedacht gewählt werden.
Beispiel:
Semaphor1.v()&Semaphor2.p(2);
Semaphor1.v(3)&Semaphor2.p()&Semaphor3.v(2);
Es besteht die Möglichkeit eine oder
mehrere Operationen in For-Schleifen einzubetten, um diese mehrmals wiederholen
zu lassen.
Beispiel:
for(i=0; i<5; i++){
Semaphor1.v(4);
Semaphor2.p()&Semaphor3.p(2);
Semaphor3.v(3);
}
In diesem Beispiel werden die Operationen
4-mal wiederholt.
Soll nur eine Operation mehrmals wiederholt
werden, können die geschweiften Klammern weggelassen werden.
Beispiel:
for(i=0; i<3; i++)
Semaphor1.v(2);
Natürlich gilt dies auch für verknüpfte
Operationen:
for(i=0; i<3; i++)
Semaphor2.p()&Semaphor3.p(2);
Analog zur For-Schleife können Operationen
in While-Schleifen eingebettet werden. Diese haben die Form einer
Endlos-Schleife und wiederholen die Operationen unendlich oft.
Beispiel:
while(true){
Semaphor1.v();
Semaphor2.p();
Semaphor3.v(3);
}
Auch hier können bei nur einer Operation die
geschweiften Klammern weggelassen werden.
Beispiel:
while(true)
Semaphor1.v(2);
Natürlich gilt dies auch für verknüpfte
Operationen:
while(true)
Semaphor2.p()&Semaphor3.p(2);
Bei der Verwendung von Schleifen ist zu
beachten, dass pro Prozess nur jeweils eine For- und eine While-Schleife
verwendet werden darf. Außerdem dürfen
Schleifen nicht ineinander verschachtelt
werden und maximal 20 Operationen beinhalten.
Es besteht außerdem die Möglichkeit,
Kommentare einzufügen. Dazu kann ein beliebiger Text geschrieben werden, der
ebenfalls mit einem Semikolon abgeschlossen werden muss.
Beispiel:
erzeuge Produkt;
denkt nach;
Ausführung der
Semaphor-Operationen
Mittels des Buttons “do” unter einem
Prozess werden dessen Operationen nacheinander ausgeführt. Ein Pfeil zeigt auf
die Operation, die als nächstes ausgeführt wird.
Pro Klick auf den Button springt der Pfeil
eine Zeile weiter.
Wird eine V- oder P-Operation ausgeführt,
zeigen rote Pfeile am Prozess und den betroffenen Semaphoren an, welche
Operation ausgeführt und um welchen Wert
die Semaphore verändert wurden (siehe
Abbildung 3).
Abbildung 3:
Ausführung der Semaphor-Operationen
Wenn ein Prozess versucht, mittels einer
P-Operation auf einen Semaphor zuzugreifen, dessen Wert Null ist, oder der
Semaphorwert nach dem Ausführen der
P-Operation negativ wird, wird der Prozess
blockiert und ein Hinweisfenster geöffnet (siehe Abbildung 4).
Durch den Button “Prozess blockiert!“ wird
das Hinweisfenster geschlossen und das Programm läuft weiter. Allerdings bleibt
der betroffene Prozess solange
blockiert, bis der Wert des Semaphors, auf
den dieser Prozess zugreifen wollte, wieder größer als Null ist.
Abbildung 4:
Blockierter Prozess