Typen von opportunistischen Sperren
Die opportunistischen Sperrvorgänge funktionieren mit vier Arten von opportunistischen Sperren: Ebene 1, Ebene 2, Batch und Filter. Exklusive opportunistische Sperren sind Level 1, Batch- und Filtersperren. Wenn ein Thread über eine exklusive Sperre für eine Datei verfügt, kann er nicht auch über eine Sperre der Ebene 2 für dieselbe Datei verfügen.
Stufe 1 Opportunistische Sperren
Eine opportunistische Sperre der Ebene 1 für eine Datei ermöglicht es einem Client, die Datei vorzulesen und sowohl Lese- als auch Schreibdaten aus der Datei lokal zwischenzuspeichern. Solange der Client alleinigen Zugriff auf eine Datei hat, besteht keine Gefahr für die Datenkohärenz, wenn eine opportunistische Sperre der Ebene 1 bereitgestellt wird.
Der Client kann nach dem Öffnen einer Datei eine opportunistische Sperre der Ebene 1 anfordern. Wenn kein anderer Client (oder kein anderer Thread auf demselben Client) die Datei geöffnet hat, kann der Server die opportunistische Sperre gewähren. Der Client kann dann Lese- und Schreibdaten aus der Datei lokal zwischenspeichern. Wenn die Datei von einem anderen Client geöffnet wurde, lehnt der Server die opportunistische Sperre ab, und der Client führt keine lokale Zwischenspeicherung durch. (Der Server kann die opportunistische Sperre auch aus anderen Gründen ablehnen, z. B. nicht unterstützt opportunistische Sperren.)
Wenn der Server eine Datei öffnet, die bereits über eine opportunistische Sperre der Ebene 1 verfügt, überprüft der Server den Freigabestatus der Datei, bevor er die opportunistische Sperre der Ebene 1 durchbricht. Wenn der Server die Sperre nach dieser Untersuchung bricht, ist die Zeit, die der Client mit der früheren Sperre damit verbringt, seinen Schreibcache zu leeren, die Der Client, der die Datei anfordert, warten muss. Dieser Zeitaufwand bedeutet, dass opportunistische Sperren der Ebene 1 für Dateien vermieden werden sollten, die von vielen Clients geöffnet werden.
Da der Server jedoch den Freigabestatus überprüft, bevor die Sperre unterbrochen wird, wird die Sperre nicht unterbrochen, wenn der Server aufgrund eines Freigabekonflikts eine offene Anforderung ablehnen würde. Wenn Sie z. B. eine Datei geöffnet, die Freigabe für Schreibvorgänge verweigert und eine Sperre der Ebene 1 erhalten haben, lehnt der Server die Anforderung eines anderen Clients ab, die Datei zum Schreiben zu öffnen, bevor er ihre Sperre für die Datei überprüft. In diesem instance wird Ihre opportunistische Sperre nicht unterbrochen.
Ein Beispiel für die Funktionsweise einer opportunistischen Sperre der Ebene 1 finden Sie unter Beispiel für opportunistische Sperre der Ebene 1. Weitere Informationen zum Brechen opportunistischer Sperren finden Sie unter Breaking Opportunistic Locks( Breaking Opportunistic Locks).
Stufe 2 Opportunistische Sperren
Eine opportunistische Sperre der Ebene 2 informiert einen Client darüber, dass es mehrere gleichzeitige Clients einer Datei gibt und dass sie noch nicht geändert wurde. Mit dieser Sperre kann der Client Lesevorgänge ausführen und Dateiattribute mithilfe von zwischengespeicherten oder lokalen Informationen abrufen, aber der Client muss alle anderen Anforderungen (z. B. für Schreibvorgänge) an den Server senden. Ihre Anwendung sollte die opportunistische Sperre der Ebene 2 verwenden, wenn Sie erwarten, dass andere Anwendungen zufällig in die Datei schreiben oder die Datei zufällig oder sequenziell lesen.
Eine opportunistische Sperre der Ebene 2 ist einer opportunistischen Filtersperre sehr ähnlich. In den meisten Situationen sollte Ihre Anwendung die opportunistische Sperre der Ebene 2 verwenden. Verwenden Sie die Filtersperre nur, wenn Sie nicht möchten, dass beim Lesen geöffnete Vorgänge zu Verstößen im Freigabemodus in der Zeitspanne zwischen dem Öffnen der Datei ihrer Anwendung und dem Erhalt der Sperre führen. Weitere Informationen finden Sie unter Filtern opportunistischer Sperren und Serverantwort auf offene Anforderungen für gesperrte Dateien.
Weitere Informationen zum Brechen opportunistischer Sperren finden Sie unter Breaking Opportunistic Locks( Breaking Opportunistic Locks).
Batch-Opportunistische Sperren
Eine batchoprtunistische Sperre bearbeitet Dateiöffnungen und -schließen. Bei der Ausführung einer Batchdatei kann die Batchdatei beispielsweise einmal für jede Zeile der Datei geöffnet und geschlossen werden. Eine batchoprtunistische Sperre öffnet die Batchdatei auf dem Server und hält sie geöffnet. Während der Befehlsprozessor die Batchdatei "öffnet" und "schließt", fängt der Netzwerkumleitung die Befehle zum Öffnen und Schließen ab. Alle Vom Server empfangenen Befehle "seek" und "read". Wenn der Client ebenfalls vorliest, empfängt der Server höchstens einmal eine bestimmte Leseanforderung.
Beim Öffnen einer Datei, die bereits über eine batchoprtunistische Sperre verfügt, überprüft der Server den Freigabestatus der Datei, nachdem die Sperre aufgehoben wurde. Diese Überprüfung gibt dem Besitzer der Sperre die Möglichkeit, das Leeren des Caches abzuschließen und das Dateihandle zu schließen. Ein geöffneter Vorgang, der während der Freigabeüberprüfung versucht wird, führt nicht dazu, dass die Freigabeüberprüfung fehlschlägt, wenn der Sperrhalter die Sperre freigibt.
Ein Beispiel für die Funktionsweise einer batchoprtunistischen Sperre finden Sie unter Batch Opportunistic Lock Example. Weitere Informationen zum Brechen opportunistischer Sperren finden Sie unter Breaking Opportunistic Locks( Breaking Opportunistic Locks).
Filtern opportunistischer Sperren
Eine filteroprtunistische Sperre sperrt eine Datei, sodass sie nicht für schreib- oder löschzugriff geöffnet werden kann. Alle Clients müssen die Datei freigeben können. Filtersperren ermöglichen Anwendungen das Ausführen von nichtintrusiven Filtervorgängen für Dateidaten (z. B. einen Compiler, der Quellcode öffnet oder ein Katalogisierungsprogramm).
Eine opportunistische Filtersperre unterscheidet sich von einer opportunistischen Sperre der Ebene 2 darin, dass geöffnete Lesevorgänge ohne Verletzungen des Freigabemodus in der Zeitspanne zwischen dem Öffnen der Datei ihrer Anwendung und dem Empfang der Sperre möglich sind. Die opportunistische Filtersperre ist die beste Sperre, wenn es wichtig ist, anderen Clients Lesezugriff zu gewähren. In anderen Fällen sollte Ihre Anwendung eine opportunistische Sperre der Ebene 2 verwenden. Eine opportunistische Filtersperre unterscheidet sich von einer batchoprtunistischen Sperre darin, dass sie es nicht zulässt, dass mehrere Öffnungen und Schließen vom Netzwerkumleitung behandelt werden, wie es bei einer batchoprtunistischen Sperre der Fall ist.
Ihre Anwendung sollte in drei Schritten eine opportunistische Filtersperre für eine Datei anfordern:
- Verwenden Sie die CreateFile-Funktion , um ein Handle für die Datei zu öffnen, wobei der DesiredAccess-Parameter auf null festgelegt ist, der keinen Zugriff angibt, und der dwShareMode-Parameter , der auf das flag FILE_SHARE_READ festgelegt ist, um die Freigabe zum Lesen zu ermöglichen. Das an diesem Punkt abgerufene Handle wird als Sperrhandle bezeichnet.
- Fordern Sie eine Sperre für dieses Handle mit dem FSCTL_REQUEST_FILTER_OPLOCK-Steuerelementcode an.
- Wenn die Sperre gewährt wird, verwenden Sie CreateFile , um die Datei erneut zu öffnen, wobei DesiredAccess auf das flag GENERIC_READ festgelegt ist. Legen Sie dwShareMode auf das flag FILE_SHARE_READ fest, damit andere personen die Datei lesen können, während Sie sie geöffnet haben, das FILE_SHARE_DELETE Flag, damit andere personen die Datei zum Löschen markieren können, während Sie sie geöffnet haben, oder beides. Das an diesem Punkt abgerufene Handle wird als Lesehandle bezeichnet.
Verwenden Sie das Lesehandle, um aus dem Inhalt der Datei zu lesen oder in diese zu schreiben.
Beim Öffnen einer Datei, die bereits über eine opportunistische Filtersperre verfügt, unterbricht der Server die Sperre und überprüft dann den Freigabestatus der Datei. Diese Überprüfung gibt dem Client, der die frühere opportunistische Sperre ausgeführt hat, die Möglichkeit, zwischengespeicherte Daten aufzugeben und den Bruch zu bestätigen. Ein geöffneter Vorgang, der während dieser Freigabeüberprüfung versucht wird, führt nicht dazu, dass die Freigabeüberprüfung fehlschlägt, wenn der ehemalige Sperrinhaber die Sperre freigibt. Das Dateisystem hält den Öffnen-Vorgang so lange bereit, bis der Besitzer der Sperre sowohl das Lesehandle als auch das Sperrhandle schließt. Danach kann die offene Anforderung des anderen Clients fortgesetzt werden.
Weitere Informationen zum Brechen opportunistischer Sperren finden Sie unter Breaking Opportunistic Locks( Breaking Opportunistic Locks).