Maison  >  Article  >  développement back-end  >  Comment éviter les blocages de fichiers dans le développement PHP

Comment éviter les blocages de fichiers dans le développement PHP

王林
王林original
2019-09-26 17:40:042017parcourir

Comment éviter les blocages de fichiers dans le développement PHP

Deadlock

Deadlock, c'est un état d'exécution d'un système d'exploitation ou d'un logiciel : en multi-tâches, lorsqu'un ou plusieurs processus attend des ressources système et que les ressources sont occupées par le système lui-même ou par d'autres processus, une impasse se forme. La forme la plus courante de blocage se produit lorsque deux threads ou plus attendent une ressource occupée par un autre thread :

Comment éviter les blocages de fichiers dans le développement PHP

Si les deux séquences se produisent simultanément, le thread 1 ne pourra jamais Obtenez le verrou B car le verrou B appartient au thread 2. Dans le même temps, le thread 2 ne peut jamais obtenir le verrou A car le verrou A appartient au thread 1.

Conditions d'impasse

Les quatre conditions suivantes doivent être remplies pour l'apparition d'une impasse :

① Condition mutuellement exclusive : signifie qu'un processus utilise exclusivement la ressource allouée, c'est-à-dire qu'une ressource n'est occupée que par un seul processus sur une période donnée. S'il existe d'autres processus demandant des ressources à ce moment-là, le demandeur ne peut qu'attendre que le processus occupant les ressources soit épuisé et libéré.

②Conditions de demande et de rétention : signifie que le processus a maintenu au moins une ressource, mais a fait une nouvelle demande de ressource et que la ressource a été occupée par d'autres processus à ce moment-là, le processus de demande est bloqué, mais il conserve toujours les ressources qu'il a obtenues.

③ Condition de non-privation : fait référence à la ressource que le processus a obtenue. Elle ne peut être privée avant la fin de l'utilisation, et ne peut être libérée qu'après la fin de l'utilisation.

④Condition d'attente de boucle : signifie que lorsqu'une impasse se produit, il doit y avoir un processus - une chaîne circulaire de ressources, c'est-à-dire dans l'ensemble de processus {P0, P1,... ,Pn} P0 attend une ressource occupée par P1, P1 attend une ressource occupée par P2,..., Pn attend une ressource occupée par P0.

Comment éviter et gérer les impasses

Prévenir les impasses : La façon d'éviter les impasses est de remplir la deuxième et la troisième des quatre conditions , l'une des quatre conditions ne peut pas être remplie pour éviter une impasse.

① Ordre de verrouillage : Verrouillez dans le même ordre.

Lorsque plusieurs processus nécessitent les mêmes verrous et les verrouillent dans des ordres différents, des blocages peuvent facilement se produire. Si l'on peut garantir que tous les processus obtiennent les verrous dans le même ordre, il n'y aura pas de blocage.

②Délai de verrouillage : Ajoutez un certain délai lorsque le processus tente d'acquérir le verrou.

C'est-à-dire que si le délai est dépassé lors de la demande de verrouillage, le processus renoncera à la demande de verrouillage et libérera tous les verrous acquis. Puis réessayez après un laps de temps aléatoire. Cette durée aléatoire donne à d'autres threads la possibilité d'essayer d'acquérir le même verrou et permet à l'application de continuer sans acquérir le verrou. Le problème est que s'il existe de nombreux processus en compétition pour le même lot de ressources en même temps, même s'il existe un mécanisme de délai d'attente et de restauration, il peut toujours y avoir un problème où certains processus essaient à plusieurs reprises mais n'obtiennent jamais le verrou.

Éviter les impasses : Cette méthode est aussi une stratégie de prévention à l'avance, mais elle ne nécessite pas de prendre diverses mesures restrictives à l'avance pour détruire les quatre conditions nécessaires à l'impasse. Il s'agit d'en utiliser certaines. procédé pour empêcher le système d'entrer dans un état dangereux pendant l'allocation dynamique de ressources, évitant ainsi un blocage.

Détection de blocage : Elle s'adresse principalement aux situations où le verrouillage séquentiel ne peut pas être obtenu et où le délai de verrouillage n'est pas réalisable.

Grâce au mécanisme de détection défini, l'apparition d'un blocage est détectée en temps opportun et les processus et ressources liés à l'impasse sont déterminés avec précision. Prenez ensuite les mesures appropriées pour supprimer le blocage survenu dans le système.

Chaque fois qu'un processus acquiert un verrou, celui-ci sera enregistré dans les structures de données liées au processus et au verrou. Et chaque fois qu’un processus demandera un verrou, celui-ci sera enregistré dans cette structure de données. Lorsqu'un processus ne parvient pas à demander un verrou, le thread peut parcourir le processus et verrouiller les structures de données pour déterminer si un blocage s'est produit.

Par exemple :

Le processus A demande le verrou 2, mais le verrou est occupé 2 fois par le processus B, donc le processus A attend le processus B. De la même manière, le processus B attend le processus C, le processus C attend le processus D et le processus D attend le processus A. Pour que le processus A détecte un blocage, il doit détecter progressivement tous les verrous demandés par B. À partir de l'endroit où le processus B a demandé, le processus A a trouvé le processus C, puis a trouvé le processus D. On constate que le verrou demandé par le processus D est occupé par le processus A lui-même, donc un blocage est détecté.

Lorsque le processus A détecte un blocage, une méthode réalisable consiste pour le processus A à libérer le verrou qu'il détient, à revenir en arrière, puis à réessayer après une période de temps aléatoire. Ceci est similaire à la limite de temps de verrouillage, sauf que le blocage s'est déjà produit.

Soulagement des impasses : Il s'agit d'une mesure qui va de pair avec la détection des impasses.

Lorsqu'un processus s'avère être dans l'impasse, il doit être immédiatement libéré de l'état d'impasse.

Une façon est de priver de ressources . Privez une quantité suffisante de ressources des autres processus vers le processus de blocage pour libérer l'état de blocage.       

Une autre méthode consiste à annuler le processus . La manière la plus simple d'annuler un processus consiste à tuer tous les processus bloqués ; une méthode légèrement plus douce consiste à annuler les processus un par un dans un certain ordre, qui ne dispose que de suffisamment de ressources.

Tutoriel recommandé : Tutoriel vidéo PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn