カーネル内部のLock-freeというかRCUの話

想像よりもずっとcoolな実装していた!カーネルすごい!
14
くまぎ @kumagi

@syuu1228 カーネルの中ではRCUは良く使われるようですが、どうやって寿命を管理しているんでしょう?参照カウンタじゃ本末転倒だし他のGCがあるわけでもなく…。他のスレッドのプログラムカウンタを見るとかハザードポインタのようにローカルストレージを参照しあうとかですか…?

2011-06-23 07:30:03
くまぎ @kumagi

@syuu1228 GCなんですか…!どういう方式のGCなんでしょうか?まさか全スレッド足止めするようなM&Sじゃないとは思うんですが。

2011-06-23 07:34:00
中村 実 @nminoru_jp

@kumagi @syuu1228 LinuxのRCUはtickの間隔でCPUが暇なら回収しているはず。

2011-06-23 07:34:30
イーロン・マスクツイッターやめろ @naota344

RCUの寿命管理ってどういうことなんじゃろ

2011-06-23 07:34:56
くまぎ @kumagi

@nminoru_jp @syuu1228 CPUの稼働率を見て回収してるんですか…!偉い…!

2011-06-23 07:35:04
イスラエルエリカちゃん @syuu1228

@kumagi 他スレッドを止める必要ってどうしてあるんだっけ・・・

2011-06-23 07:36:26
くまぎ @kumagi

@naota344 書き換えの度にコピーを作るので古いバージョンを見てるスレッドが破綻しないっていう利点はあるんですが今度はいつその古いバージョンを捨てたら良いかわからないんです。他に何人見てるか分からないので自分の用事が終わったら捨てていいとも限らないですし。

2011-06-23 07:38:13
イスラエルエリカちゃん @syuu1228

古くて参照数が0な奴を”そのうち”解放するっぽいなー って位の粒度でしか理解してませんが

2011-06-23 07:38:17
イスラエルエリカちゃん @syuu1228

@kumagi @naota344 他に(何人)見てるかは何とかしてたんじゃなかったかなぁ・・・

2011-06-23 07:39:06
くまぎ @kumagi

@syuu1228 参照カウンタ以外のGCで他スレッドを止めない方法って、ライトバリアを使うとかコピーGCするとか、言語とべったりくっついてそうなイメージだったので、シンプルそうなM&Sを連想したんですが。

2011-06-23 07:39:34
NeoCat @NeoCat

@kumagi Linuxの場合はRCU使用中はプリエンプション禁止、解放側は全CPUで1回以上スケジュールが発生した=クリティカルセクションを抜けたことをビットマップやツリーで確認してから解放です。K○SAKI先生の記事参考になるでしょうか。http://j.mp/ldMCul

2011-06-23 07:43:07
NeoCat @NeoCat

RCUはなんかさらにバリエーションが増えていた気がするけど把握してない…

2011-06-23 07:45:01
イスラエルエリカちゃん @syuu1228

@kumagi @naota344 何か思い出してきた、確か古いオブジェクトを登録しておく方法があって、後で回収処理が走ったときに、全てのCPUが一回以上スケジュールされているかどうか確認する→もうそのオブジェクトを参照していないと保証できる。だったはず

2011-06-23 07:46:01
イーロン・マスクツイッターやめろ @naota344

全CPUが一回以上、はたしかにいま読んでるK○KI

2011-06-23 07:48:20
くまぎ @kumagi

@syuu1228 @naota344 下手なlock-freeより遥かにゴツい実装してますね…!

2011-06-23 07:50:43
イスラエルエリカちゃん @syuu1228

@kumagi @naota344 多分、そうすると正確にいつ要らなくなったのかは把握出来ないけど無視できる単位の時間で検出できて、参照カウンタとかも要らないってことじゃないかにゃー

2011-06-23 07:51:57
イスラエルエリカちゃん @syuu1228

@kumagi @naota344 最初に読んだ時、クリティカルセクション開始終了の所のAPIの引数が0個でナニコレ??って思った覚えが

2011-06-23 07:53:38
くまぎ @kumagi

@syuu1228 @naota344 実に良い実装ですね…(鼻血出しながら

2011-06-23 07:55:10