Mostly-copying garbage collectionをRubyで実現するためのメモ
gc.cを読んでみたらこんな方針でMostly-copying garbage collectionが実現できるんじゃないかなと思うメモ。考慮していないことが起こって根本から崩れるかもしれないけど、それもまた風流(by 宇多田ヒカル)ということで。
- struct heaps_slotにアドレスが移動禁止かどうかのフラグ(pin)を追加、あとヒープのどこが空いているか素早く探せるデータ構造(ここは何も考えていません。ビットマップみたいのかなー)を用意する。
- ヒープをfrom, toの二つ(または、世代別をやるならもっとたくさん)に分ける
- スタック・レジスタ・rb_global_addressなどから直接さされているオブジェクトを含むヒープはpinをtrueにする。
- ヒープに適切にpinが設定できたらトラバース開始
- トラバースの枠組みは現状のmark処理が使えそう
- トラバースして、あるポインタが示すオブジェクトが、pinがfalseのfromヒープに属していたら空いているtoヒープにコピーする
- もちろん引越ししたら、元の位置に引越し先を残しておく
- トラバースが終わるとpinがfalseのfromヒープがまるっと空くはずなので、これを解放するか次のtoヒープにつかう。
結局、Cレベルで管理しているオブジェクトは移動不可だけど、Rubyレベルで管理しているオブジェクトは移動できるんじゃないかなというのが、肝だけどどうだろう?