DISPATCH LEVEL (en el sistema operativo Windows ) es el nivel de prioridad (modo de operación) del hilo en el que se suspende la multitarea preventiva .
La ejecución en este modo solo es posible en el kernel del sistema operativo , el código de modo de usuario no tiene forma de ejecutarse en este modo.
El nivel DISPATCH, al igual que los niveles de prioridad más bajos (APC y PASSIVE), no está relacionado con los modos de hardware del procesador y solo lo proporciona el software.
Este nivel se utiliza para realizar acciones que no permiten la violación de la correspondencia entre el subproceso actual y el procesador ( núcleo del procesador ), ya sea cambiando el procesador a otro subproceso y el subproceso a otro procesador. En un sistema monoprocesador, esto simplemente significa que no se ejecutará ningún código de modo de usuario hasta que se reduzca el nivel de prioridad. En un sistema multiprocesador , esto solo es cierto para el procesador actual (núcleo), pero también garantiza que el subproceso actual no se mueva a otro procesador (núcleo).
En particular, el nivel DISPATCH se usa al implementar Spin Locks . Si se adquiere el bloqueo mientras se mantiene la multitarea preventiva , el subproceso actual se puede interrumpir en cualquier momento con el procesador cambiando a un nuevo subproceso. Dado que no se sabe qué acciones realizará el nuevo subproceso, es posible que vuelva a capturar el mismo Spin Lock, lo que conducirá al bloqueo mutuo de ambos subprocesos. Dado que solo el código del sistema se ejecuta en los niveles de prioridad más altos, es muy probable que esto conduzca a un bloqueo completo ( suspensión ) de todo el sistema.
Para evitar esto, el sistema operativo detiene la multitarea preventiva antes de agarrar el Spin Lock. Además, en el caso de un solo procesador, esto es suficiente para garantizar la semántica de captura de bloqueo ; el bloqueo real ya no es necesario y no se usa en el kernel del sistema operativo creado para un solo procesador.
La desactivación de la conmutación de subprocesos también evita un largo bucle de espera de liberación de bloqueo en un sistema multiprocesador, lo que conduciría a un uso improductivo de los recursos del procesador. Elevar el nivel de prioridad asegura que un subproceso que ha adquirido un bloqueo en otro procesador/núcleo sólo puede ser interrumpido por controladores de interrupción , cuyo tiempo de ejecución no debe exceder varias decenas de microsegundos .
Código ejecutándose en DISPATCH_LEVEL:
Restricciones en DISPATCH_LEVEL:
El código que se ejecuta en DISPATCH_LEVEL aún puede ser interrumpido por cualquier interrupción , aunque con la garantía de que la interrupción no cambiará el hilo actual. Si es necesario sincronizar el acceso a datos y registros de hardware utilizados tanto desde una interrupción como desde otro código, debe usar un bloqueo relacionado con la interrupción, es decir, KeSynchronizeExecution o KeAcquireInterruptSpinLock. Está prohibido usar bloqueos normales en esta situación, así como en los mismos controladores de interrupción.
Un análogo aproximado en Linux es "código que no se puede bloquear" (no se puede bloquear). La regla de Linux de que el código que posee un spinlock no puede bloquear es exactamente la misma que la regla correspondiente en Windows.