10

現在、Java アプリと C++ アプリの間で IPC に共有メモリを使用していますが、より便利な代替手段を探しています。

誰かが同じパフォーマンスと速度でより良い方法をアドバイスできますか?

ありがとう!

4

5 に答える 5

7

これは、アプリがどのようにやり取りする予定かによって異なります。POSIX 環境には、パイプ、共有メモリ、ソケット、セマフォ、およびメッセージ キューがあります。この質問を参照してください: 詳細については、unix linux IPCの比較。

プロセスの相互作用モデルは何ですか (つまり、クライアント/サーバー、生産者と消費者など)?

個人的な経験から、最善の策はパイプ (バイトを読み書きするための単なるファイルであるため) またはソケット (両方の言語がサポートしているため) であることをお勧めします。

于 2009-05-24T19:54:30.947 に答える
4

マイクロングが言ったように、これはあなたが何をしているかに大きく依存します。私の知る限り、ネイティブ Java バインディングを備えた IPC メソッドはないため、おそらく JNI を使用して自分でバインディングを作成する必要があるため、さまざまなメソッドはすべてほぼ同じように困難です。ただし、メッセージ パッシングを行っている場合は、メッセージ キューを使用することを強くお勧めします。それらは非常に使いやすく (バインディングがあれば)、優れたパフォーマンスを発揮します。リソースを「共有」する必要がある場合は、おそらく共有メモリを使用することをお勧めします。

ある種のクライアント/サーバーを使用しているように聞こえるので、メッセージ キュー、UNIX ドメイン ソケット、または名前付きパイプのいずれかを使用することをお勧めします。いずれもカーネル内でデータをコピーする必要があるため、共有メモリほど高速ではありませんが、それでも非常に高速です。メッセージのようなデータ (個々の小さなパケット) がある場合は、メッセージ キューを使用します。それはおそらく最もクリーンなソリューションです。それ以上のデータ ストリームがある場合は、パイプまたはソケットを使用します。ソケットには、後で必要に応じて (X11 のように) 簡単にネットワーク トランスペアレントにすることができるという利点がありますが、パイプよりも操作が少し難しくなります。パフォーマンスはおそらく非常に似ています。

于 2009-05-24T19:59:57.970 に答える
0

異なる言語で書かれたアプリケーション間で通信する最も簡単な方法は、IMHO CORBAです。非常に優れたオープン ソースのCORBA ORBがあります。C++ にはTAOを、Java にはJacORBを使用します。また、技術サポートを提供するOCIRemedyなどの企業もあります。

于 2009-05-26T20:35:49.650 に答える
0

最も効率的ではない可能性がありますが、Java はすぐに使用できるソケットのみをサポートします (私が覚えている最高のもの)。それらは非常に柔軟ですが、おそらく他のオプションほど高速ではありません. Zifre が述べたように、ネットワークの透過性と、言語/バインディングの透過性の機会が得られます。最近では、ほとんどすべての言語がそのままソケット ライブラリをサポートしているためです。

私は効率性を窓の外に放り出していますが、効率を次のレベルに引き上げたい場合は、おそらくこれを何らかの Web サービスでラップすることができます。プロデューサーがデータを送信するために、コンシューマーで組み込み Web サーバーを使用します。

于 2009-05-25T08:25:48.110 に答える
-6

現在、JavaアプリとC ++アプリの間でIPCに共有メモリを使用していますが、より便利な代替手段を探しています。

誰かがより良い方法をアドバイスできますが、同じパフォーマンス速度でしょうか?

単純な共有メモリの場合、特別なライブラリも必要ありません。

class Main {
    private static class CustomThread extends Thread {
        public int x = 0;
        public void run() {
            x = 5;
        }
    }

    public static void main(String[] args) {

        CustomThread t = new CustomThread();
        t.start();

        System.out.println(t.x);
        System.out.println(t.x);
    }
}

ローカル変数xは、スレッドの外部と内部でアクセスできるため、スレッドの内外で情報を渡すために使用できます。

于 2012-04-09T22:48:40.950 に答える