Einstieg
°

  Semaphor #   Zelle #   Hazy #   ∘ Strich ∘     nix
   
Sem: P V   Zelle: g t g' t'   Hazy: r s     nix Sem: P V   Zelle: g t g' t'   Hazy: r s     nix
 
HazyCondition
  • Flag ob Bedingung derzeit erfüllt, initial gelöscht
  • Wartemenge für Prozesse, initial leer
  • Prozess steht in Wartemenge, obwohl Flag gesetzt.
  • Wenn Flag gesetzt, dann Wartemenge leer.
Operation Flag Wartemenge
required() löschen hinein, blockieren
satisfied() setzen heraus, deblockieren
requiredsatisfied
  • Flag gesetzt?
    • Ja:
      • Flag löschen
    • Nein:
      • Aufrufer blockieren
      • Aufrufer in Wartemenge legen
  • Wartemenge enthält Element?
    • Ja:
      • Prozess P aus Wartemenge nehmen
      • P deblockieren
    • Nein:
      • Flag setzen
 
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.
Operation Zähler Wartemenge
P() runter hinein, blockieren
V() hoch heraus, deblockieren
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
 
Zelle
  • Flag ob Zelle gefüllt, initial gelöscht (Zelle leer)
  • Inhalt der Zelle falls gefüllt, initial egal (weil nicht gefüllt)
  • Wartemenge für Prozesse, initial leer
  • Prozess steht in Wartemenge, obwohl Zelle gefüllt, also Flag gesetzt.
  • Wenn Flag gesetzt, dann Wartemenge leer.
Operation Flag Inhalt Wartemenge
give() setzen merken hinein, blockieren
take() löschen (vergessen) heraus, deblockieren
give (Wert)take(): Wert
  • Wartemenge enthält Element?
    • Ja:
      • Prozess P aus Wartemenge nehmen
      • Rückgabe-Wert von P setzen
      • P deblockieren
    • Nein:
      • Inhalt auf Wert setzen
      • Flag setzen Zelle nun gefüllt
  • Flag gesetzt? d.h. Zelle gefüllt?
    • Ja:
      • Inhalt als Rückgabewert nehmen
      • Flag löschen Zelle nun leer
    • Nein:
      • Aufrufer blockieren
      • Aufrufer in Wartemenge stecken
give' (Wert)take'(): Wert
  • Wartemenge ist leer?
    • Ja:
      • Inhalt auf Wert setzen
      • Flag setzen Zelle nun gefüllt
    • Nein:
      • Prozess P aus Wartemenge nehmen
      • Rückgabe-Wert von P setzen
      • P deblockieren
  • Flag gelöscht? d.h. Zelle leer?
    • Ja:
      • Aufrufer blockieren
      • Aufrufer in Wartemenge stecken
    • Nein:
      • Inhalt als Rückgabewert nehmen
      • Flag löschen Zelle nun leer