Multiprocessor-Safe
Le système d’exploitation Microsoft Windows NT est conçu pour s’exécuter uniformément sur les plateformes monoprocesseur et multiprocesseur symétrique (SMP), et les pilotes en mode noyau doivent être conçus pour faire de même.
Dans toute plateforme multiprocesseur Windows, les conditions suivantes existent :
Tous les processeurs sont identiques, et tous les processeurs ou aucun des processeurs doivent avoir des coprocesseurs identiques.
Tous les processeurs partagent 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, effectuer une interruption et accéder aux registres de contrôle d’E/S. (En revanche, dans un ordinateur 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 qu’un autre processeur accède et modifie. Par exemple, si l’ISR d’un pilote de niveau inférieur gère une interruption de périphérique sur un processeur, il doit disposer d’un accès exclusif aux registres de périphériques ou aux données critiques définies par le pilote, au cas où son appareil s’interrompt simultanément sur un autre processeur.
En outre, les opérations d’E/S des pilotes sérialisées dans un ordinateur monoprocesseur 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 ou multiprocesseur 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 pilote, et synchroniser l’accès au périphérique physique, le cas échéant.
Le composant noyau Windows NT exporte un mécanisme de synchronisation, appelé verrou tournant, 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 des 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 tournant 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 détenteur 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 de rotation particulier uniquement lorsque la routine est exécutée au niveau de l’IRQL attribué au verrou de rotation.
Ces stratégies empêchent une routine de pilote qui s’exécute généralement à un IRQL inférieur mais qui contient actuellement un verrou de rotation d’être préemptée par une routine de pilote de priorité plus élevée qui tente d’acquérir le même verrou de rotation. Ainsi, un interblocage est évité.
L’IRQL qui est 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 inférieur 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 l’appareil s’interrompt. Tant que la routine de section critique conserve 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 monoprocesseur ou une machine SMP.
L’ISR ne peut pas être exécuté sur un ordinateur monoprocesseur, car l’interruption de l’appareil est masquée, comme décrit dans Always Preemptible et Always Interruptible.
Dans un ordinateur SMP, l’ISR ne peut pas acquérir le verrou de rotation qui protège les données partagées alors que la routine de section critique détient 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 ont de meilleures performances lorsqu’ils évitent les commutateurs de contexte de thread. Chaque fois que les routines et pilotes de prise en charge du mode noyau critiques s’exécutent à IRQL = DISPATCH_LEVEL ou à DIRQL, ils doivent utiliser les verrous de rotation du noyau pour synchroniser l’accès aux données ou ressources partagées.
Pour plus d’informations, consultez Verrous de rotation, Gestion des priorités matérielles et Objets de répartiteur de noyau.