Compartir a través de


Detección de interbloqueos

La detección de interbloqueos supervisa el uso por parte del controlador de los recursos que deben ser bloqueados: bloqueos de giro, mutexes y mutexes rápidos. Esta opción del Verificador de controladores detectará la lógica de código que tiene el potencial de provocar un interbloqueo en el futuro.

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

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

Causas de interbloqueos

Un interbloqueo ocurre cuando dos o más subprocesos entran en conflicto por un recurso, de manera que no es posible continuar con la ejecución.

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

Subproceso 1 Subproceso 2
Toma la cerradura A Toma el bloqueo B
Solicitud de Bloqueo 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 de tres vías entre tres subprocesos y tres bloqueos son comunes, e incluso los interbloqueos de cinco o seis partes se producen 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 distantes estén las adquisiciones de bloqueos, más probable será que ocurran.

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 bloqueo incluso cuando no hay ninguna posibilidad de interbloqueo, ya que en el proceso de mantenimiento del código será fácil que se introduzca un interbloqueo accidentalmente.

Recursos que pueden provocar interbloqueos

Los interbloqueos más inequívocos son el resultado de los recursos poseídos. Estos incluyen bloqueos de giro, mutex, mutex rápido y ERESOURCES.

Los recursos que se señalizan en lugar de ser adquiridos (como los eventos y los puertos LPC) tienden a provocar interbloqueos mucho más ambiguos. Por supuesto, es posible, y demasiado común, que el código abuse de estos recursos de forma que dos subprocesos terminen esperando indefinidamente a que se completen mutuamente. 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 por giro, mutex y mutex rápido. No supervisa el uso de ERESOURCEs, ni el uso de recursos no propios.

Efectos de la detección de interbloqueos

Las rutinas de detección de interbloqueos del Driver Verifier identifican violaciones de la jerarquía de bloqueo que no ocurren necesariamente de forma simultánea. Generalmente, estas infracciones identifican rutas de acceso de código que se bloquearán cuando tengan la oportunidad.

Para encontrar posibles interbloqueos, el Comprobador de controladores crea un gráfico del orden de adquisición de recursos y comprueba los bucles. Si tuviera que crear un nodo para cada recurso y dibujar una flecha cada vez que se adquiere un candado antes que otro, entonces los bucles del camino representarían violaciones de jerarquía de candados.

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 los caminos de código en conflicto nunca se producen simultáneamente, deben reescribirse si implican infracciones de jerarquía de bloqueo. Este código es un "bloqueo a punto de ocurrir" que podría provocar bloqueos reales si se reescribe ligeramente.

Cuando Deadlock Detection encuentra una infracción, emitirá el chequeo 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

  • Un hilo que intenta adquirir exclusivamente un recurso del cual ya es titular compartido (los recursos de propiedad exclusiva pueden adquirirse de forma compartida; los recursos compartidos no pueden adquirirse de forma exclusiva).

  • Un subproceso que intenta adquirir el mismo recurso dos veces (un autobloqueo)

  • Un recurso que se libera sin haberse adquirido primero

  • Un recurso que se libera por 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 aún posee recursos

  • A partir de Windows 7, el comprobador de controladores puede predecir posibles interbloqueos. Por ejemplo, intentar usar la misma estructura de datos KSPIN_LOCK tanto como un cerrojo de giro normal como un cerrojo de giro con almacenamiento en cola.

Consulte Bug Check 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) para ver una lista de los parámetros del bug check.

Supervisión de la detección de interbloqueos

Una vez que la detección de interbloqueos encuentra una infracción, se puede usar la extensión del depurador de kernel !deadlock para investigar exactamente lo que ha ocurrido. Puede mostrar la topología de la jerarquía de bloqueos, así como las pilas de llamadas de cada hilo en el momento en el 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. Consulte 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 por fuzzing.

Puede activar la función Detección de interbloqueos para uno o varios controladores mediante el Administrador del verificador de controladores o la línea de comandos Verifier.exe. Para obtener más información, consulte 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 indicador de 0x20 o agregue 0x20 al valor de indicador. 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 función de Detección de interbloqueos también se incluye en la configuración estándar. Por ejemplo:

    verifier /standard /driver MyDriver.sys
    
  • Uso del Administrador del Verificador 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 función de detección de interbloqueos también se incluye en la configuración estándar. Para usar esta característica, en Administrador del Verificador de Controladores, seleccione Crear opciones estándar.