2.3 Klassifizierung von Kommunikationsdiensten synonym: Nachrichtensystem/dienst (message service) Kommunikationssystem/dienst (communication service) Transportsystem/dienst (transport service) Grundsätzliche semantische Gemeinsamkeit: Senden/Empfangen einer Nachricht beinhaltet Kopieren – zwei (oder mehr) disjunkte Prozesse/Prozessoren A, B (C, ...) kooperieren zum Zweck des Kopierens eines Wertes von A nach B (C, ...) Kommunikationsdienste variieren im Hinblick auf [2.3.1] Übertragungssemantik [2.3.2] Adressierung der Kommunikationspartner [2.3.3] Konfigurierung von Prozessen und Kanälen [2.3.4] Disjunktives Warten Pseudocode für Senden und Empfangen: send mesval [ to destination ] Typ T Typ D<T> recv mesvar [ from source ] Typ T Typ S<T> 2.3.1 Übertragungssemantik Pufferung, Empfangsfolge, Flußsteuerung/Synchronisation, Zuverlässigkeit Pufferung: - keine - begrenzt - unbegrenzt Empfangsfolge: - permutiertes Präfix der Sendefolge - Präfix der Sendefolge (reihenfolgetreu, FCFS; Puffertyp = Sequence<T> ) - Strom (stream): Puffertyp = T = Sequence<B> Flußsteuerung und Synchronisation: Empfangen: blockierend (blocking) bis Nachricht vorliegt, nichtblockierend (non-blocking), d.h. - Leeroperation, evtl. mit Ausnahmemeldung, oder - nochmaliges Lesen einer zuvor empfangenen Nachricht Senden: blockierend bis Nachricht absendbar, nichtblockierend, d.h. - Leeroperation, evtl. mit Ausnahmemeldung, oder - Überschreiben einer zuvor gesendeten und noch nicht empfangenen Nachricht Klassifikation von Blockaden: blockierendes recv ist beendet, wenn (alternativ) Bezeichner mesvar an das Nachrichtensystem übergeben ist - asynchrones recv mesvar den empfangenen Wert enthält - synchrones recv blockierendes send ist beendet, wenn (alternativ) Ausdruck mesval an das Nachrichtensystem übergeben ist - asynchrones send Wert von mesval durch das Nachrichtensystem kopiert ist - synchrones send Empfänger die Kopie übernommen hat - quittiertes send Im asynchronen Fall Benachrichtigung typischerweise durch Software-Unterbrechung (software interrupt, signal) Zuverlässigkeit: Empfangsfolge evtl. gefährdet durch - Verlust - Duplizierung - (Verstümmelung) von Nachrichten 2.3.2 Adressierung Beachte: Kommunikation ist nicht beschränkt auf das Szenario „2 miteinander verbundene Kommunikationspartner“ ohne Adressierung: send mesval recv mesvar [ from procvar ] produziert Nachricht (evtl. mit Absender) übernimmt Nachricht (und gegebenenfalls Absender) ! Nur ein Nachrichtentyp möglich, z.B. String prozeßbezogen: (typischerweise auch mit einem Nachrichtentyp) send mesval to procval recv mesvar from procval send mesval to procval recv mesvar [ from procvar ] Modell: jeder Prozeß verfügt über eigene mailbox send mesval [ to procvar ] recv mesvar from procval (Umkehrung des Modells – exotisch!) prozeßgruppenbezogen: (group communication, multicast) Es gibt einen Typ ProcessGroup, und Prozesse können einer Gruppe beitreten und sie verlassen: ... groupval.enter(); ... ; groupval.leave(); ... send mesval to groupval recv mesvar [ from procvar ] kanalbezogen: Kanal als eigenständiges, explizit benennbares Pufferobjekt send mesval to channel recv mesvar from channel channel.send(mesval); mesvar = channel.recv(); Port = formaler Kanalparameter eines Prozesses, häufig exklusiv entweder nur als Eingabe-Port für recv oder nur als Ausgabe-Port für send alternativ: Port = einem Prozeß fest zugeordneter Eingabekanal send mesval to proc.port recv mesvar from port 2.3.3 Konfigurierung = Einrichten von Prozessen und evtl. Kanälen sowie Binden, d.h. Aktualisierung formaler Parameter vom Typ Prozeß, Kanal, Port, ... Statisches Binden: • Hardware: • Software: durch „Strippenziehen“ zwischen Rechnern mittels Konfigurationssprache, z.B. Unix Shell für Pipelines: who | sort | lpr Adressierung kanalbezogen: Kanal = pipe Ports = stdin, stdout Dynamisches Binden: Prozesse besorgen die Konfigurierung selbst - Wiederverwendbarkeit in anderen Kontexten begrenzt - jederzeit dynamische Umkonfigurierung möglich Dynamische Erzeugung von Prozessen und Kanälen und Binden durch geeignetes Initialisieren Namensdienste erlauben das Auffinden von bereits vorhandenen Prozeß- bzw. Kanalobjekten 2.3.4 Disjunktives Warten Beispiel: Auftraggeber client Auftragnehmer ... recv ... send ... recv ... send ... Unterauftragnehmer server request from client; ? subrequest to server; subresult from server; result to client; ? Besser: nichtdeterministisch disjunktives Warten (auch „externe Auswahl“) ... select recv request from client; process request; | recv subresult from server; process subresult; | timeout t do cleanup end; ... t = 0 wirkt wie ein otherwise/else-Konstrukt t = wirkt wie fehlende Timeout-Klausel ! Alternative: Threads verwenden !