Heim  >  Artikel  >  Backend-Entwicklung  >  So vermeiden Sie Datei-Deadlocks bei der PHP-Entwicklung

So vermeiden Sie Datei-Deadlocks bei der PHP-Entwicklung

王林
王林Original
2019-09-26 17:40:041972Durchsuche

So vermeiden Sie Datei-Deadlocks bei der PHP-Entwicklung

Deadlock

Deadlock ist ein Zustand des Betriebssystems oder der laufenden Software: unter Multitasking, wenn ein oder mehrere Prozesse ausgeführt werden Wartet auf Systemressourcen und sind die Ressourcen durch das System selbst oder andere Prozesse belegt, entsteht ein Deadlock. Die häufigste Form eines Deadlocks tritt auf, wenn zwei oder mehr Threads auf eine von einem anderen Thread belegte Ressource warten:

So vermeiden Sie Datei-Deadlocks bei der PHP-Entwicklung

Wenn beide Sequenzen gleichzeitig auftreten, wird Thread 1 dies niemals können Sperre B wird erworben, da Sperre B Thread 2 gehört. Gleichzeitig kann Thread 2 niemals Sperre A erhalten, da Sperre A Thread 1 gehört.

Bedingungen für einen Deadlock

Die folgenden vier Bedingungen müssen für das Auftreten eines Deadlocks erfüllt sein:

① Sich gegenseitig ausschließende Bedingung: bedeutet, dass ein Prozess die zugewiesene Ressource ausschließlich nutzt, d. h. eine Ressource wird innerhalb eines bestimmten Zeitraums nur von einem Prozess belegt. Wenn zu diesem Zeitpunkt andere Prozesse Ressourcen anfordern, kann der Anforderer nur warten, bis der Prozess, der die Ressourcen belegt, aufgebraucht und freigegeben ist.

②Anforderungs- und Aufbewahrungsbedingungen: bedeutet, dass der Prozess mindestens eine Ressource verwaltet hat, aber eine neue Ressourcenanforderung gestellt hat und die Ressource zu diesem Zeitpunkt von anderen Prozessen belegt wurde. Der Anforderungsprozess wird blockiert, aber er behält weiterhin die Ressourcen, die er erhalten hat.

③ Nicht-Entzugsbedingung: bezieht sich auf die Ressource, die der Prozess erhalten hat. Sie kann nicht vor dem Ende der Nutzung entzogen werden und kann erst nach dem Ende der Nutzung freigegeben werden.

④Schleifenwartebedingung: bedeutet, dass beim Auftreten eines Deadlocks ein Prozess vorhanden sein muss – eine kreisförmige Kette von Ressourcen, dh im Prozesssatz {P0, P1, ... ,Pn} P0 wartet auf eine von P1 belegte Ressource, P1 wartet auf eine von P2 belegte Ressource,..., Pn wartet auf eine von P0 belegte Ressource.

Wie man einen Deadlock vermeidet und damit umgeht

Deadlock verhindern: Der Weg, einen Deadlock zu verhindern, besteht darin, die zweite und dritte der vier Bedingungen zu erfüllen , kann eine der vier Bedingungen nicht erfüllt werden, um einen Deadlock zu vermeiden.

① Sperrreihenfolge: Sperren Sie in derselben Reihenfolge.

Wenn mehrere Prozesse dieselben Sperren erfordern und diese in unterschiedlicher Reihenfolge sperren, kann es leicht zu Deadlocks kommen. Wenn sichergestellt werden kann, dass alle Prozesse in der gleichen Reihenfolge Sperren erhalten, kommt es nicht zu einem Deadlock.

②Sperrzeitlimit: Fügen Sie ein bestimmtes Zeitlimit hinzu, wenn der Prozess versucht, die Sperre zu erhalten.

Das heißt, wenn bei der Beantragung einer Sperre die Frist überschritten wird, gibt der Prozess den Antrag auf Sperre auf und gibt alle erworbenen Sperren frei. Versuchen Sie es dann nach einer zufälligen Zeitspanne erneut. Diese zufällige Zeitspanne gibt anderen Threads die Möglichkeit, zu versuchen, die gleiche Sperre zu erhalten, und ermöglicht der Anwendung, ohne die Sperre fortzufahren. Das Problem besteht darin, dass, wenn viele Prozesse gleichzeitig um denselben Ressourcenstapel konkurrieren, selbst wenn ein Timeout- und Rollback-Mechanismus vorhanden ist, immer noch ein Problem auftreten kann, bei dem einige Prozesse es wiederholt versuchen, aber nie die Sperre erhalten.

Deadlock vermeiden: Diese Methode ist auch eine Präventionsstrategie im Voraus, erfordert jedoch nicht die Ergreifung verschiedener restriktiver Maßnahmen im Voraus, um die vier notwendigen Bedingungen für einen Deadlock zu beseitigen Methode, um zu verhindern, dass das System während der dynamischen Zuweisung von Ressourcen in einen unsicheren Zustand eintritt, und so einen Deadlock zu vermeiden.

Deadlock-Erkennung: Sie zielt hauptsächlich auf Situationen ab, in denen eine sequentielle Sperrung nicht erreicht werden kann und die Sperrzeitbegrenzung nicht realisierbar ist.

Durch den festgelegten Erkennungsmechanismus wird das Auftreten eines Deadlocks rechtzeitig erkannt und die mit dem Deadlock verbundenen Prozesse und Ressourcen werden genau bestimmt. Ergreifen Sie dann geeignete Maßnahmen, um den aufgetretenen Deadlock im System zu beseitigen.

Immer wenn ein Prozess eine Sperre erhält, wird dies in den prozess- und sperrbezogenen Datenstrukturen aufgezeichnet. Und jedes Mal, wenn ein Prozess eine Sperre anfordert, wird dies in dieser Datenstruktur aufgezeichnet. Wenn ein Prozess keine Sperre anfordert, kann der Thread den Prozess durchlaufen und Datenstrukturen sperren, um festzustellen, ob ein Deadlock aufgetreten ist.

Zum Beispiel:

Prozess A fordert Sperre 2 an, aber die Sperre ist zweimal von Prozess B belegt, sodass Prozess A auf Prozess B wartet. Auf die gleiche Weise wartet Prozess B auf Prozess C, Prozess C wartet auf Prozess D und Prozess D wartet auf Prozess A. Damit Prozess A einen Deadlock erkennen kann, muss er nach und nach alle von B angeforderten Sperren erkennen. Ausgehend von der Anforderung von Prozess B fand Prozess A Prozess C und dann Prozess D. Es wird festgestellt, dass die von Prozess D angeforderte Sperre von Prozess A selbst belegt ist, sodass ein Deadlock erkannt wird.

Wenn Prozess A einen Deadlock erkennt, besteht eine praktikable Methode darin, dass Prozess A die von ihm gehaltene Sperre aufhebt, einen Rollback durchführt und es dann nach einer zufälligen Zeitspanne erneut versucht. Dies ähnelt dem Sperrzeitlimit, mit der Ausnahme, dass der Deadlock bereits aufgetreten ist.

Deadlock-Entlastung: Dies ist eine Maßnahme, die mit der Deadlock-Erkennung einhergeht .

Wenn festgestellt wird, dass ein Prozess blockiert ist, sollte er sofort aus dem Deadlock-Zustand befreit werden.

Eine Möglichkeit besteht darin, Ressourcen zu entziehen . Entziehen Sie dem Deadlock-Prozess eine ausreichende Menge an Ressourcen von anderen Prozessen, um den Deadlock-Status zu beseitigen.       

Eine andere Methode besteht darin, den Vorgang abzubrechen . Die einfachste Möglichkeit, einen Prozess abzubrechen, besteht darin, alle blockierten Prozesse abzubrechen. Eine etwas mildere Methode besteht darin, die Prozesse einzeln in einer bestimmten Reihenfolge abzubrechen, wodurch nur genügend Ressourcen verfügbar sind.

Empfohlenes Tutorial: PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo vermeiden Sie Datei-Deadlocks bei der PHP-Entwicklung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn