IRQL

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 8 de mayo de 2014; las comprobaciones requieren 19 ediciones .

IRQL ( Nivel de solicitud de interrupción ) - lit.  " nivel de solicitud de interrupción ". Un mecanismo de priorización de hardware-software utilizado para la sincronización en sistemas operativos de la familia Windows NT .

IRQL es un atributo de software (debido a que no es compatible con el hardware) de un procesador e indica la prioridad del código que se ejecuta en ese procesador con respecto a las interrupciones y otros eventos asíncronos. Para las interrupciones de hardware , en la mayoría de los casos, IRQL se implementa en el hardware (ejemplo: el concepto de prioridad de interrupción en el controlador i8259A o la prioridad de tarea especificada en el registro TPR en APIC), sin embargo, el código del sistema operativo en sí mismo puede lógicamente estar en diferentes prioridades, en cuyo caso se implementan niveles adicionales de IRQL en el software. Por ejemplo, la prioridad del programador de subprocesos o DPC es mayor que la prioridad de los subprocesos de usuario. Si este no fuera el caso, entonces los subprocesos podrían adelantarse al programador y, por lo tanto, "desactivar" la multitarea preventiva , a su vez, el programador podría ser interrumpible por interrupciones de hardware. Windows NT usa 32 niveles IRQL (números entre paréntesis):

Esto significa, por ejemplo, que el programador (ejecutándose en el nivel DPC/DISPATCH) puede ser interrumpido por interrupciones de hardware, interrupciones entre procesadores (IPI), etc., pero no puede ser interrumpido por procedimientos asincrónicos (APC) y subprocesos normales que se ejecutan en el Nivel PASIVO. . Las interrupciones del interprocesador IPI pueden ser interrumpidas por una falla de energía (interrupción de nivel de falla de energía), pero no pueden ser interrumpidas por interrupciones de hardware normales de dispositivos, etc.

IRQL también ayuda a rastrear e identificar errores lógicos en el diseño del sistema operativo. El legendario error con el mensaje IRQL_NOT_LESS_OR_EQUAL significa la siguiente situación: un controlador u otro código privilegiado con IRQL >= DPC/DISPATCH accedió a una página que falta [1] en la memoria, se requiere una llamada a un subsistema que carga páginas desde el disco , pero este subsistema, de acuerdo con la arquitectura de Windows NT, tiene IRQL menor que DPC/DISPATCH. Por lo tanto, no tiene derecho a interrumpir el código que provocó el fallo de página. Al mismo tiempo, el código privilegiado no puede seguir ejecutándose hasta que se cargue la página. Hay un callejón sin salida lógico que, de hecho, conduce al colapso del sistema operativo.

Al ejecutar código con IRQL >= DPC/DISPATCH, cualquier estado de espera en una primitiva de sincronización ( mutex , semáforo ) hace que el sistema operativo se bloquee; Cuando el subproceso actual entra en este estado, el programador de subprocesos debe programar otro subproceso en el núcleo del procesador actual. Pero dado que la prioridad del programador es DPC/DISPATCH, no podrá interrumpir el hilo actual .

Linux utiliza mecanismos similares. Por ejemplo, el código del controlador de interrupciones se puede dividir en dos "mitades": la mitad superior y la mitad inferior, la parte "superior" es equivalente al controlador en sí, la parte "inferior" es el procedimiento diferido (análogo en Windows es DPC ) . Un procedimiento de mitad inferior puede ser interrumpido por un procedimiento de mitad superior, pero no viceversa. Por lo tanto, la mitad superior y la mitad inferior son lógicamente equivalentes a los niveles IRQL y DPC/DISPATCH del dispositivo IRQL, respectivamente.

Cumplimiento de los acuerdos del sistema

La documentación técnica de Windows NT ( MSDN Library ) limita el tiempo de ejecución continua del código en IRQL elevados. Para niveles de interrupción de hardware (DIRQL) el límite es 10-20 µs [2] . Para el nivel de programa DISPATCH_LEVEL, se dan valores conflictivos en 25 [3] y 100 [4] µs .

Sin embargo, estos límites a menudo son violados incluso por el kernel nativo de Windows y el código del controlador, por no hablar de los controladores de terceros, lo que crea demoras ocultas . Esto no tiene un efecto notable en el funcionamiento normal del sistema, sin embargo, puede degradar en gran medida el rendimiento en tiempo real , por ejemplo, en la transmisión de medios (esto es especialmente notable en el sonido [5] [6] ). Para detectar tales violaciones, se han desarrollado los programas DPC Latency Checker  (enlace inaccesible)  (inglés) y LatencyMon  (inglés) . Un análisis del funcionamiento de varias versiones de Windows que utilizan dichos programas muestra que estas violaciones se están corrigiendo gradualmente.

Literatura

Notas

  1. El código que se ejecuta con IRQL >= DPC/DISPATCH debe acceder a los datos, incl. "Grupo no paginado " Windows NT.
  2. Ejemplos de sincronización Archivado el 2 de marzo de 2016 en Wayback Machine . 
  3. Introducción a Spin Locks Archivado el 2 de marzo de 2016 en Wayback Machine . 
  4. Pautas para escribir rutinas de DPC Archivado el 2 de marzo de 2016 en Wayback Machine . 
  5. Windows Vista Tuning Tips for Audio Processing Archivado el 25 de marzo de 2016 en Wayback Machine . 
  6. Sugerencias de ajuste de Windows XP para procesamiento de audio Archivado el 25 de marzo de 2016 en Wayback Machine .