Ce qui est une impasse?
Lors de l'écriture d'applications multi-thread, l'un des problèmes les plus courants sont les blocages.
Mes questions à la communauté sont:
-
Ce qui est une impasse?
-
Comment les détecter?
-
Fais-tu?
-
Et enfin, comment faire pour vous empêcher de se produire?
Vous devez vous connecter pour publier un commentaire.
Un de verrouillage se produit lorsque plusieurs processus essayez d'accéder à la même ressource en même temps.
Un processus perd et doit attendre que l'autre à la fin.
Un impasse se produit lorsque le processus d'attente est toujours tenue sur une autre ressource que la première besoins avant de pouvoir terminer.
Donc, un exemple:
Ressource A et B de ressource sont utilisés par les processus X et processus Y
La meilleure façon d'éviter les blocages est pour éviter d'avoir des processus de croix au-dessus de cette manière. Réduire le besoin de verrouiller n'importe quoi comme beaucoup que vous le pouvez.
Dans les bases de données d'éviter de faire beaucoup de changements pour les différentes tables dans une seule opération, d'éviter les déclencheurs et de passer à optimistes/sale/nolock lit autant que possible.
Laissez-moi vous expliquer un monde réel (et non pas réel) exemple pour une situation de blocage de la criminalité films. Imaginez un criminel détient un otage et contre qui, un flic est également titulaire d'un otage qui est un ami du criminel. Dans ce cas, pénale est a pas l'intention de laisser l'otage aller si cop de ne pas laisser son ami se laisser aller. Aussi le flic ne va pas laisser l'ami du criminel de laisser aller, à moins que le criminel libère les otages. C'est sans fin situation indigne de confiance, parce que les deux parties ont insisté sur le fait que la première étape les uns des autres.
Pénale & Cop Scène
Donc, tout simplement, lorsque deux threads besoin de deux ressources différentes et chacun d'eux a le verrou de la ressource que les autres ont besoin, c'est une impasse.
Un autre de Haut Niveau de l'Explication de l'Impasse : le Cœur Brisé
Vous sortez avec une fille et un jour, après une dispute, les deux côtés sont cœur brisé, les uns aux autres et en attente d'une je-suis-excusez-moi-et-je-raté-vous appel. Dans ce cas, les deux côtés veulent communiquer entre eux si et seulement si l'un d'eux reçoit un je-suis-désolé appel de l'autre. Parce qu'aucun de chaque va commencer la communication et de l'attente dans un état passif, les deux vont attendre que l'autre pour démarrer la communication, qui se retrouve dans une situation de blocage.
Blocages ne se produit que si vous avez deux ou plus de deux verrous qui peuvent être acquis en même temps et ils sont attrapé dans un ordre différent.
Manières d'éviter les blocages sont:
Pour définir l'impasse, je souhaite tout d'abord définir les processus.
Processus : Comme nous le savons, le processus n'en est rien, mais un
program
dans l'exécution.Ressources : Pour exécuter un programme, le processus a besoin de quelques ressources. Catégories de ressources peuvent inclure la mémoire, imprimantes, unités centrales, ouvrir des fichiers, lecteurs de bande, CD-ROM, etc.
Impasse : Blocage est une situation ou une condition lorsque deux ou plusieurs processus sont la tenue de certaines ressources et d'essayer d'acquérir certains de plus de ressources, et ils ne peuvent pas libérer les ressources jusqu'à la fin il y a exécution.
Condition de blocage ou de la situation
Dans le diagramme ci-dessus, il existe deux processus de P1 et p2 et il y a deux ressources R1 et R2.
Ressources R1 est affecté à traiter P1 et des ressources R2 est affecté à traiter p2.
Pour achever l'exécution de processus P1 besoins de ressources R2, donc P1 demande de R2, mais R2 est déjà affecté à P2.
De la même façon le Processus de P2 pour terminer son exécution doit R1, mais R1 est déjà affecté à P1.
à la fois les processus ne peuvent pas se libérer de leurs ressources jusqu'à ce que et à moins qu'ils ont terminé leur exécution. Donc les deux sont en attente pour un autre ressources et ils vont attendre pour toujours. C'est donc un IMPASSE Condition.
Afin de blocage de se produire, quatre conditions doivent être remplies.
contrôler simultanément la même ressource ou être dans leur critique
la section).
et toutes ces conditions sont remplies dans le schéma ci-dessus.
Un blocage se produit lorsqu'un thread est en attente pour quelque chose qui ne se produit jamais.
Typiquement, cela se produit lorsqu'un thread est en attente sur un mutex ou sémaphore qui n'a jamais été publié par le propriétaire précédent.
Il arrive également fréquemment quand vous avez une situation impliquant deux fils et deux serrures comme ceci:
Vous généralement les détecter parce que les choses que vous vous attendez jamais le faire, ou l'application se bloque complètement.
Vous pouvez prendre un coup d'oeil à ce merveilleux articles, en vertu de l'article Impasse. Il est en C#, mais l'idée est toujours la même pour les autres plate-forme. Je cite ici pour faciliter la lecture
Deadlock est un problème commun dans le multitraitement/multiprogramming des problèmes dans les OS.
Dire qu'il y a deux processus P1, P2 et deux à l'échelle mondiale partageable des ressources R1, R2 et en section critique à la fois les ressources doivent être accessibles
D'abord, le système d'exploitation attribue R1 processus P1 et R2 pour le processus P2.
Comme les deux processus sont en cours d'exécution simultanément, ils peuvent commencer à exécuter leur code, mais le PROBLÈME se pose lorsqu'un processus hits de la section critique.
Donc, processus de R1 va attendre pour processus P2 pour la libération R2 et vice versa...
Donc, ils vont attendre pour toujours (CONDITION de BLOCAGE).
Une petite ANALOGIE...
Un blocage se produit quand il ya une chaîne circulaire de threads ou processus qui détiennent chacun une ressource verrouillée et tentent de verrouiller une ressource détenue par l'élément suivant dans la chaîne. Par exemple, les deux fils qui détiennent respectivement Une serrure et verrou B, et sont tous les deux en train d'acquérir le verrouillage de l'autre.
Blocage se produit lorsque deux threads acquérir les verrous qui empêchent que l'un d'entre eux de progresser. La meilleure façon de les éviter est avec attention le développement. De nombreux systèmes embarqués de s'en protéger à l'aide d'un minuteur de surveillance (un timer qui remet le système à chaque fois si il se bloque pendant une certaine période de temps).
Un blocage est un état d'un système dans lequel aucun processus/thread est capable d'exécuter une action. Comme mentionné par d'autres, un blocage est généralement le résultat d'une situation où chaque processus/thread souhaite acquérir un verrou sur une ressource qui est déjà verrouillé par un autre (ou le même) processus/thread.
Il existe différentes méthodes pour les trouver et de les éviter. On pense très dur et/ou d'essayer beaucoup de choses. Cependant, en traitant avec le parallélisme est notoirement difficile et la plupart (si pas tous) les gens ne seront pas en mesure d'éviter complètement les problèmes.
Certaines des méthodes plus formelles peuvent être utiles si vous êtes sérieux à propos de la gestion de ces types de problèmes. La méthode la plus pratique que j'en suis conscient, c'est d'utiliser le processus de l'approche de la théorie. Ici le modèle de votre système dans certains processus de la langue (p. ex. CCS, CSP, ACP, mCRL2, LOTOS) et utiliser les outils disponibles pour (modèle)vérifier les blocages (et peut être quelques autres propriétés). Des exemples de l'ensemble d'outils à utiliser sont FDR, mCRL2, PCA et Uppaal. Quelques âmes courageuses peut même se révéler leurs systèmes de blocage gratuitement en utilisant uniquement des méthodes symboliques (théorème de prouver, regardez pour Owicki-Gries).
Cependant, ces méthodes formelles en général ne nécessitent un certain effort (par exemple pour apprendre les bases de la théorie des processus). Mais je suppose que c'est simplement une conséquence du fait que ces problèmes sont difficiles.
De blocage est une situation qui se produit lorsqu'il y a moins de ressources disponibles, comme il est demandé par les différents processus. Cela signifie que lorsque le nombre de ressources disponibles deviennent de moins en moins à ce qu'il est demandé par l'utilisateur, puis, à ce moment, le processus va dans l'attente de condition .Certains temps d'attente augmente plus et il n'y a aucune chance de voir le problème de lackness de ressources alors, cette situation est connue comme une impasse .
En fait, l'impasse est un problème majeur pour nous, et il ne se produit que dans le système d'exploitation multitâche .l'impasse ne peut pas se produire dans une seule des tâches du système d'exploitation parce que toutes les ressources sont présentes uniquement pour cette tâche, qui est actuellement en cours d'exécution......
Au-dessus de certaines explications sont gentils. Espérons que ce peut aussi utile:
https://ora-data.blogspot.in/2017/04/deadlock-in-oracle.html
Dans une base de données, lors d'une session (par exemple, ora) veut une ressource détenue par une autre session (par exemple, données), mais cette session (données) veut aussi une ressource qui est tenue par la première session (ora). Il peut y avoir plus de 2 sessions impliqués aussi mais l'idée sera la même.
En fait, les Blocages, de prévenir certaines transactions de continuer à travailler.
Par exemple:
Supposons que, ORA-DONNÉES est titulaire d'Une serrure et des demandes de verrouillage B
Et le SKU est titulaire de verrouillage B et demandes de verrouillage A.
Merci,
Blocage se produit lorsqu'un thread est en attente pour d'autres thread à la fin et vice-versa.
Comment les éviter?
- Éviter Imbriqués Les Verrous
- Éviter Les Verrous
- L'utilisation de la thread join()
Comment la détecter?
exécutez cette commande dans le cmd:
référence : geeksforgeeks
Un classique et très simple pour la compréhension de Impasse situation :-
Lorsque le thread principal invoque Paresseux.principal, il vérifie si la classe Paresseux
a été initialisé et commence à initialiser la classe. L'
thread principal définit maintenant initialisé à false , il crée et démarre un arrière-plan
fil dont la méthode run jeux initialisé à true , et attend que le thread d'arrière-plan au complet.
Ce temps, la classe est actuellement en cours d'initialisation par un autre thread.
Dans ces circonstances, le thread actuel, qui est le thread d'arrière-plan,
attend sur la Classe de l'objet jusqu'à ce que l'initialisation est terminée. Malheureusement, le fil
qui est en train de faire l'initialisation, le thread principal, est en attente pour le fond
thread terminer. Parce que les deux fils sont maintenant attendre les uns les autres, la
le programme est dans l'IMPASSE.
Mutex est, en essence, une serrure, en fournissant l'accès protégé à des ressources partagées. Sous Linux, le fil mutex des données de type pthread_mutex_t. Avant de l'utiliser, de l'initialiser.
À l'accès aux ressources partagées, vous devez verrouiller le mutex. Si le mutex est déjà sur la serrure, l'appel va bloquer le thread jusqu'à ce que le mutex est déverrouillé. À la fin de la visite à ressources partagées, vous devez le déverrouiller.
Dans l'ensemble, il y a quelques non écrite principes de base:
Obtenir le verrou avant d'utiliser les ressources partagées.
Maintenant le verrou que peu de temps que possible.
Libérer le verrou si le thread renvoie une erreur.