次の方法で共有


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

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

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

Oplock の概要

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

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

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

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

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

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

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

便宜的ロック キー

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

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

次の条件がすべて満たされると、oplock が中断されます。

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

同じプロセスまたはスレッドが互換性のない操作を実行した場合でも、oplock は中断されます。 たとえば、次の場合、排他オプロックはすぐに中断されます。

  1. プロセスは、排他的な便宜的ロックが許可されているストリームを開きます。
  2. 同じプロセスによって、異なる (またはキーなしで) oplock キーを使用して、同じストリームが再び開かれます。

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

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