2

この質問は、ここで尋ねられた質問のトピックと重複しています。

別の観点から、追加の説明を求めたいと思います。

分散コンピューティングでは、最終的にメモリの一貫性は、分散ロックなどを使用して、ネットワーク チャネルを介したメッセージ パッシングを使用して実装されます。メッセージ パッシング (IIUC) は、非常に低いレベルを除いて、常に並行性をなくすとは限りません。これは、通常、プロセスがお互いの状態に影響を与えるためです。そして、彼らは一貫した方法であると信じている方法でそうしています。

たとえば、単純なコマンド インタープリターをメッセージ パッシングの上に実装することができます。コマンドは、複数の熟知したプロセスから並行して実行される複数のリモート トランザクションの一部として送信できます。そのため、高レベルの対話では、ほとんどの場合、同時実行の設計が必要になります。つまり、IMO では、プロセスに長期操作のトランザクション セマンティクスがない可能性はほとんどありません。

さらに、値が一貫した状態でメッセージを送信しても、正確性は保証されません。この値がどのように生成されるか、入力データを提供したメッセージと変換された結果を発行するメッセージの間で何が起こるかが重要です。

一方、物理メモリとの低レベルの相互作用は常に、基本的にはバスを介して渡されるある種のメッセージです。したがって、最も低いレベルでは、共有メモリとメッセージ パッシングは同じです。

また、命令ごとのレベルでは、アラインされたロードとストアの原子性が通常保証されます。そのため、その区別はまだぼやけています。

散文的に言えば、共有メモリとメッセージパッシングの選択は、同時実行性とどのように関連していますか? 同時実行性を解決するための技術パターンと、並列プロセスの相互作用を定義および分析するための数学的モデルの選択の問題ですか、それとも、これらの手法を体系的に適用すると、システムの同時実行性の問題に根本的に影響を与えるアーキテクチャ パターンでもありますか?

ありがとう。

編集(いくつかの追加コメント)

どうやら、2 つの方法は正確さとパフォーマンスによって区別されます。しかし、この区別には次の問題があります。

私は、メッセージが大きく散らばった仮想データの転送のように振る舞うことができることを知っています。ただし、「値による」アプローチは、非ユニタリ (または手続き的に生成された) 論理データのアトミック読み取りを超えた同期なしでは一貫性を保証しません。一貫性によって、因果関係や変更の順序付けなどを暗示しています。実際、メッセージ パッシングでは、すべてのプロセスが独自のメモリを変更するだけです。プロセスは、そのプライベート メモリに対するコントローラーのように機能します。これは、データを所有するプロセスによってシリアル化されたメッセージ パッシングに加えて共有するようなものですが、メッセージごとに (メモリが単語ごとまたはキャッシュ ラインごとにシリアル化するのと同様に)基本)。メッセージの送信に関連するトランザクションの同期を保証するのは、アプリケーション プログラマの責任です。すなわち、複数の熟知したプロセスから 1 つのプロセスへのメッセージは、それらのプロセスが実行している操作のセマンティクスに対応する一貫した順序で送信する必要があります。所有しているプロセスへの制御メッセージを使用するか、競合者間の直接の調整を通じて行うことができますが、メッセージの同時実行性に対する何らかの制限が必要になる可能性が最も高くなります。

メモリーの共有は、ローカルのプロセス間通信 (競合を無視) では確かに高速ですが、マシン間の通信ではなぜこれが当てはまるのでしょうか? 分散コンピューティングの共有メモリは、ネットワーク通信の上に実装されます。したがって、共有メモリは、キャッシングの利点は別として、高速化することはできません。

明らかにテクニックが違います。私が理解できないように見えるのは、どちらにも本質的に有益なものがない場合に、それらが互いにどのように広く比較されるかということです. プラットフォームが何を提供し、ソフトウェアが何を達成しようとしているのかを想定する必要がありますが、そのような想定は普遍的に正しいとは言えません。

4

1 に答える 1

4

分散アプリケーションやマルチスレッド アプリケーションを設計している場合は、シングル プロセスのシングル スレッド アプリケーションよりも確実にパフォーマンスが向上するようにする必要があります。

分散アプリケーション、つまり潜在的に複数のシステム上に複数のプロセスがある場合、通信ノード間の遅延が最大の懸念事項です。マイクロサーバーの出現により、遅延と消費電力が大幅に低下し、ソフトウェア開発者がマルチコア/マイクロサーバー アプリケーションの設計、開発、デバッグ、デプロイなどの方法を検討し始めるに値します。

マルチプロセス アプリケーションを開発する場合、プロセス間通信を実装するために最下層で 2 セットの OS 呼び出しを使用することになります。たとえば、shmget、shmat、shmctl などを使用した共有メモリと、たとえば、メッセージ パッシングです。 socket、accept、send、recv などを使用して

共有メモリを使用すると、レイテンシは無視できます。共有メモリ バッファへの参照が取得されると、アプリケーションは共有メモリの任意の部分に移動して変更できます。もちろん、プロセスはロックやミューテックスなどを使用して連携し、データ構造の整合性が維持され、アプリケーションが正しく動作するようにする必要があります。このソリューションの問題は、コンテキスト スイッチがいつ発生するかを制御できない場合に、整合性が維持されるすべての状況をどのようにテストするかということです。

メッセージ パッシングでは、データは共有されません。すべての通信は、バッファの交換によって行われます。これにより、ロックやミューテックスなどを考慮する必要がなくなりますが、アプリケーションがネットワーク タイムアウト、帯域幅、遅延などの問題を確実に処理できるようにする必要があります。

単一のシステムを超えてスケ​​ーリングできるアプリを開発するための最も一般的な方法は、メッセージ パッシングを使用することです。通信中のプロセスがたまたま同じホスト上にある場合でも、動作します。

共有メモリであるかメッセージ パッシングであるかに関係なく、最終的な同時実行性とは、共有メモリの場合はロック/ミューテックスを使用してデータ構造の整合性を確保し、メッセージ パッシングの場合は要求/応答をシリアル化することです。

于 2012-12-10T02:21:45.133 に答える