Introducción a los DPC en subprocesos

Los DPC en subprocesos están disponibles en Windows Vista y versiones posteriores de Windows.

Un DPC subproceso es un DPC que el sistema ejecuta en IRQL igual a PASSIVE_LEVEL. Los DPC subprocesos están habilitados de forma predeterminada, pero puede deshabilitarlos estableciendo la clave del Registro HKLM\System\CCS\Control\SessionManager\Kernel\ThreadDpcEnable en cero. Cuando se deshabilitan los DPC en subprocesos, se ejecutan como DPC normales.

Un DPC normal adelanta la ejecución de todos los subprocesos y no puede ser reemplazado por un subproceso o por otro DPC. Si el sistema tiene un gran número de DPC normales en cola, o si uno de esos DPC se ejecuta durante mucho tiempo, cada subproceso permanecerá en pausa durante un tiempo arbitrariomente largo. Por lo tanto, cada DPC normal aumenta la latencia del sistema, lo que puede afectar al rendimiento de las aplicaciones sensibles al tiempo, como la reproducción de audio o vídeo.

Por el contrario, un DPC subproceso puede ser reemplazado por un DPC normal, pero no por otros subprocesos. Por lo tanto, debe usar DPC en subprocesos en lugar de DPC normales, a menos que un DPC determinado no se deba adelantar, ni siquiera por otro DPC.

El sistema representa dpCs en subprocesos (y DPC normales) como estructuras KDPC . Para inicializar una estructura KDPC para un DPC subproceso, llame a la rutina KeInitializeThreadedDpc y pásela una rutina CustomThreadedDpc que realice la acción del DPC.

Dado que una rutina CustomThreadedDpc se puede ejecutar en PASSIVE_LEVEL o DISPATCH_LEVEL, debe asegurarse de que la rutina CustomThreadedDpc se sincronice correctamente en ambas IRQL. Para obtener más información sobre cómo hacerlo, consulte Sincronización y DPC en subprocesos.

Además, debe asegurarse de que la rutina CustomThreadedDpc obedece todas las restricciones para DISPATCH_LEVEL código. Si los DPC en subprocesos están habilitados, se ejecutan en IRQL = PASSIVE_LEVEL, pero siguen estando sujetos a las mismas restricciones que los DPC normales. Todo el código que se ejecuta en un DPC subproceso, incluidas todas las funciones a las que llama la rutina CustomThreadedDpc , deben cumplir las restricciones del entorno DPC. Por ejemplo, el código no debe bloquearse en objetos de sincronización de nivel pasivo, como los objetos KEVENT. Muchas pilas de dispositivos existentes, como redes y USB, no admiten el procesamiento de DPC en subprocesos y pueden intentar bloquear si detectan que se les llama en PASSIVE_LEVEL. Por motivos similares, el marco de controlador del modo kernel (KMDF) no admite el procesamiento de DPC en subproceso y los controladores KMDF no deben intentar usar DPC en subprocesos. Para obtener más información sobre el entorno DPC, consulte Escritura de rutinas de DPC.

Para agregar un DPC en subproceso a la cola de DPC, llame a KeInsertQueueDpc. Para quitar un DPC subproceso de la cola antes de que se ejecute, llame a KeRemoveQueueDpc.