next up previous
Next: Eine Schnittstelle für Rendezvous Up: Rendezvous Previous: Rendezvous

Rendezvous in Ada

Rendezvous basieren auf der Prämisse, daß Synchronisierungen und Datenübertragungen nicht voneinander zu trennen sind. Die Kommunikation in CSP beruht darauf, und CSP hat seinerseits sehr das Rendezvous-Konzept in Ada beeinflußt. Der Sinn dieser Prämisse liegt in der leichteren Beweisführung. Wenn der Datenlieferant T1 eine Vorbedingung P bezüglich seines Zustands zum Zeitpunkt der Datenübertragung erfüllt, dann kann der Datenempfänger T2 zum Zeitpunkt des Empfangs immer noch von P ausgehen. Diese Art der Beweistechnik wurde schon beim Monitorkonzept von Hoare vorgeschlagen.

Wie der Name bereits nahelegt, findet ein Rendezvous immer zwischen genau zwei Tasks statt. Eine Task bietet hier einen Service (entry) an, der von anderen in Anspruch genommen werden kann. Der Service-Anbieter erfährt dabei nicht die Identität des Interessenten, während auf der anderen Seite die den Service ausnutzende Task den Service-Anbieter kennen muß.

Zusätzlich ist es möglich, auf verschiedene Ereignisse gleichzeitig zu reagieren. Dabei kann die Akzeptanz von dem lokalen Zustand der Tasks abhängig gemacht werden und u.U. von der Anzahl der Tasks, die auf einen bestimmten Service warten. Das läßt sich an einem Beispiel für einen Ringpuffer demonstrieren:[*]

task BUFFERING is
   entry READ (V : out ITEM);
   entry WRITE(E : in  ITEM);
end;

task body BUFFERING is
   SIZE      : constant INTEGER := 10;
   BUFFER    : array (1 .. SIZE) of ITEM;
   INX, OUTX : INTEGER range 1 .. SIZE := 1;
   COUNT     : INTEGER range 0 .. SIZE := 0;
begin
   loop
      select
         when COUNT < SIZE =>
            accept WRITE(E : in  ITEM) do
               BUFFER(INX) := E;
            end;
            INX := INX mod SIZE + 1;
            COUNT := COUNT + 1;
      or
         when COUNT > 0 =>
            accept READ (V : out ITEM) do
               V := BUFFER(OUTX);
            end;
            OUTX := OUTX mod SIZE + 1;
            COUNT := COUNT - 1;
      end select;
   end loop;
end BUFFERING;

Die Bedingungen vor den accept-Anweisungen (guards) werden zu Beginn der select-Anweisung alle bewertet. Nur die Bedingungen, die mit TRUE bewertet worden sind, kommen dann in die Auswahl einer der accept-Anweisungen.


next up previous
Next: Eine Schnittstelle für Rendezvous Up: Rendezvous Previous: Rendezvous
Andreas Borchert
2/2/1998