Partager via


Oplocks et redirecteurs réseau

Les redirecteurs de réseau utilisent des verrous opportunistes (oplocks) pour optimiser les performances d’accès aux fichiers et réduire le trafic réseau dans les environnements client-serveur.

Cette documentation est destinée aux développeurs de redirecteurs de réseau, bien que certaines informations s’appliquent aux développeurs d’applications clientes. Pour plus de documentation sur les oplocks liés aux applications clientes, veuillez consulter la section Opportunistic Locks des articles du Windows SDK.

Vue d’ensemble d’Oplock

Un oplock (verrou opportuniste) est un verrou placé par un client sur un fichier qui réside sur un serveur. Dans la plupart des cas, un client demande un oplock pour pouvoir mettre en cache des données localement. Les oplocks sont utilisés par les redirecteurs de réseau sur les clients avec des serveurs distants, ainsi que par des applications clientes sur des serveurs locaux. Veuillez consulter la section Types of oplocks pour une description des différents oplocks actuels et hérités.

Les oplocks permettent aux clients de serveur de fichiers (tels que les clients utilisant les protocoles SMB et SMB2) de modifier dynamiquement la stratégie de mise en mémoire tampon pour un fichier donné ou un segment de manière cohérente. L’utilisation des oplocks améliore les performances et réduit l’utilisation du réseau. Pour améliorer les performances réseau des opérations de fichiers à distance, un client peut mettre en mémoire tampon les données de fichiers localement, ce qui réduit ou élimine la nécessité d’envoyer et de recevoir des paquets réseau. Par exemple :

  • Un client peut ne pas avoir à écrire des informations dans un fichier sur un serveur distant si le client sait qu’aucun autre processus n’accède aux données.
  • Un client peut mettre en mémoire tampon des données de lecture anticipée à partir du fichier distant si le client sait qu’aucun autre processus n’écrit des données dans le fichier distant.

Les applications et les pilotes peuvent également utiliser des oplocks pour accéder aux fichiers de manière transparente sans affecter les autres applications qui pourraient avoir besoin d’utiliser ces fichiers.

Les systèmes de fichiers comme NTFS prennent en charge plusieurs flux de données par fichier. Le système accorde des oplocks sur des handles de segments, ce qui signifie que l’oplock est accordé pour une ouverture donnée d’un segment de fichier et que les opérations s’appliquent à ce segment. À quelques exceptions près, les opérations sur un segment n’affectent pas les oplocks sur un autre segment. Pour plus d’informations, consultez la section Demande et octroi d’oplocks.

Pour les systèmes de fichiers qui ne prennent pas en charge les flux de données alternatifs, tels que FAT, considérez « fichier » lorsque les discussions sur les oplocks se réfèrent à « segment ».

La fonctionnalité centrale des oplocks du package d’oplocks est implémentée dans le noyau, principalement via les routines FsRtlXxx telles que FsRtlInitializeOplock. Les systèmes de fichiers appellent ce package pour implémenter la fonctionnalité des oplocks dans leur système de fichiers. Les articles sur les oplocks dans cette section décrivent comment le système de fichiers NTFS interagit avec le package d’oplocks du noyau. D’autres systèmes de fichiers fonctionnent de manière similaire, bien qu’il puisse y avoir des différences mineures.

Clés d’oplock

Le handle de segment peut être associé à une clé d’oplock, qui est une valeur GUID qui identifie plusieurs handles appartenant à la même vue de cache client. Il est plus exact de dire que la clé d’oplock est associée à la structure FILE_OBJECT à laquelle le handle de segment fait référence. Cette distinction est importante lorsque le handle est dupliqué, comme avec DuplicateHandle. Chacun des handles dupliqués se réfère à la même structure FILE_OBJECT sous-jacente.

La clé d’oplock peut être explicitement fournie (à IoCreateFileEx) lorsque le handle de segment est créé. Si une clé d’oplock n’est pas explicitement spécifiée lors de la création du handle, le système considère que le handle a une clé d’oplock unique associée. Cette clé unique diffère de toute autre clé sur tout autre handle.

Un oplock est rompu lorsque :

  • Une opération de fichier est reçue sur un handle autre que celui sur lequel l’oplock a été accordé, ET
  • La clé d’oplock associée au handle de l’oplock diffère de la clé associée au handle de l’opération, ET
  • L’opération n’est pas compatible avec l’oplock actuellement accordé.

L’oplock est rompu même si c’est le même processus ou thread qui effectue l’opération incompatible. Par exemple, un oplock exclusif est rompu immédiatement lorsque :

  1. Un processus ouvre un segment pour lequel un oplock exclusif est accordé.
  2. Ce même processus ouvre ensuite à nouveau le même segment en utilisant une clé d’oplock différente (ou aucune clé d’oplock).

Pour plus d’informations, consultez la section Rompre les oplocks.

N’oubliez pas que les clés d’oplock existent sur les handles, et elles sont « placées » sur le handle lors de la création du handle. Vous pouvez associer un handle à une clé d’oplock même si aucun oplock n’est accordé.