ロックのない、一定の更新時間の同時ツリーデータ構造?


20

私は最近少しの文献を読んでいて、かなり興味深いデータ構造を見つけました。

更新時間を最悪の場合の更新時間まで下げるさまざまな方法を調査しました[1-7]。O(1)

最近、効率的な同時アクセスをサポートするために、ロックフリーのデータ構造の調査を開始しました。

これらの最悪の場合の更新時間技術は、ロックフリーデータ構造の実装に使用されていますか?O(1)

私が尋ねるのは; 私には、それらはこの「理論的強化」の明らかな実際的な拡張のように思えます。


  1. タージャン、ロバート・エンドレ。「O(1)ローテーションでのバランスの取れた検索ツリーの更新。」情報処理レター16、no。5(1983):253 – 257。

  2. Driscoll、JR、N Sarnak、DD Sleator、およびRE Tarjan。「データ構造の永続化」。第18回コンピューティング理論に関する年次ACMシンポジウムの議事録、109–121。STOC '86。ニューヨーク、ニューヨーク、アメリカ:ACM、1986。

  3. Levcopoulos、C。、およびMark H. Overmars。「O(1)最悪の場合の更新時間を備えたバランスの取れた検索ツリー。」Acta Inf。26、いいえ。3(1988年11月):269–277。

  4. フライシャー、ルドルフ。O(1)ワーストケース更新時間を備えた単純なバランスの取れた検索ツリー

  5. ディーツ、ポールF、ラジーエフラマン。「一定の更新時間のフィンガー検索ツリー。」情報処理レター52、いいえ。3(1994):147 – 154。

  6. Lagogiannis、George、Christos Makris、Yannis Panagis、Spyros Sioutas、Kostas Tsichlas。「最悪の場合の一定の更新時間を備えた新しい動的なバランスの取れた検索ツリー。」J. Autom。ラング。櫛。8、いいえ。4(2003年7月):607–632。

  7. Brodal、GerthStølting、George Lagogiannis、Christos Makris、Athanasios Tsakalidis、Kostas Tsichlas。「ポインターマシンでの最適な指探索ツリー」。J。Comput。システム。科学 67、いいえ。2(2003年9月):381–418。


2
問題を調査したい人のために、論文へのリンクを追加することを検討してください。
ラファエル

3
さて、それぞれの記事へのリンクに追加しました。
AT

1
すぐに有用な応答が得られない場合は、cstheory.SEに投稿することをお勧めします(リンクはここに戻ります)。
-JeffE

1
提案をありがとう。私は再投稿しました:ロックフリー、一定の更新時間の同時ツリーデータ構造?
AT

以前は、実用的なロックフリーデータ構造ライブラリを使用しました。ロックフリーツリーデータ構造をサポートしています。たぶんあなたが探しているものがあります。
レザ

回答:


4

はそれ自体では役に立ちません。ロックフリーのデータ構造では、データ構造が変化したように見える場合、単一のアトミックインスタンスが必要です。すべての表現不変条件は、そのアトミックインスタントの直前と直後の両方で有効である必要があります。O1

つまり、データ構造を変更する場合、重要な特徴は、プライベートデータ構造ですべてのmodを実行し、単一のアトミック命令で変更をスワップできることです。

ロックフリーは、通常、データ構造が不変純粋に機能的)である場合に最も簡単です。データ構造の現在のバージョンへのグローバルポインターを保持するだけです。読者は何もロックする必要はありません。データ構造への変更は、1つの不変データ構造へのグローバルポインターを別の不変データ構造にスワップすることによって行われます。

例:純粋に機能的なツリーバランスツリーがある場合:

  1. ツリーのルートへの現在のグローバルポインターを記録します。
  2. ノードを挿入または削除する新しいツリーを作成します。(これは現在ツリーにあるノードの数の時間と空間の対数であり、変更点からルートまでの新しいノードを作成し、データ構造の以前のバージョンの古い部分で新しいものすべてを指すだけです。 )
  3. グローバルポインターを原子的に比較し、ルートにスワップします。(古いルートポインターを記録してから今までに別の変更が行われた場合、これは失敗する可能性があります。これが発生した場合は、ステップ1に戻って再試行します。これはいわゆる「オプティミスティック同時実行制御」です。)

最も重要な部分は、上で表現の不変式を維持する必要があると言ったことです。 通常、ツリーの中央でアトミックに変更を行うアルゴリズムを用意するだけでは不十分です。 どうして?たとえば、ツリーの先行順走査を実行中のリーダースレッドがあるとします。現在読み込んでいるノードの祖先であるノードを変更すると、それらが強制したと考えられる前提条件が無効になります。読者は、変更を加える前とまったく同じように、または変更を加えた後とまったく同じように、データ構造を操作できる必要があります。間にはありません。

OlogNON


たとえば、比較とスワップなどのアクティブな待機テクニックは、通常「ロックフリー」と呼ばれるため、可変設定であっても、いくつかの方法があります。
ラファエル

アクティブウェイティングという用語についてはよく知りません(Googleは支援していません)。(あなたがKoganとPetrankの仕事について話しているなら、それはロックフリーアルゴリズムを待機フリーに変える方法を示しています。)一般にロックフリーダムの可変性に対処する方法についての編集を追加しました。
さまようロジック

「アクティブ待機」することで、私のようなものを意味するwhile ( !P ) { noOp(); } doWork();ところnoOpかもしれsleepまたは類似を。
ラファエル

、編集部分には、可変データ構造はロックフリー作るための手法を述べました。示されているように、データ構造全体をコピーし、コピーにmodを作成してから、CASプリミティブを使用します。しかし、Copyステップをアトミックにする方法は?それは別の難しい問題のようatomic snapshotです。
hengxin

@hengxin:CASプリミティブを「公開」演算子と考えてください。データ構造が公開される前は、変更を行うスレッドのみがアクセスできます。データ構造が公開された後は、不変です。スレッドがコピーできるのは公開バージョンのみであり、これは不変であるため、コピー手順はアトミックである必要はありません。2つのスレッドが同時に変異を試みた場合、両方のスレッドが同じ不変データ構造をコピーし、ローカルコピーを変更すると、CAS操作の1つが成功し、もう1つが失敗します。失敗したものは、再コピーして更新する必要があります。
さまようロジック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.