共有メモリとメッセージパッシングは、大規模なデータ構造をどのように処理しますか? 質問する

共有メモリとメッセージパッシングは、大規模なデータ構造をどのように処理しますか? 質問する

Go と Erlang の並行性へのアプローチを見ると、どちらもメッセージ パッシングに依存していることに気付きました。

このアプローチでは、共有状態が存在しないため、複雑なロックの必要性が明らかに軽減されます。

ただし、サフィックス配列のようなメモリ内の単一の大きなデータ構造への並列読み取り専用アクセスを必要とするクライアントが多数いる場合を考えてみましょう。

私の質問:

  • データは読み取り専用であり、単一の場所にのみ存在する必要があるため、ロックはほとんど不要であり、共有状態を使用すると、メッセージの受け渡しよりも高速になり、メモリ使用量が少なくなりますか?

  • メッセージ パッシングのコンテキストでは、この問題にどのように対処するのでしょうか。データ構造にアクセスできるプロセスは 1 つだけで、クライアントはそこからデータを順番に要求するだけでよいのでしょうか。または、可能であれば、データをチャンク化して、チャンクを保持する複数のプロセスを作成するのでしょうか。

  • 現代の CPU とメモリのアーキテクチャを考えると、2 つのソリューションの間に大きな違いはありますか? つまり、共有メモリを複数のコアで並行して読み取ることができますか? つまり、両方の実装がほぼ同じパフォーマンスになるようなハードウェアのボトルネックがないということですか?

ベストアンサー1

一つ理解しておくべきことは、Erlangの並行性モデルはない実際にはメッセージ内のデータはプロセス間でコピーされなければならないと規定されているが、メッセージの送信が通信の唯一の方法であり、共有状態はないことを規定している。すべてのデータは不変であるため、基本的な場合、実装はデータをコピーせずに参照を送信するだけでよい。または、両方の方法を組み合わせて使用​​​​する場合もあります。いつものように、最高解決策は複数あり、その方法を選択する際にはトレードオフが必要になります。

BEAM は、参照を送信する大きなバイナリを除いて、コピーを使用します。

おすすめ記事