パフォーマンスに関して、メッセージ パッシング同時実行方式とロックベースの同時実行方式の違いは何ですか? ロックを待機しているスレッドがブロックされるため、他のスレッドを実行できます。その結果、メッセージ パッシングがロックベースの同時実行よりも高速になる方法がわかりません。
編集: 具体的には、ロック (またはアトミック操作) を使用した共有データ アプローチと比較して、Erlang のようなメッセージ パッシング アプローチについて説明しています。
パフォーマンスに関して、メッセージ パッシング同時実行方式とロックベースの同時実行方式の違いは何ですか? ロックを待機しているスレッドがブロックされるため、他のスレッドを実行できます。その結果、メッセージ パッシングがロックベースの同時実行よりも高速になる方法がわかりません。
編集: 具体的には、ロック (またはアトミック操作) を使用した共有データ アプローチと比較して、Erlang のようなメッセージ パッシング アプローチについて説明しています。
他の人が示唆しているように (「リンゴとオレンジ」)、私はこれら 2 つの手法は直交していると考えています。ここでの根底にある前提は、どちらか一方を選択するということのようです。つまり、ロックと共有リソースを使用するか、メッセージ パッシングを使用し、一方が他方を不要にするか、またはおそらく他方が利用できなくなるということです。
たとえば、メタサーキュラー エバリュエーターのように、ここではどれが実際のプリミティブであるかは明らかではありません。たとえば、メッセージ パッシングを実装するには、おそらくアトミックCASと特定のメモリ可視性セマンティクス、または何らかのロックと共有状態が必要になるでしょう。ロックの観点からアトミック操作を実装することも、アトミック操作の観点からロックを実装することもできます (Java がそのjava.util.concurrent.locks
型で行うように)。
同様に、確かに一筋縄ではいきませんが、メッセージ パッシングを使用してロックを実装することもできます。どちらのパフォーマンスが優れているかを尋ねることは、一般的にはあまり意味がありません。ほとんどの場合、下位レベルにあるものは、有能なプログラマーによって、上位に構築されたものよりもうまく運転できる可能性があります。これは、最近までのマニュアル トランスミッション車の場合と同様です (そこでもかなりの議論が行われています)。
通常、メッセージ パッシング アプローチは、パフォーマンスの向上ではなく、安全性と利便性のために称賛されており、通常、ロックおよび共有リソースのプログラマによる制御を拒否することで販売されています。その結果、プログラマーの能力に賭けます。プログラマーがロックを取得できない場合、ロックを取得できず、プログラムの速度が低下することはありません。手動のメモリ管理とガベージ コレクションに関する議論と同様に、手動制御を最大限に活用して「優れたドライバー」であると主張する人もいます。他の人、特にガベージ コレクターの使用を実装および促進する人は、全体として、コレクターは手動管理で「あまり良くないドライバー」よりも優れた仕事をすることができると主張します。
絶対的な答えはありません。ここでの違いは、プログラマーが使用するツールではなく、プログラマーのスキル レベルにあります。
IMHO、メッセージパッシングはおそらく同時実行方式ではありません。これは基本的に、(IPC) プロセス間通信の形式であり、共有オブジェクトの代替です。Erlang は、共有オブジェクトへのメッセージの受け渡しを優先します。
共有オブジェクトの短所 (メッセージ パッシングの長所):
wait free
共有オブジェクトでの同期は、本質的に非または非のアルゴリズムにつながりlock free
ます。共有オブジェクトの長所 (メッセージ パッシングの短所):
メッセージの受け渡し (不変メッセージを使用) は、正しく行うのが簡単です。ロックと共有の変更可能な状態では、並行性のバグを回避するのは非常に困難です。
パフォーマンスに関しては、自分で測定することをお勧めします。すべてのシステムは異なります - ワークロードの特性は何か、操作は他の操作の結果に依存しているか、完全にまたはほとんど独立しているか (大規模な並列処理が可能になります)、レイテンシーまたはスループットがより重要か、マシンの数など。より速いかもしれませんし、メッセージパッシングがより速いかもしれませんし、まったく違うものかもしれません。LMAXと同じアプローチが当面の問題に適合する場合、おそらくそれが当てはまる可能性があります。(私は LMAX アーキテクチャをメッセージ パッシングとして分類しますが、アクター ベースのメッセージ パッシングとは大きく異なります。)
ロックしたいだけなのにメッセージパッシングを使うのは間違っています。そのような場合は、ロックを使用してください。ただし、メッセージ パッシングは、単にロックするだけではありません。その名前が示すように、メッセージ、つまりデータをスレッド間またはプロセス間で受け渡すことができます。