10. Parallele Prozesse | ||||||
|
||||||
10.7.6 On Requeue-Anweisung
Jeder Eingang eines Prozesses besitzt eine Warteschlange ("queue"), in der die Eingangsaufrufe nacheinander in der Reihenfolge ihres Eintreffens aufgereiht sind. Eine Warteschlange an einem Eingang ist nach dem "FIFO"-Prinzip ("first in, first out") aufgebaut. Akzeptiert der Prozeß einen Ruf, so wird für den ersten - er ist am längsten in der Warteschlange - das Rendezvous eingeleitet. Stellt ein Prozeß fest, daß der von ihm akzeptierte Eingangsaufruf, nachdem er ihn analysiert hat, an ihn eine Anforderung stellt, die er momentan nicht erfüllen kann, so kann der Prozeß diesen Eingangsaufruf an denselben oder einen anderen Eingang weiterleiten. Er kann dies mit der Requeue-Anweisung tun, obwohl das Rendezvous schon begonnen hat. Folgende zwei Einschränkungen sind zu beachten:
Die Requeue-Anweisung kann mit dem Zusatz "with abort" versehen werden. Dann wird eine Bedingung, die an dem Eingangsaufruf haftet (z. B. eine Zeitschranke, siehe zeitlich befristeter Eingangsaufruf) "weitergereicht". Bei einer Zeitschranke wird das ursprüngliche Verfallsdatum übernommen. Fehlt der Zusatz "with abort", so gelten die Bedingungen nicht mehr. Damit wird die Anforderung des rufenden Prozesses unterlaufen. Es ist wichtig, dies bei Verwendung der Requeue-Anweisung zu berücksichtigen. Da ein aufrufender Prozeß, der z. B. nur 0,2 Sekunden auf ein Rendezvous warten will oder gar nur ein Rendezvous akzeptiert, wenn es sofort stattfinden kann, durch die Requeue-Anweisung gezwungen wird, über seine Vorgaben hinaus zu warten. Ein Prozeß, der intern mit der Requeue-Anweisung ohne den Zusatz "with abort" operiert, muß das in seiner Spezifikation unbedingt kommentieren. Beispiel 1:
Anweisung (A) würde die Zeichenkette "s" an den Eingang "b_input" weiterreichen. Anweisung (B) reicht außerdem eventuelle Bedingungen des Eingangsaufrufes weiter. Beispiel 2: Es gebe eine variable Anzahl von Kanälen zur Übertragung von Nachrichten, die sich in ihrer Bandbreite (d. h. Anzahl Zeichen pro Sekunde) unterscheiden. Über diese Kanäle tauschen verschiedene Prozesse textuelle und prioritär gestaffelte Nachrichten aus. Wichtige Nachrichten sind möglichst schnell zu senden. Zur Vereinfachung soll gelten, daß Sender und Empfänger in der Nachricht kodiert sind und jeder potentielle Empfänger alle Kanälen abhorcht, ob eine Nachricht für ihn gesendet wird. Die Kanäle sind nicht ausfallsicher. Die Nachrichten sind nicht länger als 1024 Zeichen. Lösung: Es soll einen Prozeß geben, der einen Eingang mit zwei Parametern aufweist. Der erste Parameter nimmt die Priorität an und der zweite Parameter die Nachricht. Je wichtiger eine Nachricht ist, um so eher wird sie über einen Kanal mit großer Bandbreite gesendet. Fallen Kanäle aus, so werden unwichtige Nachrichten zugunsten wichtigerer Nachrichten zurückgestellt. Der Prozeß wird so entworfen, daß nicht der Text selber zwischengespeichert wird, sondern die Aufforderung zum Senden. Dies hat den Vorteil, daß der Prozeß, der eine Nachricht senden will, Kenntnis erlangt, ob und wann seine Nachricht gesendet wurde. Außerdem entfällt dadurch die Notwendigkeit, daß Speicherplatz (dynamisch) bereitgestellt werden muß.
Als erstes wird geprüft, welche Kanäle frei sind. Davon abhängig wird die Schranke ("max_bandbreite") gesetzt, die entscheidet, welche Nachricht gesendet wird. Dann wird nachgesehen, ob eine neue Nachricht anliegt. Jede Nachricht ist priorisiert. Ist die Priorität gering, so wird die Nachricht mit Priorität im Eingang "puffer" zwischengespeichert. Ist die Priorität hoch, so wird die Nachricht nicht zwischengespeichert, sondern sofort weiterverarbeitet. Nach dem ersten "select" wird gefragt, ob eine neue Nachricht angenommen wurde, wenn nicht, so wird im zweiten "select" geprüft, ob irdendeine alte Nachricht gesendet werden muß. Die alte Nachricht wird mit ihrer Priorität der Warteschlange von "puffer" entnommen. Ist die Priorität gering, so wird sie sofort an die Warteschlange wieder angehängt. Die letzte If-Anweisung prüft, ob eine Nachricht zu senden ist; wenn nicht, so wird 0,7 Sekunden gewartet, wenn ja, so wird sie gesendet. |
||||||
|