GNU/Linux >> Tutoriels Linux >  >> Linux

Comment détecter et découvrir qu'un programme est dans l'impasse ?

Si vous soupçonnez un interblocage, faites un ps aux | grep <exe name> , si en sortie, le PROCESS STATE CODE est D (Veille sans interruption) signifie qu'il s'agit d'une impasse. Parce que, comme @daijo l'a expliqué, disons que vous avez deux threads T1 &T2 et deux sections critiques protégées chacune par semaphores S1 & S2 alors si T1 acquiert S1 et T2 acquiert S2 et après cela, ils essaient d'acquérir l'autre verrou avant de renoncer à celui qu'ils détenaient déjà, cela conduira à une impasse et en faisant un ps aux | grep <exe name> , le process state code sera D (c'est-à-dire un sommeil ininterrompu).

Outils :

Valgrind, Lockdep (utilitaire du noyau Linux)

Consultez ce lien sur les types de blocages et comment les éviter :http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html

Modifier :ps aux sortie D "pourrait" signifier que le processus est dans l'impasse, d'après ce document redhat :

État de veille sans interruption
Un état de veille sans interruption est un état qui ne traite pas un signal immédiatement. Il ne se réveillera qu'à la suite de la disponibilité d'une ressource attendue ou après qu'un délai d'attente se soit produit pendant cette attente (si le délai d'attente est spécifié lorsque le processus est mis en veille).


Je vous suggère de regarder Helgrind :un détecteur d'erreurs de thread.

L'exemple le plus simple d'un tel problème est le suivant.

Imaginez une ressource partagée R, qui, pour une raison quelconque, est gardée par deux verrous, L1 et L2, qui doivent tous deux être détenus lors de l'accès à R.

Supposons qu'un thread acquiert L1, puis L2, et procède à l'accès à R. L'implication de ceci est que tous les threads du programme doivent acquérir les deux verrous dans l'ordre d'abord L1 puis L2. Ne pas le faire risque d'aboutir à une impasse.

Le blocage peut se produire si deux threads - appelez-les T1 et T2 - veulent tous deux accéder à R. Supposons que T1 acquiert L1 en premier et que T2 acquiert L2 en premier. Ensuite, T1 essaie d'acquérir L2 et T2 essaie d'acquérir L1, mais ces verrous sont déjà détenus. Donc T1 et T2 deviennent bloqués."


Linux
  1. Comment rechercher et supprimer des photos en double sous Linux

  2. Comment imprimer les lignes numéro 15 et 25 sur 50 lignes ?

  3. Comment puis-je trouver des fichiers et calculer leur taille ?

  4. Comment savoir si ma carte sans fil prend en charge 5 GHz ?

  5. Comment trouver la source d'un signal POSIX

Comment trouver l'ID de processus d'un programme et le tuer [Astuce rapide]

Comment trouver la date et l'heure d'installation du système d'exploitation Linux

Comment savoir quel programme utilise Internet et combien ?

Comment rechercher et remplacer du texte dans Vim

Comment détecter et gérer les appareils sous Linux

Comment écrire et exécuter un programme C sous Linux