GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo detectar y descubrir que un programa está en interbloqueo?

Si sospecha que hay un punto muerto, haga un ps aux | grep <exe name> , si en la salida, el PROCESS STATE CODE es D (Sueño ininterrumpido) significa que es un punto muerto. Porque como explicó @daijo, digamos que tiene dos subprocesos T1 &T2 y dos secciones críticas cada una protegida por semaphores S1 & S2 entonces si T1 adquiere S1 y T2 adquiere S2 y después de eso intentan adquirir el otro bloqueo antes de renunciar al que ya tenían, esto conducirá a un punto muerto y al hacer un ps aux | grep <exe name> , el process state code será D (es decir, sueño ininterrumpido).

Herramientas:

Valgrind, Lockdep (utilidad del kernel de Linux)

Consulte este enlace sobre los tipos de interbloqueos y cómo evitarlos:http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html

Editar:ps aux salida D "podría" significar que el proceso está en punto muerto, de este documento de redhat:

Estado de suspensión ininterrumpida
Un estado de suspensión ininterrumpida es uno que no manejará una señal de inmediato. Solo se reactivará como resultado de que un recurso esperado esté disponible o después de que ocurra un tiempo de espera durante esa espera (si el tiempo de espera se especifica cuando el proceso se pone en suspensión).


Te sugiero que mires Helgrind:un detector de errores de subprocesos.

El ejemplo más simple de tal problema es el siguiente.

Imagine algún recurso compartido R, que, por alguna razón, está protegido por dos bloqueos, L1 y L2, que deben mantenerse cuando se accede a R.

Suponga que un subproceso adquiere L1, luego L2 y procede a acceder a R. La implicación de esto es que todos los subprocesos en el programa deben adquirir los dos bloqueos en el orden primero L1 y luego L2. No hacerlo corre el riesgo de llegar a un punto muerto.

El interbloqueo podría ocurrir si dos subprocesos, llámelos T1 y T2, ambos desean acceder a R. Suponga que T1 adquiere L1 primero y T2 adquiere L2 primero. Luego, T1 intenta adquirir L2 y T2 intenta adquirir L1, pero ambos bloqueos ya están retenidos. Así que T1 y T2 se bloquean".


Linux
  1. Cliente Dropbox Maestral, Entérate Cómo Instalarlo y Usarlo

  2. Cómo encontrar y matar el proceso Zombie en Linux

  3. ¿Cómo encuentro los archivos y totalizo sus tamaños?

  4. ¿Cómo averiguar el espacio de nombres de un proceso en particular?

  5. Cómo encontrar la fuente de una señal POSIX

Cómo encontrar el ID de proceso de un programa y eliminarlo [Consejo rápido]

Cómo encontrar la fecha y hora de instalación del sistema operativo Linux

¿Cómo saber qué programa está usando Internet y cuánto?

Cómo encontrar y reemplazar texto en Vim

Cómo detectar y administrar dispositivos en Linux

Cómo escribir y ejecutar un programa C en Linux