Zum Inhalt springen

Informatik · Klasse 12 · aktualisiert

Mutex einfach erklärt: Gemeinsame Daten schützen

Du lernst, gemeinsame Daten mit einem Mutex zu schützen, Verklemmungen zu erkennen und die Aussagekraft von Tests zu beurteilen.

0 von 9 Aufgaben gelöst

Mutex einfach erklärt: Gemeinsame Daten schützen

Kurz gesagt

Ein Mutex ist hier eine Sperre mit einem Besitzer. Er schützt gemeinsame Daten, wenn alle beteiligten Zugriffe dieselbe passende Sperre für den ganzen kritischen Abschnitt beachten.

Ein Thread ist ein Ausführungsstrang innerhalb eines Programms. Nebenläufige Threads können ihre Arbeitsschritte abwechselnd oder auf mehreren Prozessorkernen gleichzeitig ausführen. Greifen sie auf gemeinsame Daten zu, müssen ihre Schritte passend aufeinander abgestimmt sein. Die folgenden ausgedachten Modelle zeigen solche Abläufe vereinfacht und setzen zuverlässig umgesetzte Sperren voraus.

Deine Lernziele

Hake ab, was du schon kannst. Löst du alle Aufgaben eines Abschnitts, hakt Termi das Ziel für dich ab.

4 Abschnitte

Eine Änderung kann aus mehreren Schritten bestehen: einen gemeinsamen Wert lesen, daraus einen neuen Wert bilden und diesen zurückschreiben. Ohne passenden Schutz können sich Schritte verschiedener Threads dazwischenschieben. Beide können dann mit demselben alten Stand arbeiten. Schreibt einer später sein Ergebnis zurück, kann er die Änderung des anderen überschreiben. Die Daten sind dann inkonsistent: Sie passen nicht mehr zu den Änderungen, die das Programm eigentlich ausführen sollte. Dieser Fehler ist eine Race Condition, also ein Fehler, dessen Auftreten von der zeitlichen Reihenfolge unzureichend abgestimmter Zugriffe abhängt.

Der kritische Abschnitt umfasst hier das zusammengehörige Lesen, Ändern und Zurückschreiben. Auch eine Prüfung mit anschließender Änderung muss gemeinsam geschützt werden, wenn ein anderer Thread den geprüften Zustand inzwischen verändern könnte. Ein Mutex ermöglicht gegenseitigen Ausschluss: Solange ein Thread die Sperre besitzt, kann kein anderer dieselbe Sperre erwerben. Die Entscheidung über den Erwerb muss unteilbar erfolgen, damit nicht zwei Threads gleichzeitig Besitzer werden.

Ein Thread erwirbt die Sperre vor dem kritischen Abschnitt und gibt sie danach frei. Alle beteiligten Zugriffe müssen dieselbe passende Sperre beachten. Das gilt auch für Leser, die mehrere zusammengehörige Angaben als stimmigen Stand benötigen. Verschiedene Sperren für dieselben Daten verhindern die störende Überlagerung nicht. Nur das Zurückschreiben zu schützen reicht ebenfalls nicht: Zwei Threads könnten vorher denselben alten Stand gelesen haben. Die Freigabe muss auch bei einem vorzeitigen Ende durch einen Fehler sichergestellt sein. Diese Abläufe beschreiben ein Modell, keinen ausführbaren Programmcode.

Definition

Mutex

Eine Sperre für gegenseitigen Ausschluss. Im hier verwendeten besitzgebundenen Modell erwirbt ein Thread die Sperre, besitzt sie während seines geschützten Zugriffs und gibt sie anschließend selbst frei.

Beispiel: Zwei Ergänzungen eines Protokolls – ausgedachtes Modell

  1. 1Der gemeinsame Text lautet zunächst „Los“. Ein Thread soll „ A“, der andere „ B“ anhängen.
  2. 2Beide lesen zunächst „Los“ und bilden daraus getrennt „Los A“ und „Los B“.
  3. 3Der erste schreibt „Los A“ zurück. Danach schreibt der zweite „Los B“ zurück.
  4. 4Am Ende fehlt „ A“. Bei vollständig nacheinander ausgeführten Ergänzungen wären beide Zusätze erhalten geblieben.
  5. 5Schützen beide das gesamte Lesen, Ergänzen und Zurückschreiben mit demselben Mutex, kann diese Überlagerung nicht auftreten.

Merke: Eine Sperre schützt Daten durch die gemeinsame Zugriffsregel. Der ganze zusammengehörige Zugriff gehört unter dieselbe passende Sperre.

Teste dich

LeichtAusgedachtes Modell: Zwei Threads ändern dieselbe Warteliste durch Lesen, Ändern und Zurückschreiben. Jeder schützt diese Schritte mit einer eigenen Sperre. Welche Änderung behebt das beschriebene Schutzproblem?

Alles auf einen Blick

Mutex

  • Gemeinsamer Schutz

    Alle beteiligten Zugriffe müssen dieselbe passende Sperre für den zusammengehörigen Abschnitt beachten.

  • Besitz

    Im besitzgebundenen Mutex-Modell gibt der Besitzer die Sperre frei; ein binär genutzter Java-Semaphor kennt keinen Besitzer.

  • Verklemmung

    Gegenseitiges Warten mit festgehaltenen Sperren kann den Fortschritt dauerhaft verhindern.

  • Aktives Warten

    Wiederholtes Prüfen verbraucht Rechenzeit; Spinlocks sind keine allgemeine Sperrlösung für Benutzerprogramme.

  • Testgrenze

    Gezielte Threadwechsel helfen beim Finden und Wiederholen von Fehlern, ersetzen aber keinen allgemeinen Korrektheitsbeweis.

Musteraufgabe · Schritt für Schritt

Zwei zusammengehörige Einstellungen schützen – ausgedachtes Modell

  1. 1Eine Anzeige speichert Farbe und Form getrennt. Erlaubte Paare sind „orange, Dreieck“ und „grün, Kreis“. Anfangs gilt „orange, Dreieck“.
  2. 2Ein Schreiber soll auf „grün, Kreis“ umstellen. Ein Leser soll beide Angaben als zusammengehöriges Paar lesen.
  3. 3Ohne Schutz könnte der Leser nach dem Ändern der Farbe, aber vor dem Ändern der Form lesen. Er bekäme das unerlaubte Paar „grün, Dreieck“.
  4. 4Wir legen deshalb einen gemeinsamen Mutex fest. Der Schreiber erwirbt ihn vor der ersten Änderung, ändert beide Angaben und gibt ihn danach frei.
  5. 5Der Leser erwirbt denselben Mutex vor dem Lesen, liest beide Angaben und gibt ihn danach frei.
  6. 6Für den Ablauf „Schreiber vollständig vor Leser“ erhält der Leser „grün, Kreis“. Für den umgekehrten Ablauf erhält er „orange, Dreieck“. Das unerlaubte Zwischenpaar bleibt ihm bei dieser Zugriffsregel verborgen.

Fehler finden

Prüfe das Ergänzen einer Teilnehmerliste – ausgedachtes Modell In einer Zeile steckt ein Fehler. Tippe sie an.

Lückentext

Wähl in jeder Lücke das passende Wort und prüf dann deine Antworten.

Beim gemeinsamen Ändern nach dem Muster „Lesen, Ändern, Zurückschreiben“ muss derselbe Mutex schützen. Im besitzgebundenen Mutex-Modell hat Thread A die Sperre erworben und noch nicht freigegeben. Eine stellvertretende Freigabe durch Thread B ist . Ein Java-Semaphor wird binär genutzt. Thread P entnimmt die einzige verfügbare Erlaubnis. Thread Q gibt anschließend eine Erlaubnis zurück. Diese Freigabe ist .

Karteikasten

Erst selbst überlegen, dann umdrehen.

Übung mit Feedback

Abschluss-Check: Mutex

LeichtAusgedachtes Mutex-Modell: Thread S besitzt die Sperre für gemeinsame Daten. Thread R wartet auf sie. Welcher nächste Schritt entspricht dem beschriebenen Schutz?
MittelAusgedachtes Modell: Ein Thread besitzt einen Spinlock, bekommt gerade aber keine Rechenzeit. Andere Threads prüfen die belegte Sperre fortlaufend. Welche Folge ist beschrieben?
SchwerAusgedachtes Testergebnis: Für ein festgelegtes Modell wurden sämtliche zugelassenen Threadwechsel ohne Befund geprüft. Das Modell enthält keinen vorzeitigen Fehlerabbruch. Was ist für die Untersuchung dieses Abbruchs nötig?

Weiterlesen in Informatik