Ich denke, dass in Petersons Algorithmus zum gegenseitigen Ausschluss , wenn der Prozess, der zuerst in den kritischen Abschnitt eintritt, sterben oder abgebrochen wird, der andere Prozess für immer eine Schleife durchläuft und darauf wartet, in den kritischen Abschnitt einzutreten.
Wenn in Prozess 1 Prozess 1 gestoppt wird, werden die restlichen Prozesse hinter Prozess 1 bis zu der Stelle ausgeführt, an der sich Prozess 1 befindet, dann aber eine Schleife.
Was passiert, wenn der Prozess, der den kritischen Abschnitt erreicht, zuerst stirbt, bevor er ihn verlässt?
Antworten:
Dies hängt davon ab, wie Sperren implementiert werden. Wenn Sie es wie im Wikipedia-Artikel tun, dh den kritischen Abschnitt mit einem Booleschen Wert pro Prozess¹ schützen, sind Sie mit Sicherheit in Schwierigkeiten. Wenn ein Prozess stirbt, wird sein Flag niemals zurückgesetzt, sodass der andere Prozess für immer wiederholt wird.
In der Praxis können Sie Ihren Code vor vielen Arten des Sterbens schützen. Nehmen Sie zum Beispiel diese Implementierung im Java-Stil:
Dadurch wird sichergestellt, dass das Flag zurückgesetzt wird, was auch immer im kritischen Abschnitt passiert, solange das System den Fehler behandelt. In Java gilt dies auch für Stapel- und Heap-Überläufe. Wenn der Prozess nicht buchstäblich verschwindet (
kill
², Prozessorausfall, Netzwerkunterbrechung, ...), sind Sie sicher. Beachten Sie, dass die meisten unkritischen Programme in diesen Fällen fehlschlagen. Wie kann sie mit einem Fehler umgehen, den sie nicht ausführen? - Das muss also in vielen Fällen akzeptiert werden. Bei Bedarf können Sie beim Neustart mit Inkonsistenzen umgehen.Wenn Sie geeignete Sperren auf Sprachebene verwenden, kann das Laufzeitsystem verschwindende Sperrenbesitzer verarbeiten, dh Sperren mit toten Besitzern freigeben. Sie können dies selbst simulieren, indem Sie jedem Prozess einen Totmannschalter geben, den die anderen lesen können, oder direkt prüfen, ob der Prozess des Schlossbesitzes noch aktiv ist (sofern das System dies unterstützt).
finalize
nach auch auf ausgeführt werdenkill
, aber dies wird durch die Spezifikation nicht garantiert.kill -9
ist wahrscheinlich ein Todesurteil für jede Lösung, bei der der Sterbevorgang etwas unternehmen muss.quelle
Schauen Sie sich die Annahmen an, insbesondere, dass kein Prozess auf unbestimmte Zeit im kritischen Bereich verbleibt (dazu gehört sicherlich auch das Weggehen). Ich glaube nicht, dass es einen Weg gibt, dieses allgemeine Problem mit einem Synchronisationsmechanismus zu lösen.
quelle