Kann jemand bitte mit Beispielen (von Code) erklären, was der Unterschied zwischen Deadlock und Livelock ist ?
multithreading
pthreads
deadlock
livelock
Macindows
quelle
quelle
Antworten:
Entnommen aus http://en.wikipedia.org/wiki/Deadlock :
quelle
Livelock
Der Hauptunterschied zwischen Livelock und Deadlock besteht darin, dass Threads nicht blockiert werden, sondern kontinuierlich versuchen, aufeinander zu reagieren.
In diesem Bild versuchen beide Kreise (Threads oder Prozesse), dem anderen Raum zu geben, indem sie sich nach links und rechts bewegen. Aber sie können sich nicht weiter bewegen.
quelle
Alle Inhalte und Beispiele hier stammen von
Betriebssysteme: Interna und Konstruktionsprinzipien
William Stallings
8º Edition
Deadlock : Eine Situation, in der zwei oder mehr Prozesse nicht fortgesetzt werden können, weil jeder darauf wartet, dass der andere etwas unternimmt.
Betrachten Sie beispielsweise zwei Prozesse, P1 und P2, und zwei Ressourcen, R1 und R2. Angenommen, jeder Prozess benötigt Zugriff auf beide Ressourcen, um einen Teil seiner Funktion auszuführen. Dann ist folgende Situation möglich: Das Betriebssystem weist P2 R1 und R2 P1 zu. Jeder Prozess wartet auf eine der beiden Ressourcen. Keiner von beiden gibt die Ressource frei, die er bereits besitzt, bis er die andere Ressource erworben und die Funktion ausgeführt hat, die beide Ressourcen erfordert. Die beiden Prozesse sind festgefahren
Livelock : Eine Situation, in der zwei oder mehr Prozesse ihren Zustand als Reaktion auf Änderungen in den anderen Prozessen kontinuierlich ändern, ohne nützliche Arbeit zu leisten:
Hunger : Eine Situation, in der ein ausführbarer Prozess vom Scheduler auf unbestimmte Zeit übersehen wird. Obwohl es fortfahren kann, wird es nie ausgewählt.
Angenommen, drei Prozesse (P1, P2, P3) erfordern jeweils einen periodischen Zugriff auf die Ressource R. Betrachten Sie die Situation, in der P1 im Besitz der Ressource ist und sowohl P2 als auch P3 verzögert sind und auf diese Ressource warten. Wenn P1 seinen kritischen Abschnitt verlässt, sollte entweder P2 oder P3 Zugriff auf R gewährt werden. Angenommen, das Betriebssystem gewährt Zugriff auf P3 und P1 benötigt erneut Zugriff, bevor P3 seinen kritischen Abschnitt abschließt. Wenn das Betriebssystem nach Abschluss von P3 Zugriff auf P1 gewährt und anschließend abwechselnd Zugriff auf P1 und P3 gewährt, kann P2 auf unbestimmte Zeit der Zugriff auf die Ressource verweigert werden, obwohl keine Deadlock-Situation vorliegt.
ANHANG A - THEMEN DER KONKURRENZ
Deadlock-Beispiel
Wenn beide Prozesse ihre Flags auf true setzen, bevor einer die while-Anweisung ausgeführt hat, wird jeder denken, dass der andere seinen kritischen Abschnitt betreten hat, was zu einem Deadlock führt.
Livelock Beispiel
[...] betrachten die folgende Abfolge von Ereignissen:
Diese Sequenz kann auf unbestimmte Zeit verlängert werden, und keiner der Prozesse kann in seinen kritischen Abschnitt eintreten. Genau genommen ist dies kein Deadlock , da jede Änderung der relativen Geschwindigkeit der beiden Prozesse diesen Zyklus unterbricht und es einem ermöglicht, den kritischen Abschnitt zu betreten. Dieser Zustand wird als Viehbestand bezeichnet . Denken Sie daran, dass ein Deadlock auftritt, wenn eine Reihe von Prozessen ihre kritischen Abschnitte eingeben möchte, aber kein Prozess erfolgreich sein kann. Mit livelock gibt es mögliche Ausführungssequenzen, die erfolgreich sind, aber es ist auch möglich, eine oder mehrere Ausführungssequenzen zu beschreiben, in denen kein Prozess jemals in seinen kritischen Abschnitt eintritt.
Kein Inhalt mehr aus dem Buch.
Und was ist mit Spinlocks?
Spinlock ist eine Technik, um die Kosten des Betriebssystemsperrmechanismus zu vermeiden. Normalerweise würden Sie Folgendes tun:
Ein Problem tritt auf, wenn es
beginLock()
viel mehr kostet alsdoSomething()
. Stellen Sie sich sehr übertrieben vor, was passiert, wenn diebeginLock
Kosten 1 Sekunde betragen, aberdoSomething
nur 1 Millisekunde kosten.In diesem Fall würden Sie vermeiden, 1 Sekunde lang behindert zu werden, wenn Sie 1 Millisekunde warten würden.
Warum
beginLock
würde das so viel kosten? Wenn die Sperre frei ist, kostet sie nicht viel (siehe https://stackoverflow.com/a/49712993/5397116 ), aber wenn die Sperre nicht frei ist, "friert" das Betriebssystem Ihren Thread ein, richten Sie einen Mechanismus ein, um Sie zu wecken Wenn das Schloss freigegeben ist, wecken Sie Sie in Zukunft erneut.All dies ist viel teurer als einige Schleifen, die das Schloss überprüfen. Deshalb ist es manchmal besser, einen "Spinlock" zu machen.
Zum Beispiel:
Wenn Ihre Implementierung nicht vorsichtig ist, können Sie auf Livelock fallen und die gesamte CPU für den Sperrmechanismus ausgeben.
Siehe auch:
https://preshing.com/20120226/roll-your-own-lightweight-mutex/
Ist meine Spin-Lock-Implementierung korrekt und optimal?
Zusammenfassung :
Deadlock : Situation, in der niemand Fortschritte macht, nichts tut (schlafen, warten usw.). Die CPU-Auslastung ist gering.
Livelock : Situation, in der niemand Fortschritte macht, aber die CPU für den Sperrmechanismus und nicht für Ihre Berechnung aufgewendet wird.
Hunger: Situation, in der ein Prozess nie die Chance bekommt zu rennen; durch reines Pech oder durch einen Teil seines Eigentums (zum Beispiel niedrige Priorität);
Spinlock : Technik zur Vermeidung der Kosten, die darauf warten, dass das Schloss freigegeben wird.
quelle
DEADLOCK Deadlock ist eine Bedingung, bei der eine Aufgabe auf unbestimmte Zeit auf Bedingungen wartet, die niemals erfüllt werden können - Aufgabe beansprucht die ausschließliche Kontrolle über gemeinsam genutzte Ressourcen - Aufgabe hält Ressourcen, während auf die Freigabe anderer Ressourcen gewartet wird - Aufgaben können nicht gezwungen werden, Ressourcen freizugeben - ein zirkuläres Warten Bedingung besteht
LIVELOCK Livelock-Bedingungen können auftreten, wenn zwei oder mehr Aufgaben von einer Ressource abhängen und diese verwenden. Dies führt zu einer zirkulären Abhängigkeitsbedingung, bei der diese Aufgaben für immer ausgeführt werden, wodurch die Ausführung aller Aufgaben mit niedrigerer Priorität blockiert wird (bei diesen Aufgaben mit niedrigerer Priorität tritt eine Bedingung auf, die als Hunger bezeichnet wird).
quelle
Vielleicht veranschaulichen diese beiden Beispiele den Unterschied zwischen einem Deadlock und einem Livelock:
Java-Beispiel für einen Deadlock:
Beispielausgabe:
Java-Beispiel für ein Livelock:
Beispielausgabe:
Beide Beispiele zwingen die Fäden, die Schlösser in unterschiedlicher Reihenfolge zu erwerben. Während der Deadlock auf das andere Schloss wartet, wartet das Livelock nicht wirklich - es versucht verzweifelt, das Schloss zu erwerben, ohne die Chance zu haben, es zu bekommen. Jeder Versuch verbraucht CPU-Zyklen.
quelle
Stellen Sie sich vor, Sie haben Thread A und Thread B. Sie befinden sich beide
synchronised
im selben Objekt und in diesem Block befindet sich eine globale Variable, die beide aktualisiert werden.Wenn also Thread A in die
while
Schleife eintritt und die Sperre hält, tut er das, was er tun muss, und setztcommonVar
auftrue
. Dann Thread B kommt, tritt in derwhile
Schleife , und dacommonVar
isttrue
jetzt ist es in der Lage , das Schloss zu halten. Dies geschieht, führt densynchronised
Block aus und setztcommonVar
zurück zufalse
. Jetzt erhält Thread A wieder sein neues CPU-Fenster. Er wollte gerade diewhile
Schleife verlassen, aber Thread B hat es gerade zurückgesetztfalse
, sodass sich der Zyklus erneut wiederholt. Threads tun etwas (damit sie nicht im herkömmlichen Sinne blockiert werden), aber für so ziemlich nichts.Es ist vielleicht auch schön zu erwähnen, dass Vieh nicht unbedingt hier erscheinen muss. Ich gehe davon aus, dass der Scheduler den anderen Thread bevorzugt, sobald die
synchronised
Ausführung des Blocks abgeschlossen ist. Die meiste Zeit denke ich, dass es eine schwer zu treffende Erwartung ist und von vielen Dingen abhängt, die unter der Haube passieren.quelle