3

Corbaサーバー側のマルチスレッド化についてはたくさんありますが、私はクライアント側に興味があります. ORB を初期化する Corba シングルトン「マネージャー」を備えたマルチスレッド クライアント (Solaris、Orbix 6.3) があります。実行時、'lsof' は Corba サーバーへの TCP 接続を 1 つだけ表示するため、クライアント ワーカー スレッドから行われるすべての同期呼び出しをシリアル化する必要があります。

並列処理を利用するためにこの配置を変更したいと思います: 各スレッドは独自の接続を管理します。シングルトンの代わりに各ワーカー スレッドが ORB_init() などを呼び出すようにセットアップを変更しました。

今は完全に困惑しています: 'lsof' は現在 2 つの TCP 接続を示していますが、6 つのワーカー スレッドがあります。何かが正しくありません。ワーカー スレッドの数と同じ数の TCP 接続が必要でした。アプローチが単純である可能性があります-たとえば、スレッドごとに ORB_init() を呼び出すことは理にかなっていますか?

これについて誰かの意見が必要です。マルチスレッドクライアントのサンプル コードは非常に役立ちます。ここでも、Solaris で Orbix 6.3 を使用しています。

敬具、

エイドリアン

4

5 に答える 5

1

接続の管理は、プレーンCORBAに固有の実装です。各ベンダーには、独自の動作構成方法があります。RTCORBA仕様を確認すると、クライアントとサーバー間の接続の使用方法を構成するための標準化された方法があります。

Orbixがどのように機能し、RTCORBAをサポートしているかどうかはわかりません。これは、おそらく彼らのマニュアルから得られるものです。TAOがクライアント側でのスレッド化をサポートしていることは知っています。デフォルトでは、複数のスレッドが同じサーバーを呼び出すと、複数のtcpipトランスポートを同時に開くことができます。

于 2012-09-25T06:44:49.263 に答える
1

回答ありがとうございます。ジョニーが言うように、これは実際には実装固有のものであることがわかりました。

たとえば、 omniORBには maxGIOPConnectionPerServer - デフォルト 5 があります。これ は、ORB が単一のサーバーに対して開く同時接続の最大数です。クライアント上の複数のスレッドが同じサーバーを呼び出す場合、ORB は、このパラメーターで指定された最大数まで、サーバーへの追加の接続を開きます。最大数に達すると、接続が解放されて使用できるようになるまで、スレッドはブロックされます。

残念ながら、 Orbixに相当するもの (もしあれば) はまだわかりません。それは間違いなく1つの接続にデフォルト設定されています。まだグーグル...

ただし、Solaris から Linux への移行の一環として、Orbix からTAOに数か月で移行する予定であることがわかりました。TAO がよりフレンドリーでカスタマイズ可能になることを願っています。

于 2012-09-25T09:56:56.040 に答える
1

Orbix は内部で多くの最適化ルーチンを使用して、接続が効率的に使用されるようにします。具体的には、同じ TCP 接続を介して複数の同時 GIOP 要求を多重化できるため、同じサーバー エンドポイントへの複数の接続を開くことはありません。CORBA は、意図的に接続管理をクライアントおよびサーバーのプログラマーから隠しています。

これは構成で制御できるとは思いません。サポート チケットを Progress Support に送信して確認します。シングルトン モデルから離れて、クライアントごとに異なる ORB を初期化すれば (それぞれ固有の ID を持つ)、強制的に発生させることができるかもしれませんが、それは非常に面倒でコストのかかる問題の解決策になります。少しあいまいです。基礎となる ORB は、同時要求を最適化するように既にビルドされているため、解決しようとしている問題が何であるかはわかりません。

于 2012-10-05T15:15:00.913 に答える
0

私の正直な意見では、CORBA アプリケーション用のマルチスレッド クライアントと呼ばれる概念はないと思います。サーバー側にはonly one object、すべてのクライアントが利用できるネームサービスに登録されているものがあるからです。オブジェクトの を見るIORと、すべてのクライアントで同じです。そのため、そのオブジェクトへの接続は最大で 1 つしか確立できません。また、任意の数のクライアントに対して複数のリモート オブジェクトを取得することはできない (つまり、異なるクライアントからオブジェクトをどれだけルックアップしても、それらはすべて同じ参照を取得する) と考えるようになります。したがって、マルチスレッドをサポートするために、サーバーは実際には異なるスレッド ポリシーをサポートする必要があります。POA サーバーは異なるスレッド ポリシーを持つことができます。JAVA PROGRAMMING WITH CORBAを実行してください多くのための。

于 2012-09-25T05:22:57.303 に答える
0

Orbix が正確にどのように機能するかはわかりませんが、通常、ORB の初期化は、マルチスレッド セットアップの場合でも 1 回だけ行われます。マルチスレッド化された (サーバー側) ORB は、着信接続を処理するために、一定量のワーカー スレッドを (オンデマンドで、または必要に応じて、または構成されている場合は固定数で) 開始します。これらの接続はワーカーによって処理されます。このワーカーは、このリクエストを処理できるサーバントを検索します。通常、これ (サーバントへの実際の呼び出し) も追加のスレッドで実行されます。しかし、このスレッドは では表示されませんlsofps -eLfそのように使用するかtop -H、スレッドサポートを有効にしてみてください。

編集:

クライアント側では、呼び出すオブジェクトの数によって異なります。オブジェクトごとに、呼び出し元スレッドが可能です。リモートオブジェクトごとに複数の呼び出し元スレッドを持つこともできますが、それはクライアント側ロジックの異なるスレッドから呼び出された場合のみです。(複数のスレッドがあり、リモートオブジェクトがスレッド間で共有されていると想像してください)

于 2012-09-24T11:19:40.440 に答える