RPC 状態情報の内部仕組み
このセクションでは、RPC ランタイムによって収集される状態情報の内部構造について詳しく説明します。
RPC ランタイム状態情報はすべてセルに含まれています。 セルは、個別に表示および更新できる情報の最小単位です。
RPC Run-Time の各キー オブジェクトは、その状態に関する情報の 1 つ以上のセルを保持します。 各セルにはセル ID があります。 オブジェクトが別のオブジェクトを参照する場合、そのオブジェクトのセルIDを指定します。 RPC Run-Time が情報を保持できる主なオブジェクトは、エンドポイント、スレッド、接続オブジェクト、サーバー呼び出し (SCALL) オブジェクト、およびクライアント呼び出し (CCALL) オブジェクトです。
RPC サーバーが実行されている場合、RPC Run-Time は 1 つ以上のワーカー スレッドを使用して一連のエンドポイントをリッスンします。 データがサーバーに送信されるたびに、スレッドはデータを取得し、受信要求が何であるかを決定します。 接続を作成する要求の場合は、Connection オブジェクトが作成され、このオブジェクトは接続のすべての呼び出しをサービスします。 接続で RPC 呼び出しが行われると、Connection オブジェクトは、クライアント呼び出し (CCALL) オブジェクトに対応するサーバー呼び出し (SCALL) オブジェクトをインスタンス化します。 このサーバー呼び出しオブジェクトは、この特定の呼び出しを処理します。
RPC クライアントが実行されている場合、RPC Run-Time は、呼び出しが行われるたびにクライアント呼び出しオブジェクトを作成します。 このクライアント呼び出しオブジェクトには、この特定の呼び出しに関する情報が含まれています。
エンドポイント セル
RPC ランタイムの観点からは、エンドポイントは、特定のサーバーに接続できるエントリ ポイントです。 エンドポイントは常に特定の RPC トランスポートに関連付けられます。 エンドポイントの状態情報は、クライアント呼び出しをサーバー上の特定のプロセスに関連付けるために使用されます。
エンドポイント セル内のフィールドは次のとおりです。
ProtseqType
このエンドポイントのプロトコル シーケンス。
状態
状態の値: 割り当て済み、アクティブ、非アクティブ。 ほとんどのエンドポイントはアクティブです。 作成プロセスが開始されたがまだ完了していないとき、エンドポイント には の状態が割り当てられます。 エンドポイントが使用されなくなった場合 (プロトコルがアンインストールされた場合など) は、非アクティブな です。
EndpointName
エンドポイント名の最初の 28 文字。
スレッドセル
サーバー スレッドはワーカー スレッド (RPC で使用される標準の Win32 スレッド) です。
スレッド セルのフィールドは次のとおりです。
状態
状態の値: 処理中、ディスパッチ済み、割り当て済み、アイドル状態。 処理 スレッドは、Run-Time 内にあり、情報を処理するスレッドです。 ディスパッチされた スレッドは、サーバー提供のマネージャー ルーチン (通常は サーバー ルーチンと呼ばれます) に既にディスパッチ (呼び出されています)。 割り当てられた スレッドがキャッシュされました。 待機状態の スレッドがリクエストを処理するために利用可能です。
LastUpdateTime
情報が最後に更新された時刻 (起動後のミリ秒)。
TID
このスレッドのスレッド ID。 これは、デバッガーでスレッド リストと関連付けようとするときに便利です。
接続オブジェクトのセル
接続オブジェクト のセル内のフィールドは次のとおりです。
フラグ
フラグ値には、排他/、非排他、認証レベル、および 認証サービスが含まれます。
最終送信フラグメントサイズ
接続を介して送信された最後のフラグメントのサイズ。
エンドポイント
この接続が取得されたエンドポイントのセル ID。
LastSendTime
接続で最後にデータが送信された時刻。
LastReceiveTime
接続で最後にデータを受信した時刻。
サーバー呼び出しオブジェクトのセル
サーバー呼び出し (SCALL) オブジェクト セルのフィールドは次のとおりです。
状態
状態の値: 割り当て済み、アクティブ、ディスパッチ済み。 割り当てられた 呼び出しは非アクティブであり、キャッシュされます。 呼び出しがアクティブな
ProcNum
この呼び出しのプロシージャ番号 (netmon キャプチャ ファイル内の操作番号)。 RPC Run-Time は、IDL ファイル内の位置で番号を付けることで、インターフェイスから個々のルーチンを識別します。 インターフェイスの最初のルーチンは、数値 0、2 番目の数値 1 などになります。
InterfaceUUIDStart
インターフェイス UUID の最初の DWORD。
ServicingTID
この呼び出しを処理しているスレッドのセル ID。 呼び出しがアクティブでない、またはディスパッチされていない場合、古い情報が含まれています。
CallFlags
これらのフラグ値は、これが排他接続のキャッシュされた呼び出しであるか、非同期呼び出しであるか、パイプ呼び出しであるか、LRPC 呼び出しまたは OSF 呼び出しであるかを示します。
LastUpdateTime
呼び出しオブジェクトの状態情報が最後に更新された時刻 (起動後のミリ秒)。
PID
呼び出し元のプロセス ID。 LRPC 呼び出しでのみ有効です。
TID
呼び出し元のスレッド ID。 LRPC 呼び出しでのみ有効です。
クライアント呼び出しオブジェクト セル
クライアント呼び出し (CCALL) オブジェクトは、クライアント呼び出しに関する情報が大きすぎて 1 つのセルに収まらないため、2 つのセルに分割されます。 最初のセルはクライアント呼び出し情報
完全な状態情報を収集しない限り、クライアント呼び出しに関する情報は保持されません。 この規則には例外が 1 つあります。サーバー呼び出し内で行われたクライアント呼び出しに関する情報は、サーバーの状態情報のみが収集されている場合でも保持されます。 これにより、複数のホップにまたがる呼び出しをトレースできます。
[クライアント呼び出し情報] セルのフィールドは次のとおりです。
ProcNum
呼び出されるメソッドのプロシージャ番号 (netmon キャプチャ ファイル内の操作番号)。 RPC Run-Time は、IDL ファイル内の位置で番号を付けることで、インターフェイスから個々のルーチンを識別します。 インターフェイスの最初のルーチンは、数値 0、2 番目の数値 1 などになります。
サービシングスレッド
この呼び出しが行われるスレッドのセル ID。
IfStart
呼び出しが行われるインターフェイス UUID の最初の DWORD。
エンドポイント
呼び出しが行われたサーバー上のエンドポイントの最初の 12 文字。
[呼び出し先情報] セルのフィールドは次のとおりです。
ProtocolSequence
この呼び出しのプロトコル シーケンス。
LastUpdateTime
クライアント呼び出しまたは呼び出し先に関する情報が更新された時刻 (起動後のミリ秒)。
TargetServer
呼び出しが行われるサーバーの名前の最初の 24 文字。