Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Race Condition in Promela finden

Nach dieser Lektion: Ich kann eine Race Condition in der Ablaufspur eines Programms finden.

Lektion, 55 Min.6 BefehleLab für formale Methoden: Z3, SPIN, TLA+ und Alloy in einer VM

Das letzte Brot wird zweimal verkauft

Eine Race Condition (Wettlaufsituation) entsteht, wenn das Ergebnis eines Programms davon abhängt, in welcher Reihenfolge zwei Abläufe ihre Schritte ausführen. Sie ist schwer zu finden, weil sie nur manchmal auftritt.

Eine Bäckerei hat noch ein Brot. Zwei Verkäufer prüfen gleichzeitig, ob eines da ist, und verkaufen es beide. Das Modellprüfprogramm SPIN findet diese Reihenfolge, indem es alle durchprobiert.

Am Ende dieser Lektion

Notiz

Ich kann eine Race Condition in der Ablaufspur eines Programms finden.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Prozessein Ablauf aus Schritten, der neben anderen läuft
Nebenläufigkeitmehrere Prozesse laufen zur selben Zeit
Interleavingeine bestimmte Mischung der Schritte mehrerer Prozesse
Race Conditiondas Ergebnis hängt von der Reihenfolge der Schritte ab
Zusicherung (assert)eine Bedingung, die an einer Stelle gelten mussassert(verkauft <= 1)
Ablaufspur (Trace)die Schritte, die zu einem Fehler führen

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Zwei Abläufe lassen sich beliebig mischen

Zwei Prozesse laufen nebenläufig: Der Rechner führt immer nur einen Schritt eines Prozesses aus, wechselt aber dazwischen, wann er will. Jede mögliche Folge heißt Interleaving.

Im Verkaufsbeispiel hat jeder Verkäufer vier Schritte: prüfen, zählen, Brot nehmen, nachprüfen. Die Tabelle zeigt eine Mischung, die schiefgeht.

Eine Mischung, bei der zweimal verkauft wird

SchrittWerWasbrotverkauft
1Aprüft: brot > 0 ist wahr10
2Azählt: verkauft + 111
3Bprüft: brot > 0 ist noch wahr11
4Animmt das Brot01
5Aprüft: verkauft <= 1 ist wahr01
6Bzählt: verkauft + 102
7Bnimmt ein Brot, das es nicht gibt2552
8Bprüft: verkauft <= 1 ist falsch2552

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Promela beschreibt die Verkäufer als Prozesse

SPIN liest Modelle in der Sprache Promela. byte legt eine kleine Zahl an. active [2] proctype verkaeufer() startet zwei Prozesse mit demselben Ablauf.

-> trennt Schritte, if :: ... fi wählt einen Fall, dessen erster Schritt ausführbar ist. assert bricht ab, wenn die Bedingung falsch ist.

Das Modell der Bäckerei

Code: c
byte brot = 1
byte verkauft = 0
active [2] proctype verkaeufer() {
  if
  :: brot > 0 -> verkauft++ -> brot-- -> assert(verkauft <= 1)
  :: else -> skip
  fi
}

Das Modell in eine Datei schreiben und prüfen

Der erste Befehl legt einen Ordner an, der zweite schreibt das Modell in eine Datei. printf '%s\n' gibt jeden Text in Anführungszeichen als eigene Zeile aus. Danach prüft spinrun die Datei.

Ihre Dateien im Lab bleiben unberührt: Das Modell liegt in einem eigenen Ordner.

Einen Ordner anlegen

Befehl
mkdir -p ~/werkstatt

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das Modell schreiben

Befehl
printf '%s\n' 'byte brot = 1' 'byte verkauft = 0' 'active [2] proctype verkaeufer() {' '  if' '  :: brot > 0 -> verkauft++ -> brot-- -> assert(verkauft <= 1)' '  :: else -> skip' '  fi' '}' > ~/werkstatt/brot.pml

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Wie viele Fehler findet SPIN?

Befehl
spinrun ~/werkstatt/brot.pml | grep -o "errors: [0-9]*"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Welche Zusicherung bricht?

Befehl
spinrun ~/werkstatt/brot.pml | grep "assertion violated"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Ablaufspur zeigt die schlechte Mischung

Bei einem Fehler behält spinrun die Ablaufspur in einer Datei neben dem Modell. spin -t -p spielt sie Schritt für Schritt ab.

Wer die Spur liest, sucht die Stelle, an der ein Prozess etwas prüft und ein anderer es ändert, bevor der erste handelt. Der Befehl zählt, wie oft die Prüfung brot>0 in der Spur vorkommt.

Wie oft prüft die Spur brot > 0?

Befehl
spin -t -p ~/werkstatt/brot.pml | grep -c "brot>0"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Mischungen bei 4 und 4 Schritten zählen

Befehl
python3 -c "print(__import__('math').comb(8, 4))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele denken: Prüfen und Handeln in einer Zeile sind ein einziger Schritt. Das stimmt nicht, denn jeder einzelne Schritt kann unterbrochen werden. Zwischen dem Prüfen und dem Nehmen darf ein anderer Prozess laufen.

Weiterführend

Ändern Sie das Modell so, dass es 3 Brote und 4 Verkäufer gibt: byte brot = 3 und active [4]. Ändern Sie auch die Zusicherung auf verkauft <= 3. Prüfen Sie es erneut und lesen Sie die Spur.

Überlegen Sie, wie man die beiden Schritte „prüfen“ und „nehmen“ zu einem einzigen machen könnte. Die nächste Lektion zeigt eine Lösung.

Über dieses Lab und seinen Quellcode: Lab für formale Methoden: Z3, SPIN, TLA+ und Alloy in einer VM

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.