ソケットと共有メモリを介して行われるプロセス間通信の長所と短所は何ですか?


9

プロセス間通信の多くのオプションのうち2つは次のようになる可能性があることを理解しています。

  1. 共有メモリ
  2. ソケット

実際、Javaアプリケーションをデバッグするために、Intellij Ideaがこれら2つのオプションを公開しているのを見ました。それぞれのアプローチの長所と短所を知りたいのですが。


新しい方法はD-Busです。
ott-- 2013年

@ ott-- D-BusはUnixドメインソケット自体を使用しませんか?

@BrianMarshall確かに、ドメインとtcp / ipソケット。
ott-- 2013年

答えはここにもありますstackoverflow.com/a/1844919/632951
Pacerier

回答:


11

私の頭の上のそれぞれのいくつかの利点。これらの項目の一部はすべての場合に適用されるわけではないことに注意してください。これらは単なる一般的な観察です。

ソケット

シンプルで管理されています。変更をほとんどまたはまったく行わずに、必要に応じてネットワークソケットに拡張できます。プログラミングモデルではシリアル化が必要です。そのため、実際にAからBに転送されるデータについて考える必要があります。同期は、通信メカニズムに必ず組み込まれています。他の同期は必要ありません。

共有メモリ

必ずしもsyscallを必要としません(したがって、潜在的に高速です)。共有する場合、明示的にデータを転送する必要はありません。受信者が取得しないデータを利用できるようにすることができます(受信者が使用しないデータを転送するために帯域幅を無駄にする必要はありません)。シリアライゼーション/デシリアライゼーションのステップがないということは、通信オーバーヘッドに時間を費やさないことを意味します。


4
+1:ソケットは分散システムにスケールアップしますが、共有メモリははるかに高速です。
mouviciel 2013年

@tylerlなぜ共有メモリはsyscallを必要としないのですか?
Geek

@Geek:仮想メモリ管理が最新のOSでどのように実装されているかを読んでください。基本的に、内部で共有メモリは通常のプロセスメモリとほぼ同じように実装されます。たまたま、同じ物理ページが意図的に2(またはN)個の異なるプロセスにマッピングされています。ただし、そのマッピングが確立されると、* px = 5は、pxが通常の変数を指すか、共有メモリセグメント内を指すかに関係なく、同じ命令セットを生成します。
DXM 2013年

技術的には、送信先が送信する形式の生のバイトストリームを受け入れることができる場合、ソケットを介してデータをシリアル化する必要はありません。ほとんどの人は明らかにシリアル化するため、誰にでも送信できます。
gbjbaanb 2013年

1
@gbjbaanb 技術的には、エンコーディング構造が何であっても、ビットの連続した文字列として送信される場合、データをシリアル化していると思います。
tylerl 2013年

6

ソケットは1対1です。同じものを複数のプロセスに送信する場合は、複数のソケットが必要です。共有メモリを使用すると、複数のリーダーと複数のライターを持つことができます。

ソケットはリソースを大量に消費します。すべてのメッセージがOSを通過します。共有メモリでは、共有メモリをマップしますが、一度アプリケーションのメモリにマップし、それ以降はそれを使用します。ただし、共有メモリを使用した場合は、OSを経由する必要があります。下記参照。

ソケットは同期されます(UDPを使用しない限り)。共有メモリを使用する場合、共有メモリの読み取りまたは書き込みが可能かどうかを他のプロセスに通知するために、必然的に追加のメカニズムが必要になります。これを行わないでください。破損したメモリで問題が発生します。例:プロセスAがチャンク共有メモリの読み取りを開始したが、読み取りの途中でスワップアウトされたとします。プロセスBは、共有メモリの同じチャンクに書き込みます。プロセスAが再起動して共有メモリの読み取りを続行すると、プロセスAが読み取ったのは、古いデータと新しいデータの寄せ集めです。これを防ぐために、共有メモリを使用しているときもOSを通過します。

ソケットベースのアプリケーションのセットを、ネットワークソケットを使用するアプリケーションに変換するのはかなり簡単です。ラボ内のすべてのマシン、またはさらに遠くまで処理を広げることができます。共有メモリではこれを行うことはできません。共有メモリベースのソリューションを備えた1台のマシンにロックされています。

ソケットは、少量のデータ、大量のデータ用の共有メモリを対象としています。さまざまな問題を解決するために、さまざまなメカニズムが存在します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.