並行データ構造を設計する方法は?


8

以前にProgrammers.SEでこの質問をしましたが、成功しませんでした。

並行データ構造を設計する方法について書かれた学習リソースを探しています。最終的な製品(完全なコードリスト)よりも、設計プロセス(たとえば、適切な不変条件の特定)に関心があります。

具体的な例として、Chris Okasakiの著書「Purely Functional Data Structures」は本当に参考になりました。これは単なる参考資料ではなく、データ構造とアルゴリズムの設計について読者をガイドするためです。多くの場合、この本は、最初によりナイーブなバージョンを提供し、次に、必要な時間の複雑さ(最悪の場合または償却)が達成されるまでそれを洗練することによって、トリッキーまたは非自明なデザインを動機付けます。これは私が探しているようなものです。

そう:

  1. 並行データ構造を設計するためにどのような手法またはヒューリスティックが存在しますか?

  2. これらのテクニックとヒューリスティックを説明する本、論文、ブログ投稿、チュートリアルなどはありますか?

回答:


5

私はこの分野について深くは読んでいませんが、モーリスハーリヒーとニールシャビットによるマルチプロセッサプログラミングのアートがテクニックの紹介と調査に役立つことがわかりました。さまざまなアルゴリズム、それらがどのように機能するかについての理由を探り、さまざまなアプローチのトレードオフ、機能、および制限を調べます。それはいくつかの形式を持っていますが、私はそれがかなり導入的でアクセス可能なテキストであることを期待しています。

テキストのフレーバーについては、2008年版のAtomic Registersに関するセクションの紹介を以下に示します。

開始する明らかな場所は、アトミックレジスターを使用してコンセンサスを解決できるかどうかを尋ねることです。驚いたことに、おそらく、答えはノーです。2つのスレッドにバイナリコンセンサスプロトコルがないことを示します。私たちは、2つのスレッドが2つの値を合意に達することができない場合は、あることを示すための運動としてそれを残しnスレッドが上の合意に達することができない k値、n > 2およびk > 2


私は形式主義を恐れていません!:-)
ピョン

3

答えは関数型プログラミングほど単純ではありません。ここでの関数型プログラミングには、関数型プログラミングとは何かという一般的な概念があり、データ構造自体の仕様は、関数型であることによって変化しません。ただし、同時実行性の場合はそうではありません。

  1. 分散/並列/並行計算の多くのモデルがあります。

  2. 順次データ構造の仕様が与えられれば並行バージョンの仕様が得られるという一般的な変換はありません。データ構造の同時バージョンから要求できるさまざまな条件(一般に安全性活性状態に分類されます)があり、さまざまな新しい結果(たとえば、操作の一時停止、操作の中止、クラッシュなど)があります。そのため、順次データ構造の同時バージョンには多くの異なる仕様が存在する可能性があります。

分散コンピューティングに関する参照についてのいくつかの質問:

また、なぜ分散コンピューティングの統一された複雑性理論を開発できなかったのでしょうか?


1

並行データ構造の最初のルールは次のとおりです。並行性は必要ありません。

理想的な場合、分散/並列/並行コンピューティングとは、完全に独立した多数の順次プロセスがあることを意味します。各プロセスには独自のデータとリソースがあり、プロセスは他のプロセスを認識していません。

最悪の場合、複数のスレッドが同じデータ構造を同時にクエリして更新する共有メモリシステムがあります。これを真剣に検討している場合、おそらく何かがひどく間違っているでしょう。

もちろん、並行データ構造について話しているとき、ある程度の並行性は避けられません。それでも最小化したいと考えています。ミューテックスに触れたり、アトミック操作を実行したり、メッセージを渡したりせずにプロセスが連続して機能できる時間が長いほど、すべてが正しく機能し、パフォーマンスは許容範囲内です。

バッチ更新を伴う静的データ構造は、動的データ構造よりも少ない同期を必要とします。並行データ構造を静的にするか、少なくとも可能な限り静的に近づけるようにしてください。アルゴリズムに更新を伴うクエリのインターリーブが必要な場合は、共有動的構造に頼る前にアルゴリズムを変更してみてください。

同じ設計原則が静的データ構造の更新にも適用されます。構造を更新するプロセスをより独立させることができるほど、すべてがうまく機能します。


「静的データ構造」とはどういう意味ですか?
16

@EduardoLeónクエリはできるが効率的に更新できない構造。たとえば、検索ツリーの代わりに配列を並べ替えます。追加の利点として、静的な構造は動的な構造よりも小さく、高速になる傾向があります。
JouniSirén2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.