Compartir a través de


Detección de interbloqueos

La detección de interbloqueos supervisa el uso del controlador de los recursos que deben bloquearse: bloqueos de número, exclusiones mutuas y exclusiones mutuas rápidas. Esta opción comprobador de controladores detectará la lógica de código que tiene la posibilidad de provocar un interbloqueo en algún momento futuro.

La opción Detección de interbloqueos del Comprobador de controladores, junto con la extensión del depurador del kernel de interbloqueo , es una herramienta eficaz para asegurarse de que el código evita un uso deficiente de estos recursos.

La detección de interbloqueos solo se admite en Windows XP y versiones posteriores de Windows.

Causas de interbloqueos

Un interbloqueo se produce cuando dos o más subprocesos entran en conflicto en algún recurso, de tal forma que no es posible realizar ninguna ejecución.

La forma más común de interbloqueo se produce cuando dos o más subprocesos esperan un recurso que pertenece al otro subproceso. Esto se muestra de la siguiente manera:

Subproceso 1 Subproceso 2
Toma el bloqueo A Toma el bloqueo B
Bloqueo de solicitudes B Solicitudes de bloqueo A

Si ambas secuencias se producen al mismo tiempo, el subproceso 1 nunca obtendrá el bloqueo B porque es propiedad del subproceso 2 y el subproceso 2 nunca obtendrá el bloqueo A porque es propiedad del subproceso 1. En el mejor de los casos, esto hace que los subprocesos implicados se detengan y, en el peor de los casos, el sistema deje de responder.

Los interbloqueos no se limitan a dos subprocesos y dos recursos. Los interbloqueos triples entre tres subprocesos y tres bloqueos son comunes, e incluso se producen interbloqueos de cinco o seis partes ocasionalmente. Estos interbloqueos requieren un cierto grado de "mala suerte", ya que dependen de una serie de cosas que suceden simultáneamente. Sin embargo, cuanto más lejos estén las adquisiciones de bloqueos, más probable es que se conviertan en ellas.

Los interbloqueos de un solo subproceso pueden producirse cuando un subproceso intenta tomar un bloqueo que ya posee.

El denominador común entre todos los interbloqueos es que no se respeta la jerarquía de bloqueos. Siempre que sea necesario tener más de un bloqueo adquirido a la vez, cada bloqueo debe tener una prioridad clara. Si A se toma antes de B en un punto y B antes de C en otro, la jerarquía es A-B-C. Esto significa que A nunca debe adquirirse después de B o C, y B no debe adquirirse después de C.

Se debe seguir la jerarquía de bloqueos incluso cuando no existe la posibilidad de un interbloqueo, ya que en el proceso de mantener el código, será fácil introducir un interbloqueo accidentalmente.

Recursos que pueden provocar interbloqueos

Los interbloqueos más inequívocas son el resultado de los recursos de propiedad . Estos incluyen bloqueos de número, exclusiones mutuas, exclusiones mutuas rápidas y ERESOURCEs.

Los recursos que se indican en lugar de adquiridos (como eventos y puertos LPC) tienden a provocar interbloqueos mucho más ambiguos. Por supuesto, es posible, y todo demasiado común, para que el código use estos recursos de forma que dos subprocesos terminen esperando indefinidamente para que se completen. Sin embargo, dado que estos recursos no pertenecen realmente a ningún subproceso, no es posible identificar el subproceso delincuente con ningún grado de certeza.

La opción Detección de interbloqueos del Comprobador de controladores busca posibles interbloqueos que implican bloqueos de número, exclusiones mutuas y exclusiones mutuas rápidas. No supervisa el uso de ERESOURCEs, ni supervisa el uso de recursos sinnowned.

Efectos de la detección de interbloqueos

Las rutinas de detección de interbloqueos del comprobador de controladores buscan infracciones de jerarquía de bloqueos que no son necesariamente simultáneas. La mayoría de las veces, estas infracciones identifican rutas de acceso de código que interbloquean cuando se les da la oportunidad.

Para buscar posibles interbloqueos, el Comprobador de controladores crea un gráfico del orden de adquisición de recursos y comprueba si hay bucles. Si fuera a crear un nodo para cada recurso y dibujar una flecha cada vez que se adquiere un bloqueo antes de otro, los bucles de ruta de acceso representarían infracciones de jerarquía de bloqueo.

El Comprobador de controladores emitirá una comprobación de errores cuando se detecte una de estas infracciones. Esto ocurrirá antes de que se produzcan interbloqueos reales.

Nota

Incluso si las rutas de acceso de código en conflicto nunca se pueden producir simultáneamente, deben volver a escribirse si implican infracciones de jerarquía de bloqueo. Este código es un "interbloqueo a la espera de que ocurra" que podría provocar interbloqueos reales si el código se reescribe ligeramente.

Cuando la detección de interbloqueos encuentra una infracción, emitirá la comprobación de errores 0xC4. El primer parámetro de esta comprobación de errores indicará la infracción exacta. Entre las posibles infracciones se incluyen las siguientes:

  • Dos o más subprocesos implicados en una infracción de jerarquía de bloqueo

  • Subproceso que intenta adquirir exclusivamente un recurso para el que ya es propietario compartido (se pueden adquirir recursos de propiedad exclusiva; los recursos compartidos no se pueden adquirir exclusivamente).

  • Subproceso que intenta adquirir el mismo recurso dos veces (un interbloqueo automático)

  • Un recurso que se libera sin haber sido adquirido primero

  • Un recurso que se libera mediante un subproceso diferente al que lo adquirió.

  • Un recurso que se inicializa más de una vez o no se inicializa en absoluto.

  • Un subproceso que se elimina mientras sigue siendo propietario de los recursos

  • A partir de Windows 7, el Comprobador de controladores puede predecir posibles interbloqueos. Por ejemplo, al intentar usar la misma estructura de datos KSPIN_LOCK tanto como un bloqueo de número normal y como un bloqueo de número en cola de pila.

Consulte Comprobación de errores 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) para obtener una lista de los parámetros de comprobación de errores.

Supervisión de la detección de interbloqueos

Una vez que la detección de interbloqueos encuentra una infracción, la extensión del depurador del kernel !deadlock se puede usar para investigar exactamente lo que ha ocurrido. Puede mostrar la topología de jerarquía de bloqueo, así como las pilas de llamadas para cada subproceso en el momento en que se adquirieron originalmente los bloqueos.

Hay un ejemplo detallado de la extensión !deadlock , así como información general sobre las extensiones del depurador, en la documentación del paquete Herramientas de depuración para Windows. Consulta Depuración de Windows para obtener más información.

Activación de esta opción

Nota

Esta opción no es compatible con el retraso de sincronización del kernel

Puede activar la característica Detección de interbloqueos para uno o varios controladores mediante el Administrador de comprobadores de controladores o la línea de comandos Verifier.exe. Para obtener más información, vea Seleccionar opciones del comprobador de controladores.

  • En la línea de comandos

    En la línea de comandos, la opción Detección de interbloqueos se representa mediante bit 5 (0x20) . Para activar la detección de interbloqueos, use un valor de marca de 0x20 o agregue 0x20 al valor de marca. Por ejemplo:

    verifier /flags 0x20 /driver MyDriver.sys
    

    La característica estará activa después del siguiente arranque.

    En Windows Vista y versiones posteriores de Windows, también puede activar y desactivar la detección de interbloqueos sin reiniciar el equipo agregando el parámetro /volatile al comando. Por ejemplo:

    verifier /volatile /flags 0x20 /adddriver MyDriver.sys
    

    Esta configuración es efectiva inmediatamente, pero se pierde al apagar o reiniciar el equipo. Para obtener más información, consulte Uso de la configuración volátil.

    La característica Detección de interbloqueos también se incluye en la configuración estándar. Por ejemplo:

    verifier /standard /driver MyDriver.sys
    
  • Uso del Administrador de comprobadores de controladores

    1. Seleccione Crear configuración personalizada (para desarrolladores de código) y, a continuación, seleccione Siguiente.

    2. Seleccione Seleccionar configuración individual en una lista completa.

    3. Seleccione (comprobar) Detección de interbloqueos.

La característica Detección de interbloqueos también se incluye en la configuración estándar. Para usar esta característica, en el Administrador de comprobadores de controladores, seleccione Crear configuración estándar.