Trägt der Zwei-Prozess-Algorithmus für gegenseitigen Ausschluss von Peterson den Sterbeprozessen Rechnung?

  • Ich denke, dass in der Algorithmus von Peterson für gegenseitiger Ausschluss , wenn der Prozess, der zuerst in den kritischen Abschnitt eintritt, stirbt oder abgebrochen wird, der andere Prozess würde für immer eine Schleife durchlaufen und auf den Eintritt in den kritischen Abschnitt warten.

    Wenn Prozess 1 angehalten wird, werden die restlichen Prozesse hinter Prozess 1 im Bild bis zu dem Punkt von Prozess 1 ausgeführt ist aber dann eine Schleife.

    Trägt der Zwei-Prozess-Algorithmus für gegenseitigen Ausschluss von Peterson den Sterbeprozessen Rechnung?

    Was passiert, wenn der Prozess, der den kritischen Abschnitt erreicht, erst stirbt, bevor er ihn verlässt?

    20 January 2013
    Raphael
1 answer
  • Dies hängt davon ab, wie Sperren implementiert werden. Wenn Sie es wie im Wikipedia-Artikel tun, d. H. Den kritischen Abschnitt mit einem Booleschen Prozess pro Prozess schützen¹, haben Sie sicherlich Probleme. Wenn ein Prozess stirbt, setzt er sein Flag nie zurück, sodass der andere Prozess für immer in einer Schleife ausgeführt wird.

    In der Praxis können Sie Ihren Code gegen viele Arten des Todes schützen. Nehmen Sie zum Beispiel diese Java-ähnliche Implementierung:

    flag[1] = true;
    turn = 1;
    while ( flag[0] == true && turn == 1 ) { Thread.yield(); }
    try {
      // critical section
    }
    finally {
      flag[1] = false;
    }
     

    Dadurch wird sichergestellt, dass das Flag zurückgesetzt wird, was auch immer geschieht der kritische Abschnitt, solange das System den Fehler behandelt. In Java gilt dies auch für Stack- und Heap-Überläufe. Wenn also der Prozess nicht buchstäblich verschwindet, Prozessorausfall, Netzwerkunterbrechung, ...), sind Sie sicher. Beachten Sie, dass die meisten nicht kritischen Programme in diesen Fällen ausfallen. Wie kann sie einen Fehler beheben, wenn er nicht ausgeführt wird? - so muss dies in vielen Fällen akzeptiert werden. Sie können Inkonsistenzen bei einem Neustart behandeln, wenn dies erforderlich ist.

    Wenn Sie ordnungsgemäße Sperren auf Sprachebene verwenden, kann das Laufzeitsystem verschwindende Sperreneigentümer behandeln, d. H. Freigabesperren mit toten Besitzern. Sie können dies selbst simulieren, indem Sie jedem Prozess einen Schalter für einen toten Mann geben, den andere lesen können, oder direkt überprüfen, ob der Prozess zum Sperren von Inhalten noch aktiv ist (sofern das System dies unterstützt).


    1. Das skaliert ohnehin nicht gut.
    2. In Java sollte ich k finalize auch ausführen n kill, aber dies ist nicht garantiert durch die Spezifikation . kill -9 ist wahrscheinlich eine Todesstrafe für jede Lösung, für die der Sterbeprozess etwas zu tun hat.
    16 August 2012
    Raphael