接続とファイル構造管理
接続とファイルの構造を管理するために RDBSS によって使われる 6 つの基本的なデータ構造体があります。 これらのデータ構造体は、RDBSS とさまざまなネットワーク ミニ リダイレクターによって内部的に使われます。 これらのデータ構造体には 2 つのバージョンがあります。 ネットワーク ミニ リダイレクター バージョンには、ネットワーク ミニ リダイレクター ドライバーによって操作できるフィールドが含まれます。 これらのデータ構造体のネットワーク ミニ リダイレクター バージョンは、MRX_ プレフィックスで始まります。 RDBSS バージョンには、RDBSS によってのみ操作できる追加のフィールドが含まれます。
これら 6 つの基本的なデータ構造体は次のとおりです。
SRV_CALL -- サーバー呼び出しコンテキスト。 この構造体は、リモート サーバーの抽象化を提供します。
NET_ROOT -- ネット ルート。 この構造体は、共有への接続を抽象化します。
V_NET_ROOT -- ネット ルートのビュー (仮想ネットルートとも呼ばれます)。
FCB -- ファイル制御ブロック。 この構造体は、共有で開かれているファイルを表します。
SRV_OPEN -- サーバー側のオープン コンテキスト。 この構造体は、サーバーで開かれているハンドルをカプセル化します。
FOBX -- ファイル オブジェクト拡張機能。 この構造体は、FILE_OBJECT 構造体に対する RDBSS の拡張機能です。
これらのデータ構造体は、次の階層に編成されています。
SRV_CALL
FCB <------> NET_ROOT
SRV_OPEN <---> V_NET_ROOT
FOBX
FILE_OBJECT
カーネル ファイル システムの呼び出しへの応答で、RDBSS は通常、FOBX 構造体を除く前に説明したすべての構造体を作成し、ネットワーク ミニ リダイレクター ドライバー用に最終処理します。 そのため、ネットワーク ミニ リダイレクター ドライバーは、通常、接続とファイルの構造体の管理に使われ RDBSS ルーチンの一部のみを呼び出します。 これらのルーチンのほとんどは、RDBSS によって内部的に呼び出されます。
これらのデータ構造体はすべて参照をカウントされます。 データ構造体の参照カウントは次のとおりです。
データ構造 | 参照カウントの説明 |
---|---|
SRV_CALL |
SRV_CALL を指している NET_ROOT エントリの数に加えて、動的な値。 |
NET_ROOT |
NET_ROOT を指している FCB エントリと V_NET_ROOT エントリの数に加えて、動的な値。 |
V_NET_ROOT |
V_NET_ROOT を指している SRV_OPEN エントリの数に加えて、動的な値。 |
FCB |
FCB を指している SRV_OPEN エントリの数に加えて、動的な値。 |
SRV_OPEN |
SRV_OPEN を指している FOBX エントリの数に加えて、動的な値。 |
FOBX |
動的な値。 |
いずれの場合も、動的な値とは、逆参照せずに構造体を参照している呼び出し元の数のことです。 参照カウントの静的な部分は、ルーチン自体によって維持されます。 たとえば、RxCreateNetRoot は、関連付けられている SRV_CALL 構造体に対する参照カウントをインクリメントします。
参照呼び出しと成功した検索では、参照カウントがインクリメントされます。逆参照呼び出しではカウントがデクリメントされます。 作成ルーチンが呼び出されると、構造体が割り当てられて、参照カウントが 1 に設定されます。
データ構造体に関連付けられている参照カウントは、少なくとも、1 に、それに関連付けられている次の下位レベルのデータ構造体のインスタンス数を加えたものです。 たとえば、2 つの NET_ROOT が関連付けられている SRV_CALL に関連付けられている参照カウントは、少なくとも 3 です。 RDBSS 内部の NameTable 構造体と、次の下位レベルのデータ構造体によって保持される参照に加えて、取得された可能性のある追加の参照があります。
これらの制限により、次の下位レベルのすべてのデータ構造体が最終処理されるか、その参照を解放すまで、特定のレベルのデータ構造体を最終処理 (その解放、および関連するメモリ ブロックの解放) できないことが保証されます。 たとえば、FCB への参照が保持されている場合、それに関連付けられている V_NET_ROOT、NET_ROOT、SRV_CALL 構造体に安全にアクセスできます。
ネットワーク ミニ リダイレクターと RDBSS の間のインターフェイスで使われる 2 つの重要な抽象化は、SRV_CALL 構造体と NET_ROOT 構造体です。 SRV_CALL 構造体は接続が確立されたサーバーに関連付けられているコンテキストに対応し、NET_ROOT 構造体はサーバー上の共有に対応します (これは、ネットワーク ミニ リダイレクターによって要求された名前空間の一部と見ることもできます)。
通常、SRV_CALL および NET_ROOT 構造体の作成には、少なくとも 1 回のネットワーク ラウンドトリップが必要です。 非同期操作を続けられるようにするため、これらの操作は 2 フェーズのアクティビティとしてモデル化されています。 SRV_CALL と NET_ROOT 構造体を作成するためのネットワーク ミニ リダイレクターへの下方への各呼び出しには、要求の完了状態を通知するための、ネットワーク ミニ リダイレクターから RDBSS への上方への呼び出しが伴います。 現在、これらは同期的です。
SRV_CALL 構造体の作成は、RDBSS は多数のネットワーク ミニ リダイレクターから選択してサーバーとの接続を確立する必要があるという事実によって、さらに複雑になります。 RDBSS が展開するネットワーク ミニ リダイレクターを選択するときの柔軟性を最大限にするため、SRV_CALL 構造体の作成には、RDBSS がネットワーク ミニ リダイレクターに選ばれたことを通知する 3 番目のフェーズが含まれます。 選ばれなかったすべてのネットワーク ミニ リダイレクターは、関連するコンテキストを破棄します。
このセクションでは、以下のトピックについて説明します: