test-and-setとcompare-and-swap

備忘録として
11
くまぎ @kumagi

test-and-setだとnコンセンサス問題に置いてn=2までしか対応できないのに対しcompare-and-swapだと無限のnに対応できる!さすが百獣の王CASさんやで!

2010-12-20 20:44:44
SKS rep @repeatedly

コンセンサス問題って,分散環境における値の一致云々だったっけ?

2010-12-20 20:47:21
M.K @ryutorion

@repeatedly それぞれのプロセスが値を提案して,そのうちの一つに合意をする,という問題だったと思います

2010-12-20 20:49:58
SKS rep @repeatedly

TASがコンセンサス問題でn=2までしか扱えないのは,成功 or 失敗しか分からないから?

2010-12-20 20:57:07
くまぎ @kumagi

@repeatedly ですね。boolしか扱えないからです。ハードウェアコストの関係上バランスが良かったという歴史なんでしょうね。

2010-12-20 22:20:21
SKS rep @repeatedly

CASにはABA問題があったか…

2010-12-20 21:53:09
SKS rep @repeatedly

TASやCASに関してまとまった知識が欲しいなぁ.書籍しかないのか?

2010-12-20 22:14:03
くまぎ @kumagi

@repeatedly 読んでる限りだと英語のwikipediaがまとまってて良さげです。Java並行本だと時間の見積もりだとか他で見ない情報もあります。 http://en.wikipedia.org/wiki/Test-and-set

2010-12-20 22:16:51
くまぎ @kumagi

test-and-setでできなくてcompare-and-swapにできる事がある!ってのが数学的に証明されたのが僕が3歳の頃。本当にこの世界は怖い。

2010-12-20 22:22:11
SKS rep @repeatedly

Java並行本全部読めてないんだよな

2010-12-20 22:18:54
SKS rep @repeatedly

TASもCAS同様最初にチェックが入ると思うんだけど,ABA問題起こりそうな?

2010-12-20 22:21:23
SKS rep @repeatedly

ABA問題が起こるシチュエーションが今の実装絡めたらないってことなのか?後バスを占有するというのがよく分かってなかったり.

2010-12-20 22:21:51
くまぎ @kumagi

@repeatedly ABA問題は「CASが成功するスレッドは1つだけだ」という前提でコードを組んだ場合に運悪く2つ以上のスレッドで値が一致して事故る現象を言うので、「TASが成功するスレッドは1つだけ」という前提で組むコードとは前提が違います。

2010-12-20 22:29:57
SKS rep @repeatedly

@kumagi あーやっぱそうなのか.その辺の細かい前提が分かってなかった.

2010-12-20 22:33:20
SKS rep @repeatedly

あれ,でもCASでもswapしたかどうかboolで返すような?実装によるだろうけど.

2010-12-20 22:28:12
くまぎ @kumagi

@repeatedly cmpxchg8bの情報を眺めるに、成功時にZFが立って失敗時にZFがクリアされるけど、失敗時はついでに目的アドレスの値がEDX:EAXにロードされるようです。

2010-12-20 22:35:49
SKS rep @repeatedly

コンセンサス問題におけるTAS / CASのスケーラビリティについてはまだまだ理解が必要

2010-12-20 22:35:58
SKS rep @repeatedly

@kumagi へー.std.atomics.CASも中でそれ使ってるから,失敗した時にそれの値みればいいのか.

2010-12-20 22:38:17
SKS rep @repeatedly

CASでほげほげしようと思ったらインラインアセンブラ相当の機能必須じゃね?

2010-12-20 22:38:58
くまぎ @kumagi

@repeatedly asm volatile("" : : : "memory"); って書いてメモリフェンスとか必要でしょうね。boost::atomicのcasなんて成功時と失敗時に分けてメモリバリアを使い分けれるとか…。

2010-12-20 22:43:06
SKS rep @repeatedly

D言語の場合はvolatile statementで囲いつつ,中でcore.atomic.CASとかかなぁ.いやしかしCASが必要になるということはそれ共有状態にあるということでshared修飾されているわけだから,メモリバリアは自動で貼られるはず?

2010-12-20 22:46:33