ロックのないコレクションの制限?


10

DavidRodríguez-dribeasがStackOverflowのコメントに「すべてのコレクションがロックなしで実装できるわけではない」と書きまし。これが本当かどうかはわかりませんが、どちらの方法でも証拠を見つけることができません。

このステートメントはあまり正確ではありませんが、もう少し正式な方法で言い換えてみましょう。すべてのコレクションタイプに対して、同じ操作セットを提供CするロックフリーのコレクションタイプCLFがあり、各操作でCLFの対応する操作と同じbig-Oの複雑さを持っていCます。

ちなみに、変革は期待していません。


1
専門家ではないので、「ロックフリー」を厳密に定義できるのか。
伊藤剛

1
@Suresh:多分「データ構造」の同義語ですか?
伊藤剛

2
ロックフリーのSTM(ソフトウェアトランザクションメモリ)を実装し、その上にデータ構造を実装するとどうなるでしょうか。
Jukka Suomela、2011年

5
@剛:ロックフリーの正式な定義はないと思います。非公式には、それは遅いCPUのLOCK命令を使用せず、より速い比較とスワップに固執することを意味します。LOCKは比較とスワップでシミュレートできるため、「基本的にここで比較とスワップを使用してロック(またはそのトランザクション)をシミュレートする」と「ああ、これは比較とスワップの賢い使い方であり、私たちが知っているより高いレベルの操作をシミュレートしているようには見えません。」
Radu GRIGore 2011年

1
私が理解している限り、ロックフリーはここでは非ブロッキングと同義であると理解されています。これには、CPUのLOCK命令は含まれませんが、ミューテックス/セマフォなどを介したスレッドスケジューラが含まれます。
MSalters、2011年

回答:


11

自分自身が少し混乱しているので、質問のいくつかの概念を明確にすることから始めます。

コレクション。一般にデータ構造に対して何が起こるかを簡単に尋ねることができるときに、「コレクション」が何を意味するのかを厳密に定義することに時間を費やす理由はないと思います。データ構造はメモリの一部を占有し、そのメモリにアクセスし、ユーザーが呼び出すことができるいくつかの操作があります。これらのユーザーは、個別のプロセッサでも、異なるスレッドでもかまいませんが、私たちには関係ありません。重要なのは、彼らが操作を並行して実行できることです。

ロックフリーHerlihyとBossは、クラッシュしたユーザーがデータ構造のさらなる使用を妨げない場合、データ構造はロックフリーであると言います。たとえば、ソートされたセットにノードを挿入している最中のプロセッサに水を注ぐことを想像してみてください。まあ、他のプロセッサが後でそのソートされたセットに挿入しようとした場合、それらは成功するはずです。(編集:この定義によれば、データ構造がロックを使用している場合はロックフリーではありませんが、データ構造がロックを使用していない場合はロックフリーではありません。)

これらの定義により、HerlihyとBossは基本的に、重要な地域をトランザクションに変えることが答えだと言っていると思います。

しかし、あなたは尋ねるかもしれません、これは同じ複雑さを持っていますか?質問が意味をなすかどうかはわかりません。考えてくださいpush(x) { lock(); stack[size++] = x; unlock(); }。これは一定時間の操作ですか?ロック操作を無視して、他のユーザーを無視する場合は、YESと答えることができます。他のユーザーを無視したくない場合、プッシュが一定の時間で実行されるかどうかを判断する方法はありません。レベルを1つ上げて、特定のアルゴリズムでスタックがどのように使用されるかを確認すると、プッシュには常に一定の時間がかかると言えるかもしれません(並列アルゴリズムの入力として何が起こったとしても測定されます)。しかし、それは実際にはアルゴリズムの特性であるため、プッシュ 一定時間の操作であると言っても意味がありません。

要約すると、操作を実行しているユーザーが他のユーザーを待つ時間を無視する場合、クリティカルリージョンの代わりにトランザクションを使用すると、質問に肯定的に答えます。待ち時間を無視しない場合は、データ構造がどのように使用されるかを確認する必要があります。


push上記のような操作が一定時間の操作ではないと実際に考えることができるかどうかはあまりわかりません。固定数のプロセッサ、およびlock飢餓を保証するその一般的な実装の場合、上記の操作(最悪の場合、任意の特定のプロセッサはN_proc * O(1)をとります。これは、単純にO(1)であると想定できます)(隠された定数に因数分解されるプロセッサーの数)
デビッド・ロドリゲス-dribeas

ff

よく、メモリアクセスはその一般的なケースです。ほとんどのアルゴリズム分析では、メモリアクセスは使用されるメモリとは無関係にO(1)であると想定しています。実メモリー・アーキテクチャー(キャッシュなどを使用)は、O(log N)により近似されます。ここで、Nは使用メモリーです。
MSalters 2011年

プロセッサーの数が一定であるという仮定はかなり実用的ですが、私はそれを避けます。次に問題は、問題のサイズが入力のサイズとプロセッサの数(両方とも直交次元)の両方で大きくなるため、一次元では複雑さを分析できないことです。C ++標準ライブラリの特定のコンテナを想定すると(私は明らかにハードコンテナを選択しています)、要件の1つは、すべての要素が連続したメモリブロックに保持されていることです。
DavidRodríguez-

これで、要素をベクターに追加することは、一定の償却時間操作になります(以前に割り当てられたブロックに収まらない場合、呼び出しはコンテナー内の要素の数に線形時間がかかりますが、メモリの予約ブロックが指数シーケンスに従って取得され、償却コストは一定です)。スレッドセーフコンテナーを実装する場合、ロックしてから変更を実行します。操作のコストはロックのコストに比例します-これは本当にわかりません...定数
デビッドロドリゲス-11

3

「COLLECTIONS」は「キュー、スタック、リンクリスト、ツリーなど」を表すと思います

http://www.cl.cam.ac.uk/research/srg/netos/lock-free/から

入念な設計と実装により、ロックを管理したりスレッドをブロックしたりすることなく、同時に使用しても安全なデータ構造を構築できます。これらの非ブロッキングデータ構造は、同時実行性を高めることでパフォーマンスを向上させ、ローカル設定での優先順位の逆転、または分散システムでのマシンとリンクの障害によって引き起こされる問題の一部を回避することで堅牢性を向上できます。

ノンブロッキングアルゴリズムの総合的な紹介として最も優れているのは、現在提出中のペーパーロックなしの同時プログラミングです。これは、マルチワードの比較とスワップ、ワードベースのソフトウェアトランザクションメモリとオブジェクトベースのソフトウェアトランザクションメモリの設計をカバーしています。

「ロックフリー」が「オペレーティングシステムのセマフォ、ミューテックス、モニターなどを使用しない」を意味する場合、アトミックな読み書きを使用してすべてのコレクションをロックフリーにできると思います(ただし、私は専門家ではありません)。ハードウェアがサポートする必要のあるプリミティブを変更します。

O

このテーマに関する包括的なドキュメントはオンラインで見つけることができます:

http://www.google.it/search?q=lock+free+algorithm+filetype%3Apdf

(...各ドキュメントの最後にある参考文献)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.