Oplock とネットワーク リダイレクター

ネットワーク リダイレクタは、便宜的ロック (oplocks) を使用して、ファイル アクセスのパフォーマンスを最適化し、クライアント サーバー環境でのネットワーク トラフィックを削減します。

このドキュメントは、ネットワーク リダイレクター開発者を対象としていますが、一部の情報はクライアント アプリケーション開発者に適用されます。 クライアント アプリケーションに関連するその他の便宜的ロックに関するドキュメントについては、Windows SDK の「便宜的ロック」に関する記事を参照してください。

Oplock の概要

便宜的ロック (opportunistic lock) は、サーバー上に存在するファイル上のクライアントによって配置されるロックです。 ほとんどの場合、クライアントは、データをローカルにキャッシュできるように 便宜的ロックを要求します。 便宜的ロックは、リモート サーバーを使用するクライアントのネットワーク リダイレクターと、ローカル サーバー上のクライアント アプリケーションによって使用されます。 現在および従来のさまざまな便宜的ロックの説明については「便宜的ロックの種類」を参照してください。

便宜的ロックを使用すると、ファイル サーバー クライアント (SMB および SMB2 プロトコルを使用するクライアントなど) は、特定のファイルまたはストリームのバッファリング戦略を一貫した方法で動的に変更できます。 便宜的ロックを使用すると、パフォーマンスが向上し、ネットワークの使用が減ります。 リモート ファイル操作のネットワーク パフォーマンスを向上させるために、クライアントはファイル データをローカルにバッファー処理できるため、ネットワーク パケットの送受信の必要性が軽減または排除されます。 次に例を示します。

  • 他のプロセスがデータにアクセスしていないとクライアントが認識している場合、クライアントはリモート サーバー上のファイルに情報を書き込む必要がない可能性があります。
  • 他のプロセスがリモート ファイルにデータを書き込まないとクライアントが認識している場合、クライアントはリモート ファイルから先読みデータをバッファーできます。

アプリケーションとドライバーでは、これらのファイルを使用する必要がある他のアプリケーションに影響を与えることなく、便宜的ロックを使用して透過的にファイルにアクセスすることもできます。

NTFS などのファイル システムでは、ファイルごとに複数のデータ ストリームがサポートされます。 システムはストリーム ハンドルに便宜的ロックを付与します。つまり、ファイル ストリームの特定のオープンに対して便宜的ロックが付与され、そのストリームに操作が適用されます。 例外はほとんどありませんが、1 つのストリームに対する操作は、別のストリームの便宜的ロックには影響しません。 詳細については「便宜的ロックの要求と許可」を参照してください。

FAT などの代替データ ストリームをサポートしていないファイル システムの場合、便宜的ロックディスカッションが "ストリーム" を参照する場合は "ファイル" と考えてください。

便宜的ロックパッケージのコア便宜的ロック機能は、主に FsRtlInitializeOplock などの FsRtlXxx ルーチンを使用してカーネルに実装されます。 ファイル システムはこのパッケージを呼び出して、ファイル システムに便宜的ロック機能を実装します。 このセクションの便宜的ロックの記事では、NTFS ファイル システムがカーネル便宜的ロックパッケージと相互運用する方法について説明します。 他のファイル システムも同様の方法で機能しますが、小さな違いがある可能性があります。

便宜的ロック キー

ストリーム ハンドルを便宜的ロック キーに関連付けることができます。これは、同じクライアント キャッシュ ビューに属する複数のハンドルを識別する GUID 値です。 便宜的ロック キーは、ストリーム ハンドルが参照する FILE_OBJECT 構造体に関連付けられていると言う方が正確です。 この区別は、DuplicateHandle など 、ハンドルが重複する場合に重要です。 重複する各ハンドルは、基になる同じ FILE_OBJECT 構造体を参照します。

ストリーム ハンドルの作成時に、便宜的ロック キーを明示的に (IoCreateFileEx に) 指定できます。 ハンドルの作成時に便宜的キーが明示的に指定されていない場合、システムはハンドルを一意の便宜的キーが関連付けられているものとして扱います。 この一意キーは、他のハンドル上の他のキーとは異なります。

次の場合、便宜的ロックが解除されます。

  • ファイル操作は、便宜的ロックが許可されたハンドル以外のハンドルで受信されます、AND
  • 便宜的ロックのハンドルに関連付けられている便宜的ロック キーは、操作のハンドルに関連付けられているキーと異なります、AND
  • この操作は、現在付与されている便宜的ロックと互換性がありません。

便宜的ロックは、互換性のない操作を実行しているのと同じプロセスまたはスレッドであっても中断します。 たとえば、次の場合、排他的な便宜的ロックは直ちに解除されます。

  1. プロセスは、排他的な便宜的ロックが許可されているストリームを開きます。
  2. その同じプロセスで、別の (または「いいえ」) 便宜的ロック キーを使用して同じストリームを再度開きます。

詳細については「便宜的ロックの解除」について参照してください。

便宜的ロック キーはハンドルに存在し、ハンドルの作成時にハンドルに "置かれる" ことに注意してください。 便宜的ロックが許可されていない場合でも、ハンドルを便宜的ロック キーに関連付けることができます。