現在、Java アプリと C++ アプリの間で IPC に共有メモリを使用していますが、より便利な代替手段を探しています。
誰かが同じパフォーマンスと速度でより良い方法をアドバイスできますか?
ありがとう!
現在、Java アプリと C++ アプリの間で IPC に共有メモリを使用していますが、より便利な代替手段を探しています。
誰かが同じパフォーマンスと速度でより良い方法をアドバイスできますか?
ありがとう!
これは、アプリがどのようにやり取りする予定かによって異なります。POSIX 環境には、パイプ、共有メモリ、ソケット、セマフォ、およびメッセージ キューがあります。この質問を参照してください: 詳細については、unix linux IPCの比較。
プロセスの相互作用モデルは何ですか (つまり、クライアント/サーバー、生産者と消費者など)?
個人的な経験から、最善の策はパイプ (バイトを読み書きするための単なるファイルであるため) またはソケット (両方の言語がサポートしているため) であることをお勧めします。
マイクロングが言ったように、これはあなたが何をしているかに大きく依存します。私の知る限り、ネイティブ Java バインディングを備えた IPC メソッドはないため、おそらく JNI を使用して自分でバインディングを作成する必要があるため、さまざまなメソッドはすべてほぼ同じように困難です。ただし、メッセージ パッシングを行っている場合は、メッセージ キューを使用することを強くお勧めします。それらは非常に使いやすく (バインディングがあれば)、優れたパフォーマンスを発揮します。リソースを「共有」する必要がある場合は、おそらく共有メモリを使用することをお勧めします。
ある種のクライアント/サーバーを使用しているように聞こえるので、メッセージ キュー、UNIX ドメイン ソケット、または名前付きパイプのいずれかを使用することをお勧めします。いずれもカーネル内でデータをコピーする必要があるため、共有メモリほど高速ではありませんが、それでも非常に高速です。メッセージのようなデータ (個々の小さなパケット) がある場合は、メッセージ キューを使用します。それはおそらく最もクリーンなソリューションです。それ以上のデータ ストリームがある場合は、パイプまたはソケットを使用します。ソケットには、後で必要に応じて (X11 のように) 簡単にネットワーク トランスペアレントにすることができるという利点がありますが、パイプよりも操作が少し難しくなります。パフォーマンスはおそらく非常に似ています。
最も効率的ではない可能性がありますが、Java はすぐに使用できるソケットのみをサポートします (私が覚えている最高のもの)。それらは非常に柔軟ですが、おそらく他のオプションほど高速ではありません. Zifre が述べたように、ネットワークの透過性と、言語/バインディングの透過性の機会が得られます。最近では、ほとんどすべての言語がそのままソケット ライブラリをサポートしているためです。
私は効率性を窓の外に放り出していますが、効率を次のレベルに引き上げたい場合は、おそらくこれを何らかの Web サービスでラップすることができます。プロデューサーがデータを送信するために、コンシューマーで組み込み Web サーバーを使用します。
現在、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は、スレッドの外部と内部でアクセスできるため、スレッドの内外で情報を渡すために使用できます。