Kanäle
°

  Kanal   Ref-Kanal   V-Aufgabe   ∘ Strich ∘     nix
   
Senden: A V S a' s'a t   Empfangen: S V A   V-Aufg: sS sA rT rS     nix Senden: A V S a' s'a t   Empfangen: S V A   V-Aufg: sS sA rT rS     nix
 
IAD sendAsynIAD sendTry
Kanal
  • Menge SN für Tupel aus (Sender, Nachricht). Sender optional, Nachricht als Verweis.
  • Menge EP für Tupel aus (Empfänger, Puffer). Empfänger optional, Empfangspuffer als Verweis.
  • Kanalpuffer für Nachrichten
  • Eine Nachricht liegt rum, obwohl sie zugestellt werden könnte. Also beide Mengen enthalten ein Element.
  • Wenn Menge SN nicht leer, dann Menge EP leer.
Referenz-Kanal
  • Menge SN für Tupel aus (Sender, Nachricht). Sender optional, Nachricht als Verweis.
  • Menge EP für Tupel aus (Empfänger, Puffer). Empfänger optional, Empfangspuffer als Verweis.
  • Eine Nachricht liegt rum, obwohl sie zugestellt werden könnte. Also beide Mengen enthalten ein Element.
  • Wenn Menge SN nicht leer, dann Menge EP leer.
 
Senden asynchronEmpfangen asynchron
  • Menge EP ist leer?
    • Ja:     Beschreibung für Wertablage
      • Nachricht in Kanalpuffer kopieren
      • ( - ,Kopie) in Menge SN legen
    • Nein:
      • (E,P) aus Menge EP nehmen
      • Nachricht in P kopieren
      •  
      • E deblockieren falls vorhanden
  • Menge SN ist leer?
    • Ja:
      •  
      • ( - ,Puffer) in Menge EP legen
    • Nein:
      • (S,N) aus Menge SN nehmen
      • N in Puffer kopieren
      • Kanalpuffer von N freigeben falls benutzt
      • S deblockieren falls vorhanden
Senden synchronEmpfangen synchron
  • Menge EP ist leer?
    • Ja:     Beschreibung für Referenzablage
      • Aufrufer blockieren
      • (Aufrufer,Nachr.) in Menge SN legen
    • Nein:
      • (E,P) aus Menge EP nehmen
      • Nachricht in P kopieren
      •  
      • E deblockieren falls vorhanden
  • Menge SN ist leer?
    • Ja:
      • Aufrufer blockieren
      • (Aufrufer,Puffer) in Menge EP legen
    • Nein:
      • (S,N) aus Menge SN nehmen
      • N in Puffer kopieren
      • Kanalpuffer von N freigeben falls benutzt
      • S deblockieren falls vorhanden
Senden versuchendEmpfangen versuchend
  • Menge EP ist leer?
    • Ja:
      • Misserfolg melden
    • Nein:
      • (E,P) aus Menge EP nehmen
      • Nachricht in P kopieren
      •  
      • E deblockieren falls vorhanden
      • Erfolg melden
  • Menge SN ist leer?
    • Ja:
      • Misserfolg melden
    • Nein:
      • (S,N) aus Menge SN nehmen
      • N in Puffer kopieren
      • Kanalpuffer von N freigeben falls benutzt
      • S deblockieren falls vorhanden
      • Erfolg melden
Ungewöhnliche Kombinationen beim Senden...
Senden asynchron (Ref) Senden synchron (Wert)
  • Menge EP ist leer?
    • Ja:     Beschreibung für Referenzablage
      •  
      • ( - ,Nachr.) in Menge SN legen
    • Nein:
      • (E,P) aus Menge EP nehmen
      • Nachricht in P kopieren
      •  
      • E deblockieren falls vorhanden
  • Menge EP ist leer?
    • Ja:     Beschreibung für Wertablage
      • Aufrufer blockieren
      • Nachricht in Kanalpuffer kopieren
      • (Aufrufer,Kopie) in Menge SN legen
    • Nein:
      • (E,P) aus Menge EP nehmen
      • Nachricht in P kopieren
      • E deblockieren falls vorhanden
V-Aufgabe: Kanal mit Puffer
  • Menge NP für Tupel (Nachrichtenreferenz, Prozess). Initial leer. Prozess darf null sein.
  • Menge ZP für Tupel (Zielreferenz, Prozess). Initial leer. Prozess darf nicht null sein.
  • Pufferspeicher PS für Nachrichten, Größe begrenzt. Initial leer.
  • Sowohl NP als auch ZP enthalten ein Element.
  • PS enthält eine Nachricht, die NP nicht referenziert.
Senden synchronEmpfangen versuchend
  • Nachricht zu groß? ⇒ Abbruch mit Fehler
  • ZP enthält Element?
    • Ja:
      • Tupel (Zielreferenz, Prozess) aus ZP nehmen
      • Nachricht in Zielbereich kopieren
      • Prozess deblockieren
    • Nein:
      • Aufrufer blockieren
      • (Nachrichtenreferenz, Aufrufer) in NP legen
  • NP enthält Element?
    • Ja:
      • Tupel (Nachrichtenreferenz, Prozess) aus NP nehmen
      • Nachricht in Zielbereich kopieren
      • Prozess deblockieren, falls nicht null
      • Nachricht in PS freigeben, falls von dort
      • Erfolg melden
    • Nein:
      • Misserfolg melden
Senden asynchronEmpfangen synchron
  • Nachricht zu groß? ⇒ Abbruch mit Fehler
  • ZP enthält Element?
    • Ja:
      • Tupel (Zielreferenz, Prozess) aus ZP nehmen
      • Nachricht in Zielbereich kopieren
      • Prozess deblockieren
    • Nein:
      • Nicht genug Platz in PS? ⇒ Abbruch mit Fehler
      • Nachricht in PS kopieren
      • (Kopiereferenz, null) in NP legen
  • NP enthält Element?
    • Ja:
      • Tupel (Nachrichtenreferenz, Prozess) aus NP nehmen
      • Nachricht in Zielbereich kopieren
      • Prozess deblockieren, falls nicht null
      • Nachricht in PS freigeben, falls von dort
    • Nein:
      • Aufrufer blockieren
      • (Zielreferenz, Aufrufer) in ZP legen