Multiprocessor-Safe

El sistema operativo basado en Microsoft Windows NT está diseñado para ejecutarse uniformemente en plataformas de uniprocesador y multiprocesador simétrico (SMP), y los controladores en modo kernel deben estar diseñados 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, tomar una interrupción y registrar el control de E/S de acceso. (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 accede y modifica simultáneamente los datos a los que otro procesador accede y modifica. Por ejemplo, si un ISR de 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 una máquina de varios procesadores simétricos como en un uniprocesador, 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 número, que los controladores pueden usar para proteger los datos compartidos (o registros de dispositivos) del acceso simultáneo mediante una o varias rutinas que se ejecutan simultáneamente en una plataforma de varios procesadores simétricos. El kernel aplica dos directivas con respecto al uso de bloqueos de número:

  • Solo una rutina puede contener un bloqueo de giro determinado en un 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 número 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 bloqueo de número en el sistema. Una rutina de modo kernel solo puede adquirir un bloqueo de número determinado cuando la rutina se ejecuta en el IRQL asignado del bloqueo de número.

Estas directivas impiden que una rutina de controlador que normalmente se ejecute en un IRQL inferior, pero que actualmente contiene un bloqueo de número de giro se adelanta mediante 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 número es generalmente el de la rutina IRQL más alta que puede adquirir el bloqueo de número.

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 número que protege el área compartida tiene un IRQL igual al DIRQL en el que se interrumpe el dispositivo. 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 Siempre preemptible y Siempre interrumpible.

  • En una máquina SMP, el ISR no puede adquirir el bloqueo de número que protege los datos compartidos mientras la rutina de sección crítica contiene el bloqueo 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 uno de los objetos de distribuidor del kernel: un evento, exclusión mutua, semáforo, 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 subprocesos. Siempre que el modo kernel crítico para el tiempo admita rutinas y controladores que se ejecutan en IRQL = DISPATCH_LEVEL o en DIRQL, deben usar los bloqueos de número del kernel para sincronizar el acceso a los datos o recursos compartidos.

Para obtener más información, vea Bloqueos de número, Administración de prioridades de hardware y Objetos de distribuidor de kernel.