2009-06-26 33 views
2

システムリソースをロックするクラスを公開するEXE COMサーバーを作成しています。 通常の実行では、クライアントはリソースを解放します(COM実行可能シャットダウンは数秒後に実行されます)。 異常な実行では、クライアントアプリケーションがクラッシュしてインスタンスが正の参照カウントを持つままになります。EXE COMサーバーからのクライアントプロセスの終了を検出します。

ソケットIPCまたはドライバプロトコルのように、クライアントの終了を瞬時に検出する方法はありますか?もしそうでなければ、COMは他のIPCより劣っているように見えますか?メカニズム。

答えて

1

私はここ数年前に同じ質問がありました。私はここで答えを見つけました:How To Turn Off the COM Garbage Collection Mechanism。要するに:いいえ、クライアントの終了を瞬時に検出する方法はありませんy。抜粋:COMクライアントが正常終了

、 それはその サーバーオブジェクトへのすべての参照を解放します。ただし、クライアント が異常終了すると、 サーバーオブジェクトへの未解決の参照がある可能性があります。 ゴミなしで 収集メカニズムを使用すると、サーバコード は、 オブジェクトをリソース に割り当てられたリソースを再利用するタイミングを知ることができず、 リソースリークが発生する可能性があります。この 問題に対処するために、COMは、クライアント プロセスのために、クライアントマシンのpingサーバー マシン にCOMリゾルバプロセス(RPCSS)を する自動 ガベージコレクションメカニズムを実装しています。

(例えば、周期的 アプリケーションレベル「ピング」を使用してCOMのGC プロトコルを使用する代替 - 方法 クライアントがまだ生きていることをオブジェクトに通知コール、またはそのような として 基礎となるトランスポート機構を使用してTCPキープアライブ)は明らかに多くは 効率が低いです。したがって、DCOMの デフォルトGCメカニズムは、それらのオブジェクト が効果的にサーバー上の メモリリークになる場合は誤動作そうでない顧客が消えたときに をシャットダウンする必要があります任意のオブジェクトのための または を使用する必要があります。

サーバマシン上のリゾルバ は、サーバの各 のpingを追跡します。 ping期間は2 分で、現在は の設定不可です。 サーバマシン上のリゾルバがオブジェクト が6分間pingされていないことを検出すると、 はオブジェクト のすべてのクライアントが終了したことを前提にしています。レゾルバ は、そのオブジェクトへのすべての外部参照 を解放します。これは、オブジェクトのスタブ マネージャ(各オブジェクトに呼び出しを提供するCOMランタイムコード )をオブジェクトのIUnknown インターフェイスで :: Release()と呼び出すだけで、この を実行します。この時点では、オブジェクトの 参照カウントは0になり、COM実行時には になります。( はまだローカル (同じマンション)クライアントが保持している参照がある可能性があり、そう オブジェクトの内部参照カウントが 必ずしもこの 時点でゼロにならない場合があります。)オブジェクトは、その後 自体をシャットダウンすることがあります。

注:ガベージコレクションは、 すべてのサーバーに適用されます。 クライアントがローカルかリモートかに関係なく、 はローカルとリモートの組み合わせです。 の基になるpingメカニズムは、 ネットワークパケットが生成されないため、ローカルケースでは異なる ですが、すべて の場合、動作は と同じです。

関連する問題