next up previous contents index
Weiter: 9.5.2 Die Requeue-Anweisung Hinauf: 9.5 Das Rendezvous-Konzept Zurück: 9.5 Das Rendezvous-Konzept

9.5.1 Wie ein gerufener Task das Rendezvous beeinflussen kann

Wir werden nun an Hand eines Beispieles die verschiedenen Möglichkeiten kennenlernen, wie die Task-Kommunikation in Ada ablaufen kann. Als realistisches Beispiel nehmen wir einen mehr oder weniger gestreßten Universitätsassistenten zur Hand. Zunächst soll seine Aufgabe nur darin bestehen, Studierende, die in seinem Kämmerchen auftauchen, zu betreuen. Wir spezifizieren dazu den Task Assistent folgendermaßen:

task Assistent is
entry betreue;
end Assistent;

Jeden Studierenden modellieren wir als eigenen Task, der nötigenfalls durch

Assistent.betreue;

eine Betreuung durch den Assistenten anfordert. Sollte der Assistent gerade einen anderen Studierenden betreuen, muß der Student in einer Warteschlange warten, bis er an der Reihe ist.

Die ,,Innereien`` des Assistenten-Tasks können etwa folgenderweise aussehen:

task body Assistent is

begin
loop
accept betreue do
-betreuedenStudierenden
end betreue;
end loop;
end Assistent;

Allerdings ist der Aufgabenbereich eines Universitätsassistenten damit bei weitem nicht erfaßt. Es sind nämlich nicht nur Studierende zu betreuen, sondern auch organistorische Aufgaben zu erledigen und Forschungsarbeiten durchzuführen. Wir wollen annehmen, daß unser Assistent die zu erledigenden organisatorischen Aufgaben von der Sekretärin des Instituts oder dem Institutsvorstand zugeteilt bekommt. Die Forschungstätigkeiten sollen dem Assistenten obliegen. Wir wollen annehmen, daß unser Assistent immer dann forscht, wenn er nicht durch eine der beiden anderen Aufgaben beschäftigt ist. Daher modellieren wir die organistorische Aufgabe als Entry des Assistenten-Tasks:

task Assistent is
entry betreue;
entry organisiere (Aufgabe: Aufgaben_Typ);
end Assistent;

Ein entsprechender Aufruf lautet dann z.B.:

Assistent.organisiere (Aufgabe => Bibliotheksverwaltung);

Der Ablauf des Assistenten-Tasks gestaltet sich nun schon etwas schwieriger. Der Assistent muß ja jeder Zeit bereit sein, entweder einen Studierenden zu betreuen oder eine organisatorische Aufgabe zu erledigen. In Ada realisiert man das mit einer Select-Anweisung.    Man nennt dann den Vorgang der Kommunikation selektives Rendezvous des Servers.   Unser Beispiel hat jetzt folgendes Aussehen:

task body Assistent is
begin
loop
select
accept betreue do
-betreuedenStudierenden
end betreue;
or
accept organisiere (Aufgabe: Aufgaben_Typ) do
-organisiere
end organisiere;
end select;
end loop;
end Assistent;

Diese Implementation bewirkt, daß unser Assistenten-Task zunächst überprüft, ob er einen Studierenden zu betreuen oder eine organisatorische Aufgabe zu erledigen hat (wobei die Reihenfolge durch die Sprachnorm nicht festgelegt ist), gegebenenfalls entsprechend agiert oder, falls keine Anforderung anliegt, wieder an den Beginn der Select-Anweisung zurückkehrt und dort auf einen Aufruf eines der beiden Entries' wartet.

Wollen wir nun auch noch erreichen, daß unser Assistent seiner Forschungstätigkeit nachkommt, so erhalten wir folgende Implementation:

task body Assistent is
begin
loop
select
accept betreue do
-betreuedenStudierenden
end betreue;
or
accept organisiere (Aufgabe: Aufgaben_Typ) do
-organisiere
end organisiere;
else
-forsche
end select;
end loop;
end Assistent;

Damit haben wir erreicht, daß der Assistent immer dann, wenn er keine der spezifizierten Aufgaben zu erledigen hat, forscht, allerdings kann er in seiner Forschungstätigkeit nicht unterbrochen werden. Er muß daher immer in Zeitscheiben forschen, anderenfalls kann er sonst keine Aufgabe erledigen.

Nach einiger Zeit erkennt unser Assistent aber, daß er buchstäblich zu keinerlei Forschungstätigkeit kommt. Er beschließt daher, Sprechstunden einzuführen, innerhalb derer er den Studierenden für ihre Probleme zur Verfügung steht. Außerhalb dieser Zeiten ignoriert er Betreuungsansuchen. Unser Assistenten-Task sieht dann so aus:

task body Assistent is
begin
loop
select
when Sprechstunde =>
accept betreue do
-betreuedenStudierenden
end betreue;
or
accept organisiere (Aufgabe: Aufgaben_Typ) do
-organisiere
end organisiere;
else
-forsche
end select;
end loop;
end Assistent;

  Dabei steht Sprechstunde z.B. für eine boolesche Funktion, die true zurückliefert, wenn gerade eine Sprechstunde ist, sonst liefert sie false zurück. Man nennt so ein Konstrukt eine Select-Anweisung mit Wächtern.  Die boolschen Ausdrücke vor den Alternativen werden immer nur am Anfang der Select-Anweisung ausgewertet. Alle Zweige, die false ergeben, sind dann für die momentane Ausführung der Select-Anweisung geschlossen, die anderen offen. Wächter dürfen für alle Accept-Anweisungen verwendet werden, nicht jedoch im Else-Zweig.

Die letzte Möglichkeit auf seiten des Assistenten, seinen Alltag zu gestalten, besteht darin, falls für eine bestimmte Zeit keine zu erledigende Aufgabe ansteht, eine Kaffeepause einzulegen. Nehmen wir an, unser Assistent wartet 1 Stunde vergebens auf zu verrichtende Aufgaben, dann lautet eine entsprechende Implementierung;

task body Assistent is
begin
loop
select
when Sprechstunde =>
accept betreue do
-betreuedenStudierenden
end betreue;
or
accept organisiere (Aufgabe: Aufgaben_Typ) do
-organisiere
end organisiere;
or
delay 3600.0; -Stunde
Kaffeepause;
end select;
end loop;
end Assistent;

  Wie bei der Else-Anweisung kann der Assistenten-Task auch während der Kaffeepause nicht unterbrochen werden, allerdings startet die Delay-Anweisung nach jedem eingetroffenen Aufruf eines Entry's neu.

Die Sprache erlaubt mehrere Delay-Anweisungen innerhalb einer Select-Anweisung. Klarerweise wird dann die Anweisung mit der kürzesten Zeitspanne zuerst ausgeführt. Außerdem kann eine Select-Anweisung mit einer Delay-Anweisung keinen Else-Zweig enthalten.

Klarerweise kann statt delay auch delay until stehen.

Ada erlaubt also die folgenden vier verschiedenen Möglichkeiten

  1. die normale Select-Anweisung
  2. die Select-Anweisung mit einem Else-Zweig 
  3. die Select-Anweisung mit einer Delay-Anweisung 
  4. die Select-Anweisung mit Wächtern 


next up previous contents index
Weiter: 9.5.2 Die Requeue-Anweisung Hinauf: 9.5 Das Rendezvous-Konzept Zurück: 9.5 Das Rendezvous-Konzept

Johann Blieberger
Wed Feb 11 09:58:52 MET 1998