Partager via


Sûr pour le multiprocesseur

Le système d’exploitation Microsoft Windows NT est conçu pour s’exécuter uniformément sur des plateformes monoprocesseur et multiprocesseur symétrique (SMP), et les pilotes en mode noyau doivent être conçus de la même façon.

Dans n’importe quelle plateforme multiprocesseur Windows, les conditions suivantes existent :

  • Tous les processeurs sont identiques, et tous ou aucun des processeurs doivent avoir des coprocesseurs identiques.

  • Tous les processeurs partagent de la mémoire et ont un accès uniforme à la mémoire.

  • Dans une plateforme symétrique , chaque processeur peut accéder à la mémoire, prendre une interruption et accéder aux registres de contrôle d’E/S. (En revanche, dans une machine multiprocesseur asymétrique , un processeur accepte toutes les interruptions pour un ensemble de processeurs subordonnés.)

Pour s’exécuter en toute sécurité sur une plateforme SMP, un système d’exploitation doit garantir que le code qui s’exécute sur un processeur n’accède pas simultanément aux données auxquelles un autre processeur accède et modifie. Par exemple, si l’ISR d’un pilote de niveau le plus bas gère une interruption d’appareil sur un processeur, elle doit avoir un accès exclusif aux registres d’appareils ou aux données critiques définies par le pilote, en cas d’interruption simultanée de son appareil sur un autre processeur.

En outre, les opérations d’E/S des pilotes sérialisées dans une machine uniprocesseur peuvent se chevaucher dans un ordinateur SMP. Autrement dit, la routine d’un pilote qui traite les demandes d’E/S entrantes peut s’exécuter sur un processeur, tandis qu’une autre routine qui communique avec l’appareil s’exécute simultanément sur un autre processeur. Que les pilotes en mode noyau s’exécutent sur un ordinateur multiprocesseur uniprocesseur ou symétrique, ils doivent synchroniser l’accès aux données définies par le pilote ou aux ressources fournies par le système qui sont partagées entre les routines de pilotes, et synchroniser l’accès à l’appareil physique, le cas échéant.

Le composant noyau Windows NT exporte un mécanisme de synchronisation, appelé verrou de rotation, que les pilotes peuvent utiliser pour protéger les données partagées (ou les registres d’appareils) contre l’accès simultané par une ou plusieurs routines qui s’exécutent simultanément sur une plateforme multiprocesseur symétrique. Le noyau applique deux stratégies concernant l’utilisation de verrous de rotation :

  • Une seule routine peut contenir un verrou de rotation particulier à un moment donné. Avant d’accéder aux données partagées, chaque routine qui doit référencer les données doit d’abord tenter d’acquérir le verrou de rotation des données. Pour accéder aux mêmes données, une autre routine doit acquérir le verrou de rotation, mais le verrou de rotation ne peut pas être acquis tant que le titulaire actuel ne l’a pas libéré.

  • Le noyau affecte une valeur IRQL à chaque verrou de rotation dans le système. Une routine en mode noyau peut acquérir un verrou tournant particulier uniquement lorsque la routine est exécutée au niveau IRQL attribué au verrou tournant.

Ces politiques empêchent qu'une routine de pilote, qui s'exécute généralement à un IRQL inférieur et détient actuellement un spinlock, soit préemptée par une routine de pilote de priorité supérieure qui tente d'acquérir le même spinlock. Ainsi, un interblocage est évité.

L’IRQL affecté à un verrou de rotation est généralement celui de la routine IRQL la plus élevée qui peut acquérir le verrou de rotation.

Par exemple, l’ISR d’un pilote de niveau le plus bas partage fréquemment une zone d’état avec la routine DPC du pilote. La routine DPC appelle une routine de section critique fournie par le pilote pour accéder à la zone partagée. Le verrou de rotation qui protège la zone partagée a un IRQL égal au DIRQL auquel se produit l'interruption de l’appareil. Tant que la routine de section critique contient le verrou de rotation et accède à la zone partagée au niveau de DIRQL, l’ISR ne peut pas être exécuté sur un ordinateur uniprocesseur ou SMP.

  • L’ISR ne peut pas être exécuté sur un ordinateur uniprocesseur, car l’interruption de l’appareil est masquée, comme décrit dans Always Preemptible et Always Interruptible.

  • Dans une machine SMP, l’ISR ne peut pas acquérir le verrou de rotation qui protège les données partagées tandis que la routine de section critique contient le verrou de rotation et accède aux données partagées au niveau de DIRQL.

Un ensemble de threads en mode noyau peut synchroniser l’accès aux données ou ressources partagées en attendant l’un des objets de répartiteur du noyau : un événement, un mutex, un sémaphore, un minuteur ou un autre thread. Toutefois, la plupart des pilotes ne configurent pas leurs propres threads, car ils bénéficient de meilleures performances lorsqu’ils évitent les commutations de contexte de thread. Chaque fois que les routines de support et les pilotes en mode noyau critique s’exécutent à IRQL = DISPATCH_LEVEL ou DIRQL, ils doivent utiliser les verrous tournants du noyau pour synchroniser l’accès aux données ou ressources partagées.

Pour plus d’informations, consultez Spin Locks, Managing Hardware Priorities et Kernel Dispatcher Objects.