Signale
°

  Klassisch   Rendezvous   Allgemein   Semaphor   ∘ Strich ∘     nix
   
Kl: Sa v Ws v   Rdvz: S W   Allg: S a v s   W s v a   Sem: P V     nix Kl: Sa v Ws v   Rdvz: S W   Allg: S a v s   W s v a   Sem: P V     nix
 
ClassicSignal
  • Zähler für vorliegende Signale, initial 0
  • Wartemenge für Prozesse, initial leer
  • Prozess steht in Wartemenge, obwohl Signal vorliegt, also Zähler > 0.
  • Wenn Zähler > 0, dann Wartemenge leer.
signalAsynwaitSyn
  • Wartemenge enthält Element?
    • Ja:
      • Prozess P aus Wartemenge nehmen
      • P deblockieren
    • Nein:
      • Zähler erhöhen um 1
  • Zähler > 0 ?
    • Ja:
      • Zähler vermindern um 1
    • Nein:
      • Aufrufer blockieren
      • Aufrufer in Wartemenge legen
signalTrywaitTry
  • Wartemenge enthält Element?
    • Ja:
      • Prozess P aus Wartemenge nehmen
      • P deblockieren
      • Erfolg melden
    • Nein:
      • Misserfolg melden
  • Zähler > 0 ?
    • Ja:
      • Zähler vermindern um 1
      • Erfolg melden
    • Nein:
      • Misserfolg melden
 
Semaphor
  • Zähler, initial 0 oder positiv
  • Wartemenge für Prozesse, initial leer
  • Prozess steht in Wartemenge, obwohl Zähler > 0.
  • Wenn Zähler > 0, dann Wartemenge leer.
PV
  • Zähler > 0 ?
    • Ja:
      • Zähler vermindern um 1
    • Nein:
      • Aufrufer blockieren
      • Aufrufer in Wartemenge legen
  • Wartemenge enthält Element?
    • Ja:
      • Prozess P aus Wartemenge nehmen
      • P deblockieren
    • Nein:
      • Zähler erhöhen um 1
 
Rendezvous
  • Wartemenge S für Signalgeber, initial leer
  • Wartemenge W für Signalnehmer, initial leer
  • Beide Mengen enthalten ein Element.
  • Mindestens eine Wartemenge muss leer sein. Anders ausgedrückt:
    Wenn Wartemenge S nicht leer, dann Wartemenge W leer.   (oder umgekehrt)
signalSynwaitSyn
  • Wartemenge W enthält Element?
    • Ja:
      • Prozess P aus Wartemenge W nehmen
      • P deblockieren
    • Nein:
      • Aufrufer blockieren
      • Aufrufer in Wartemenge S legen
  • Wartemenge S enthält Element?
    • Ja:
      • Prozess P aus Wartemenge S nehmen
      • P deblockieren
    • Nein:
      • Aufrufer blockieren
      • Aufrufer in Wartemenge W legen
 
UniversalSignal
  • Menge S für vorliegende Signale, initial leer
  • Menge W für erwartete Signale, initial leer
  • Ein Signal wird erwartet, obwohl es vorliegt. Also beide Mengen enthalten ein Element.
  • Wenn Menge S nicht leer, dann Menge W leer.
  • Elemente der Mengen sind Prozessreferenzen, die null sein dürfen.
  • Beide Mengen können null mehrfach enthalten.
signalAsynwaitAsyn
  • Menge W enthält Element?
    • Ja:
      • Referenz P aus Menge W nehmen
      • P deblockieren, falls nicht null
    • Nein:
      • Referenz null in Menge S legen
  • Menge S enthält Element?
    • Ja:
      • Referenz P aus Menge S nehmen
      • P deblockieren, falls nicht null
    • Nein:
      • Referenz null in Menge W legen
signalSynwaitSyn
  • Menge W enthält Element?
    • Ja:
      • Referenz P aus Menge W nehmen
      • P deblockieren, falls nicht null
    • Nein:
      • Aufrufer blockieren
      • Aufrufer in Menge S legen
  • Menge S enthält Element?
    • Ja:
      • Referenz P aus Menge S nehmen
      • P deblockieren, falls nicht null
    • Nein:
      • Aufrufer blockieren
      • Aufrufer in Menge W legen
signalTrywaitTry
  • Menge W enthält Element?
    • Ja:
      • Referenz P aus Menge W nehmen
      • P deblockieren, falls nicht null
      • Erfolg melden
    • Nein:
      • Misserfolg melden
  • Menge S enthält Element?
    • Ja:
      • Referenz P aus Menge S nehmen
      • P deblockieren, falls nicht null
      • Erfolg melden
    • Nein:
      • Misserfolg melden