ロックとモジュラリティ、メモリ管理と型安全性

16
Hideyuki Tanaka @tanakh

あっー、100ブクマ超えとる。Concurrent Revisions知名度上がって欲しい: モダン並列・並行プログラミング ~ Concurrent Revisions による実装と現実 ~ http://t.co/Vd4H7aS5 via @preferred_jp

2011-10-20 20:29:53
KOYAMA Youichi @koyama41

@tanakh 面白いスライドでした。しかしオロカな私は32ページの「まちがい(2)」のどこが当然バグなのかわかりませんでした… ロック順番があやしいのでデッドロックはしそうですけど、「順番は今は不問」なんですよねえ?

2011-10-20 20:39:25
Hideyuki Tanaka @tanakh

@koyama41 そこはちゃんとソートしてロックするコードを書くとページに収まらなくなるので省略してただけでした。すいません。あと、先のページで獲得すべきロックは最初にまとめて取らなければ、デッドロックする可能性があるという説明になっているので、こういう処理はバグだという話です

2011-10-20 21:44:19
KOYAMA Youichi @koyama41

@tanakh ん、じゃあ直前のページにある「順番は今は不問」というのは、どういう意味だったんでしょうか。デッドロックの問題はとりあえず脇においといてもバグがあるという話をしようとしてるのかと思ったのですが

2011-10-20 21:45:57
Hideyuki Tanaka @tanakh

@hararan_2010 なるほど、やはり曖昧な例がありますね…

2011-10-20 21:46:23
Hideyuki Tanaka @tanakh

@koyama41 ロックの順番ちゃんとやるのを端折ってるだけで、まちがい(2)の方のバグもデッドロックの可能性の話です。あとIsolationが破られてます。

2011-10-20 21:48:19
KOYAMA Youichi @koyama41

@tanakh うーん、ロックの順番をスライドの都合上てきとうにしてるだけならばデッドロックバグの例になってないような気がしますが、どういうことを言いたかったんでしょうか?

2011-10-20 21:51:19
Hideyuki Tanaka @tanakh

@koyama41 bとaを逆にした呼び出しが同時に走ると、このままではデッドロックする可能性があると思うのですがどうでしょう?

2011-10-20 22:06:39
KOYAMA Youichi @koyama41

@func_hs 速度を基準にするんだったら二分探索に限定しない方が面白そう。つまりぶっちゃけバカサーチでも速ければ勝ち。でもバカサーチで勝てるような規模の入力にはしないでしょうから、結果として二分探索ぐらいはやらないといけなくなる、という寸法で。

2011-10-20 22:07:39
KOYAMA Youichi @koyama41

@tanakh それはそのとおりですね。ただ、「順番は不問」という言葉からは、何を端折ってて何をここでの問題として取り上げたいのかがよくわからなかったのです。

2011-10-20 22:08:22
Hideyuki Tanaka @tanakh

@koyama41 なるほど。ちょっと書き方が悪かったですね。

2011-10-20 22:15:31
KOYAMA Youichi @koyama41

@tanakh あと、 Isolation が破られているというのはどういう場合でしょうか?まちがい(2)の方のページの話ですよね? (まちがい(1)はデッドロックさえ起きなければ安全そうなので)

2011-10-20 22:17:03
Hideyuki Tanaka @tanakh

@koyama41 はい。(2)の方のつもりでした。しかしよく考えたら破られてないような気がしてきました。この場合は引き出せなかったら状態が変わっていないので。

2011-10-20 22:20:21
KOYAMA Youichi @koyama41

@tanakh ああ、やっぱりそのへんでしたか。 withdraw が破壊的に引き出しっぱなしだったら困るなーと思いつつ、もしそうならそもそもまちがい(1)のコードもひどいもんだからそういう話じゃないよなあ、と思ったのでした

2011-10-20 22:22:14
Hideyuki Tanaka @tanakh

ロックの話もメモリ管理の話もそうだけど、あれは気をつけなきゃ死ぬぞって類の物ではなくて、本質的にソフトウェアの抽象性を破るものだとちゃんと理解しないといけない。前者はモジュラリティ、後者は型安全性。そこが解ってないと、僕はロック忘れなんてしませんから、ていう話になってしまう。残念

2011-10-20 23:29:09
Hideyuki Tanaka @tanakh

今度は別のDeterministic Parallelismも紹介したい。Concurrent Revisionsはどうなるかわからんけど、Implicit Parallelismは(ちゃんと性能を出すには)難しすぎると思うので、だんだん廃れてくると思うし。

2011-10-21 00:33:40
KOYAMA Youichi @koyama41

@tanakh メモリ管理では型安全の話以外にGCの有無でもモジュラリティに差がでます。Cだと例えばstatic領域を指すポインタを返すstrerror()に対しstrerror_rというバッファを渡すAPIが泥縄式に追加されましたが、最初からGCがあれば避けられたはず。

2011-10-21 00:50:50
鯉江 @koie

@koyama41 @tanakh メモリ管理をGCというひとつ下のレイヤに押しつけたのと同じように、ロックもロックマネージャの管理下でするってことにすればデッドロック検出できるので、ぜんぜん問題ないってことにはならない?

2011-10-21 00:55:58
SKS rep @repeatedly

@koie それがSTMとかなのでは?

2011-10-21 00:58:12
KOYAMA Youichi @koyama41

@koie メモリ管理をGCという下のレイヤに押し付けたことはプログラミングスタイル自体を変えました。同様に、ロックを下のレイヤにおしつける場合、単にロックマネージャを作ってデッドロックを検出させるのではなく、プログラミングスタイル自体を変えるような機構が必要だと思います。

2011-10-21 01:01:33
鯉江 @koie

@repeatedly STMは最後のcommitでいっきに書き換えるのに対して、ロックだとデッドロックしたときにロールバックするという違いになるとおもいますが、コーディングスタイルはおんなじになりそうですね。

2011-10-21 01:08:33
SKS rep @repeatedly

@koie デッドロックを検出したらロールバック,というロックの実装を知らないんですが,そういうライブラリってあるんですかね?

2011-10-21 01:09:54
鯉江 @koie

@repeatedly いやいや、ここは妄想です。ロックが必要な変数を参照・書き換えるところに処理系がrwlockするコードを挿入してくれて、デッドロック通知をうけたら前の値に書き戻しながら戻っていく、みたいな。

2011-10-21 01:13:51
Hideyuki Tanaka @tanakh

@koie @koyama41 それはデッドロックは解消できても、ライブロックになりやすそうで、それはどうにもならなそうな気がしますけどどうでしょう。あとそれだとデッドロックの問題しか解消しないと思います。

2011-10-21 01:16:30
SKS rep @repeatedly

@koie Intelがそういうのの静的解析をしているという噂は聞いたことありますが,デッドロックはデッドロックなので,起きたらもう終わりですね.やるならロック機構をシミュレートする必要があるとは思いますが,それならcomposableなSTMの方が楽そうです.

2011-10-21 01:17:48