スレッドローカルGCって?
僕の観測範囲では、日本で今一番熱狂的なブームを巻き起こしているのはスレッドローカルGCなんだけど、ググってもまともな説明が見当たらない。自分のスタックフレームだけ見るM&Sじゃ誤爆しかしないだろうし想像が付かない。
2011-04-08 13:38:54@kumagi D的にスレッドは激しく隔離されてて「ほとんど」共有するものがないけど、GCは正直よっぽど変な思い付きする人が出なけりゃ共有でいくだろうなーとか思ってマス
2011-04-08 13:42:02@s50 concurrentなデータ構造とスレッド間の隔離は相反するので、それを意識した前提条件をコード中に書かせるみたいな方法以外だと実現不可能そうで、むしろややこしくなるからやらないんじゃないかと思います。
2011-04-08 13:46:22@kumagi よく見たらスレッドローカルでも引掛ってました.”Thread-local heaps for Java (ISMM’02)” ライトバリアを使ってローカルオブジェクトをモニタするみたいです
2011-04-08 14:04:37@yaotti ライトバリアでローカルオブジェクトをモニタ…ライトバリアってあのメモリオーダリングでのreleaseバリアの事でしょうか?書き換えを検知する機構でしたっけ?
2011-04-08 14:07:48ぐぬぬ。そしてメモリ管理の淵へ落ちていくのか。メモリ管理はアリーナ式とスラブ式の2種類があって、前者はロック無しでは共有不可だけど、スラブ式は配列とリストをベースにしてるので既存のデータ構造で大体同じような物を作れるのだけれど以下略
2011-04-08 13:59:22@kumagi 結局は実行するプログラムとマシン次第でも使い勝手変わりそう、てあたりを実行時最適化でいくらかいい加減に解決できたら面白いのかも、とか思い始めますた
2011-04-08 14:05:01要はコード中(とか静的な解析)、あるいは実行時に区別する手間をスレッド固有でGC走るメリットが上回れば有効という話ではあるんだよなー。一切を共有しないって話は当然考えないとして
2011-04-08 14:07:51@s50 いい加減な解決は望ましいですが、そうなると今度はJavaのJMMのように、何らかのラインでしっかり契約されていないとマシンの差などを吸収できませんし、そういうラインを賢く決めるのはJVMの中の人でも難しそうです。
2011-04-08 14:12:17@kumagi 使う状況限定されてるならともかく、汎用言語の標準ランタイムでやろう、ってなるとむつかしい話っすね……
2011-04-08 14:18:32@kumagi escape analysisを行ってスレッドローカルであることを保証できるものだけスレッド領域に割り当てるか、ライトバリアを頼りに投機的に割り付けるという方法があります。
2011-04-08 13:42:43@nminoru_jp 一旦スレッドローカルになったからと言って以後ずっとスレッドローカルになるとは言えないので、割り付けた後でスレッドローカルで無いことを確認したら割付を戻す必要があって、確認する方法って結局他のGCと同じぐらいなんじゃ…などと思います。
2011-04-08 13:50:23@kumagi Escape analysisを使った手法はSteensgaard, B: Thread-Specific Heaps for Multi-Threaded Programs, Proc. ISMM’00, pp. 18–24 (2000).があります。
2011-04-08 13:49:48@kumagi スレッドローカル割り付けの失敗はあるのですが、本当にローカルGCが欲しいJ2EEのようなアプリだとアロケータ毎に強い局所性があることが多いです。特に呼び出しコンテキストを区別して判定できると綺麗に判別できます。
2011-04-08 14:01:54@kumagi 投機的に割り付けを行う論文は Domani, TのThread-Local Heaps for Java, Proc. ISMM’02, pp. 76--87 (2002). があります。あと拙論文 http://bit.ly/fpis1t
2011-04-08 14:02:36@nminoru_jp 呼び出しコンテキストによる判別!!malloc内部でコールスタックを眺めてスイッチングするとかJITの際に完全に別のmallocに置換しちゃうとかですか!それはすごい技術ですね…!
2011-04-08 14:09:34@nminoru_jp @kumagi 呼び出しコンテキストを区別するというのは、new命令を含んだAという関数があった場合にaAがB関数から呼び出されたC関数から呼び出されたかで区別して割り付けるものです。まじめに実装するにはインライン展開ができるJITが必要ですね。
2011-04-08 14:13:22