Sperren
°

  Mutex #   Barrier #   Semaphor #   ∘ Strich ∘     nix
   
Mu: L v U vk v   Ba: L U S   Sem: P V     nix Mu: L v U vk v   Ba: L U S   Sem: P V     nix
 
IAD lockSynIAD lockTry
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
 
Mutex
  • Flag ob Sperre frei, initial gesetzt
  • Wartemenge für Prozesse, initial leer
  • Prozess steht in Wartemenge, obwohl Sperre frei, also Flag gesetzt.
  • Wenn Flag gesetzt, dann Wartemenge leer.
Operation Flag Wartemenge
lockSyn() löschen hinein, blockieren
unlockAsyn() setzen heraus, deblockieren
lockTry() löschen
unlockTry() heraus, deblockieren
lockSynunlockAsyn
  • Flag gesetzt? Sperre noch frei?
    • 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 Sperre frei
lockTryunlockTry
  • Flag gesetzt? Sperre noch frei?
    • Ja:
      • Flag löschen
      • Erfolg melden
    • Nein:
      • Misserfolg melden
  • Wartemenge enthält Element?
    • Ja:
      • Prozess P aus Wartemenge nehmen
      • P deblockieren
      • Erfolg melden
    • Nein:
      • Misserfolg melden Aufrufer behält Sperre
 
  • Schranke k, initial wählbar
  • Zähler wieviele "drin" sind, initial 0
  • Wartemenge für Prozesse, initial leer
  • Prozess steht in Wartemenge, obwohl Zähler < k.
  • Wenn Zähler < k, dann Wartemenge leer.
Operation Zähler Wartemenge Schranke k
lockSyn() erhöhen hinein, blockieren
unlockAsyn() vermindern heraus, deblockieren
setLimit() erhöhen heraus, deblockieren setzen
lockSynunlockAsyn
  • Zähler < k ? Sperre noch frei?
    • Ja:
      • Zähler erhöhen
    • Nein:
      • Aufrufer blockieren
      • Aufrufer in Wartemenge stecken
  • Zähler = 0 ? Sperre nicht gesetzt?
    • Abbruch mit Fehler
  • Wartemenge ist leer oder Zähler >= k ?
    • Ja:
      • Zähler vermindern
    • Nein:
      • Prozess P aus Wartemenge nehmen
      • P deblockieren
setLimit
  • k auf neuen Wert setzen
  • solange Zähler < k und Wartemenge nicht leer:
    • Prozess P aus Wartemenge nehmen
    • P deblockieren
    • Zähler erhöhen