Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El sistema operativo basado en Microsoft Windows NT está diseñado para ejecutarse uniformemente en plataformas de multiprocesador y multiprocesador simétrico (SMP) y los controladores en modo kernel deben diseñarse para hacerlo del mismo modo.
En cualquier plataforma multiprocesador de Windows, existen las siguientes condiciones:
Todas las CPU son idénticas y todos o ninguno de los procesadores deben tener coprocesadores idénticos.
Todas las CPU comparten memoria y tienen acceso uniforme a la memoria.
En una plataforma simétrica, cada CPU puede acceder a la memoria, recibir una interrupción y acceder a los registros de control de E/S. (Por el contrario, en una máquina multiprocesador asimétrica , una CPU toma todas las interrupciones de un conjunto de CPU subordinadas).
Para ejecutarse de forma segura en una plataforma SMP, un sistema operativo debe garantizar que el código que se ejecuta en un procesador no acceda y modifique simultáneamente los datos a los que otro procesador accede y modifica. Por ejemplo, si el ISR de un controlador de nivel inferior controla una interrupción del dispositivo en un procesador, debe tener acceso exclusivo a los registros de dispositivos o a los datos críticos definidos por el controlador, en caso de que su dispositivo interrumpa simultáneamente en otro procesador.
Además, las operaciones de E/S de los controladores que se serializan en una máquina uniprocesador se pueden superponer en una máquina SMP. Es decir, la rutina de un controlador que procesa las solicitudes de E/S entrantes se puede ejecutar en un procesador mientras que otra rutina que se comunica con el dispositivo se ejecuta simultáneamente en otro procesador. Tanto si los controladores en modo kernel se ejecutan en un equipo de varios procesadores uniprocesador como simétrico, deben sincronizar el acceso a los datos definidos por el controlador o a los recursos proporcionados por el sistema que se comparten entre rutinas de controlador y sincronizar el acceso al dispositivo físico, si existe.
El componente de kernel de Windows NT exporta un mecanismo de sincronización, denominado bloqueo de giro, que los controladores pueden usar para proteger los datos compartidos (o registros de dispositivos) de accesos simultáneos por parte de una o más rutinas que se ejecutan concurrentemente en una plataforma multiprocesador simétrica. El kernel aplica dos políticas con respecto al uso de bloqueos de giro:
Solo una rutina puede contener un bloqueo de giro determinado en cualquier momento dado. Antes de acceder a los datos compartidos, cada rutina que debe hacer referencia a los datos primero debe intentar adquirir el bloqueo de giro de los datos. Para acceder a los mismos datos, otra rutina debe adquirir el bloqueo de giro, pero el bloqueo de giro no se puede adquirir hasta que el titular actual lo libere.
El kernel asigna un valor IRQL a cada spinlock en el sistema. Una rutina de modo kernel puede adquirir un spinlock particular solo cuando la rutina se ejecuta en el IRQL asignado del spinlock.
Estas directivas impiden que una rutina de controlador que normalmente se ejecute en un IRQL inferior, pero que actualmente contiene un bloqueo de giro se adelanta a una rutina de controlador de mayor prioridad que intenta adquirir el mismo bloqueo de giro. Por lo tanto, se evita un interbloqueo.
El IRQL que se asigna a un bloqueo de giro suele ser el de la rutina IRQL más alta que puede adquirir el bloqueo de giro.
Por ejemplo, un ISR de controlador de nivel más bajo suele compartir un área de estado con la rutina DPC del controlador. La rutina DPC llama a una rutina de sección crítica proporcionada por el controlador para acceder al área compartida. El bloqueo de giro que protege el área compartida tiene un IRQL igual al DIRQL en el que el dispositivo genera interrupciones. Siempre que la rutina de sección crítica contenga el bloqueo de giro y acceda al área compartida en DIRQL, el ISR no se puede ejecutar en un uniprocesador o en una máquina SMP.
El ISR no se puede ejecutar en una máquina uniprocesador porque la interrupción del dispositivo está enmascarada, como se describe en Always Preemptible y Always Interruptible.
En una máquina SMP, el ISR no puede adquirir el cerrojo de giro que protege los datos compartidos mientras la rutina de sección crítica mantiene el cerrojo de giro y accede a los datos compartidos en DIRQL.
Un conjunto de subprocesos en modo kernel puede sincronizar el acceso a los datos o recursos compartidos esperando por alguno de los objetos del despachador del kernel: un evento, un mutex, un semáforo, un temporizador u otro subproceso. Sin embargo, la mayoría de los controladores no configuran sus propios subprocesos porque tienen un mejor rendimiento cuando evitan conmutadores de contexto de subproceso. Cada vez que las rutinas de soporte y los controladores de modo kernel críticos en tiempo se ejecutan en IRQL = DISPATCH_LEVEL o en DIRQL, deben usar los spinlocks del kernel para sincronizar el acceso a los datos o recursos compartidos.
Para obtener más información, vea Spin Locks, Administración de prioridades de hardware y Objetos de despachador de núcleo.