Oplocks

Die Artikel zu Oplocks in diesem Abschnitt beziehen sich in erster Linie auf Netzwerkumleitungen, obwohl einige Informationen für Clientanwendungen bereitgestellt werden. Weitere Oplock-Informationen für Clientanwendungen finden Sie in den Artikeln zu Opportunistic Locks des Windows SDK.

Übersicht über Oplock

Ein Oplock (opportunistische Sperre) ist eine Sperre, die von einem Client in einer Datei platziert wird, die sich auf einem Server befindet. In den meisten Fällen fordert ein Client einen oplock an, damit er Daten lokal zwischenspeichern kann. Oplocks werden von Netzwerkumleitungen auf Clients mit Remoteservern und von Clientanwendungen auf lokalen Servern verwendet. Eine Beschreibung der verschiedenen aktuellen und älteren Oplocks finden Sie unter Typen von Oplocks .

Oplocks ermöglichen Dateiserverclients (z. B. Clients, die die Protokolle SMB und SMB2 verwenden), die Pufferstrategie für eine bestimmte Datei oder einen bestimmten Stream konsistent dynamisch zu ändern. Die Verwendung von oplocks erhöht die Leistung und reduziert die Netzwerknutzung. Um die Netzwerkleistung für Remotedateivorgänge zu erhöhen, kann ein Client Dateidaten lokal puffern, wodurch das Senden und Empfangen von Netzwerkpaketen verringert oder beseitigt wird. Beispiel:

  • Ein Client muss möglicherweise keine Informationen in eine Datei auf einem Remoteserver schreiben, wenn der Client weiß, dass kein anderer Prozess auf die Daten zugreift.
  • Ein Client kann Lesedaten aus der Remotedatei puffern, wenn der Client weiß, dass kein anderer Prozess Daten in die Remotedatei schreibt.

Anwendungen und Treiber können auch oplocks verwenden, um transparent auf Dateien zuzugreifen, ohne dass sich dies auf andere Anwendungen auswirkt, die diese Dateien möglicherweise verwenden müssen.

Dateisysteme wie NTFS unterstützen mehrere Datenströme pro Datei. Das System gewährt Oplocks für Streamhandles, was bedeutet, dass der Oplock für eine bestimmte Öffnung eines Dateidatenstroms gewährt wird und die Vorgänge auf diesen Stream angewendet werden. Mit wenigen Ausnahmen wirken sich Vorgänge in einem Stream nicht auf Oplocks für einen anderen Stream aus. Weitere Informationen finden Sie unter Anfordern und Gewähren von Oplocks.

Für Dateisysteme, die keine alternativen Datenströme unterstützen, z. B. FAT, denken Sie an "Datei", wenn oplock-Diskussionen auf "Stream" verweisen.

Die kernige Oplock-Funktionalität des oplock-Pakets wird im Kernel implementiert, hauptsächlich durch FsRtlXxx-Routinen wie FsRtlInitializeOplock. Dateisysteme rufen dieses Paket auf, um die Oplock-Funktionalität in ihrem Dateisystem zu implementieren. In den oplock-Artikeln in diesem Abschnitt wird beschrieben, wie das NTFS-Dateisystem mit dem Kernel-Oplock-Paket interagiert. Andere Dateisysteme funktionieren ähnlich, obwohl es geringfügige Unterschiede geben kann.

Oplock-Schlüssel

Ab Windows 7 kann das Streamhandle einem oplock-Schlüssel zugeordnet werden, einem GUID-Wert, der zum Identifizieren mehrerer Handles verwendet wird, die zur gleichen Clientcacheansicht gehören. Es ist genauer zu sagen, dass der oplock-Schlüssel der FILE_OBJECT Struktur zugeordnet ist, auf die sich das Streamhandle bezieht. Diese Unterscheidung ist wichtig, wenn das Handle dupliziert wird, z. B. mit DuplicateHandle. Jedes duplizierte Handle bezieht sich auf dieselbe zugrunde liegende FILE_OBJECT Struktur.

Der oplock-Schlüssel kann explizit (für IoCreateFileEx) angegeben werden, wenn das Streamhandle erstellt wird. Das System behandelt den Handle so, dass ihm ein eindeutiger Oplock-Schlüssel zugeordnet ist, wenn ein Oplock-Schlüssel beim Erstellen des Handles nicht explizit angegeben wird, wobei sich sein Schlüssel von jedem anderen Schlüssel auf einem anderen Handle unterscheidet.

Ein Oplock ist unterbrochen, wenn:

  • Ein Dateivorgang wird für ein anderes Handle als das empfangen, für das der Oplock gewährt wurde, UND
  • Der oplock-Schlüssel, der dem Handle des oplock zugeordnet ist, unterscheidet sich von dem Schlüssel, der dem Handle des Vorgangs zugeordnet ist, UND
  • Der Vorgang ist nicht mit dem derzeit gewährten Oplock kompatibel.

Der Oplock wird unterbrochen, auch wenn es sich um denselben Prozess oder Thread handelt, der den inkompatiblen Vorgang ausführt. Beispielsweise wird ein exklusiver Oplock sofort unterbrochen, wenn:

  1. Ein Prozess öffnet einen Stream, für den ein exklusiver Oplock gewährt wird.
  2. Derselbe Prozess öffnet dann denselben Stream erneut mit einem anderen (oder keinem) Oplock-Schlüssel.

Weitere Informationen finden Sie unter Breaking Oplocks.

Denken Sie daran, dass oplock-Schlüssel auf Handlen vorhanden sind und sie beim Erstellen des Handles auf dem Handle "aufgesetzt" werden. Sie können ein Handle einem oplock-Schlüssel zuordnen, auch wenn keine Oplocks gewährt werden.