9

パフォーマンスに関して、メッセージ パッシング同時実行方式とロックベースの同時実行方式の違いは何ですか? ロックを待機しているスレッドがブロックされるため、他のスレッドを実行できます。その結果、メッセージ パッシングがロックベースの同時実行よりも高速になる方法がわかりません。

編集: 具体的には、ロック (またはアトミック操作) を使用した共有データ アプローチと比較して、Erlang のようなメッセージ パッシング アプローチについて説明しています。

4

5 に答える 5

9

他の人が示唆しているように (「リンゴとオレンジ」)、私はこれら 2 つの手法は直交していると考えています。ここでの根底にある前提は、どちらか一方を選択するということのようです。つまり、ロックと共有リソースを使用するかメッセージ パッシングを使用し、一方が他方を不要にするか、またはおそらく他方が利用できなくなるということです。

たとえば、メタサーキュラー エバリュエーターのように、ここではどれが実際のプリミティブであるかは明らかではありません。たとえば、メッセージ パッシングを実装するには、おそらくアトミックCASと特定のメモリ可視性セマンティクス、または何らかのロックと共有状態が必要になるでしょう。ロックの観点からアトミック操作を実装することも、アトミック操作の観点からロックを実装することもできます (Java がそのjava.util.concurrent.locks型で行うように)。

同様に、確かに一筋縄ではいきませんが、メッセージ パッシングを使用してロックを実装することもできます。どちらのパフォーマンスが優れているかを尋ねることは、一般的にはあまり意味がありません。ほとんどの場合、下位レベルにあるものは、有能なプログラマーによって、上位に構築されたものよりもうまく運転できる可能性があります。これは、最近までのマニュアル トランスミッション車の場合と同様です (そこでもかなりの議論が行われています)。

通常、メッセージ パッシング アプローチは、パフォーマンスの向上ではなく、安全性と利便性のために称賛されており、通常、ロックおよび共有リソースのプログラマによる制御を拒否することで販売されています。その結果、プログラマーの能力に賭けます。プログラマーがロックを取得できない場合、ロックを取得できず、プログラムの速度が低下することはありません。手動のメモリ管理とガベージ コレクションに関する議論と同様に、手動制御を最大限に活用して「優れたドライバー」であると主張する人もいます。他の人、特にガベージ コレクターの使用を実装および促進する人は、全体として、コレクターは手動管理で「あまり良くないドライバー」よりも優れた仕事をすることができると主張します。

絶対的な答えはありません。ここでの違いは、プログラマーが使用するツールではなく、プログラマーのスキル レベルにあります。

于 2011-08-21T21:19:49.577 に答える
6

IMHO、メッセージパッシングはおそらく同時実行方式ではありません。これは基本的に、(IPC) プロセス間通信の形式であり、共有オブジェクトの代替です。Erlang は、共有オブジェクトへのメッセージの受け渡しを優先します。

共有オブジェクトの短所 (メッセージ パッシングの長所):

  • Mutable/Shared オブジェクトの状態は、複数のスレッドが同時に実行されるコンテキストでは判断が難しくなります。
  • wait free共有オブジェクトでの同期は、本質的に非または非のアルゴリズムにつながりlock freeます。
  • マルチプロセッサ システムでは、共有オブジェクトをプロセッサ キャッシュ間で複製できます。同期を必要としない比較およびスワップ ベースのアルゴリズムを使用しても、各プロセッサにキャッシュ コヒーレンス メッセージを送信するために多くのプロセッサ サイクルが費やされる可能性があります。
  • メッセージ パッシング セマンティクスで構築されたシステムは、本質的によりスケーラブルです。メッセージ パッシングは、メッセージが非同期で送信されることを意味するため、受信者がメッセージに対処するまで送信者をブロックする必要はありません。

共有オブジェクトの長所 (メッセージ パッシングの短所):

  • 一部のアルゴリズムは、はるかに単純になる傾向があります。
  • リソースのロックを必要とするメッセージ パッシング システムは、最終的に共有オブジェクト システムに退化します。これは、プログラマーが ets テーブルなどを使用して共有状態を保存し始めると、Erlang で明らかになることがあります。
  • アルゴリズムが待機なしの場合、新しいメッセージの形でのオブジェクトの割り当てがはるかに少なくなるため、パフォーマンスが向上し、メモリ フットプリントが削減されます。
于 2011-08-22T05:08:13.133 に答える
2

メッセージの受け渡し (不変メッセージを使用) は、正しく行うのが簡単です。ロックと共有の変更可能な状態では、並行性のバグを回避するのは非常に困難です。

パフォーマンスに関しては、自分で測定することをお勧めします。すべてのシステムは異なります - ワークロードの特性は何か、操作は他の操作の結果に依存しているか、完全にまたはほとんど独立しているか (大規模な並列処理が可能になります)、レイテンシーまたはスループットがより重要か、マシンの数など。より速いかもしれませんし、メッセージパッシングがより速いかもしれませんし、まったく違うものかもしれません。LMAXと同じアプローチが当面の問題に適合する場合、おそらくそれが当てはまる可能性があります。(私は LMAX アーキテクチャをメッセージ パッシングとして分類しますが、アクター ベースのメッセージ パッシングとは大きく異なります。)

于 2011-08-21T20:48:55.390 に答える
2

ロックしたいだけなのにメッセージパッシングを使うのは間違っています。そのような場合は、ロックを使用してください。ただし、メッセージ パッシングは、単にロックするだけではありません。その名前が示すように、メッセージ、つまりデータをスレッド間またはプロセス間で受け渡すことができます。

于 2011-08-21T19:38:11.237 に答える