真夜中のSTMトーク

某ピーFIさんの白熱したお話が聞けました。
25
kumagi @kumagi_bot

僕はデータベースで行うトランザクションの方の処理は追ったことがないので一度勉強しなきゃなぁとは思っている。STMしか知らない男の人ってry

2011-03-25 01:55:55
SKS rep @repeatedly

STMも結局メッセージパッシングよろしくロックの粒度をより小さくする方向かいな

2011-03-25 01:50:23
kumagi @kumagi_bot

オブジェクトに対してメッセージパッシングした場合、処理は直列化されるけれどどうやっても並列化はされない。STMは同一箇所の取り合いにさえならなければ無限に並列化する。

2011-03-25 01:54:20
kumagi @kumagi_bot

@repeatedly ロックベースのものはオブジェクトごとにロックを設けていく方針ですね。ですが僕のイメージではロックするというよりは「必要な書類を全部束ねてホッチキスで留める」みたいな感じです。

2011-03-25 01:53:18
SKS rep @repeatedly

@kumagi_bot STMに入る時に関係のあるオブジェクト群を指す集合みたいなものがあって,あるスレッドがあるオブジェクトに対する操作をコミットした時に,その集合の中のオブジェクトへの参照を新しいのに置換する感じかいな

2011-03-25 01:55:11
SKS rep @repeatedly

@kumagi_bot あれ,それって関わるオブジェクトが増えるとオブジェクト毎にロックを用意するコストってそれなりになるんじゃない?

2011-03-25 01:57:55
SKS rep @repeatedly

それともJavaのモニタみたいに予めもってる前提なのかいな

2011-03-25 01:58:17
Nobuyuki Kubota @nobu_k

@repeatedly ロックは単純なもの(spin-lockとか)だったら1bitあれば実装できるし、そうでなくてもN個のロックにmodで割り当てたりすれば数が増えてもある程度何とかなるんでないかな。

2011-03-25 02:07:46
kumagi @kumagi_bot

@repeatedly transactionに入ったら、その中で他のスレッドが保持する被STM保護オブジェクトに触るたびにそのオブジェクトの所有権を自分に移す。移せない(run)ならトランザクションマネージャにお願いしてどちらかを殺してもらう。

2011-03-25 02:01:28
kumagi @kumagi_bot

@repeatedly コミットの瞬間にはオブジェクトの参照には一切触れないところが最大のポイントで、持ち主の状態がrun→commitに変化する事によりrunの間に書き換えた参照先の情報へ一気にスイッチさせる事ができる。

2011-03-25 02:04:09
Nobuyuki Kubota @nobu_k

ロールバックとか考えたのどいつだよ。うそです。

2011-03-25 01:55:15
SKS rep @repeatedly

@nobu_k アプリケーションに存在する全てのオブジェクトが同時にアクセスするわけではないですからねぇ…

2011-03-25 02:11:04
Nobuyuki Kubota @nobu_k

STM一回ガッツリ勉強したいなぁ。。。

2011-03-25 02:09:36
SKS rep @repeatedly

STMってIOとかはどうやってロールバックするんだろ?

2011-03-25 02:10:11
Nobuyuki Kubota @nobu_k

@repeatedly Software Transactional "Memory"なので共有メモリのこと以外は考えなくても良いと勝手に思ってたんだけどそうでもないのかなw

2011-03-25 02:18:11
SKS rep @repeatedly

@tanakh え,じゃあどうするんですか?

2011-03-25 02:11:18
Hideyuki Tanaka @tanakh

@repeatedly トランザクション中はIOをできないようにするのが一つの解法です。見て見ぬふりをするのがもうひとつの解法です。IOは基本的に巻き戻せません。

2011-03-25 02:12:25
Hideyuki Tanaka @tanakh

@tanakh 前者:Haskell、後者:Clojure

2011-03-25 02:13:12