mrubyの Tri-color incremental mark & sweep GC その1 GC Advent Calendar 23日目 オブジェクトは3種類の以下の色に分けれられます 白: マークされていない 灰: オブジェクト自体はマークされているが子供はマークされていない 黒: オブジェクト自体、子供もマーク済み Incremental GCの基本的な 動きを見てみる 1. root scan phase roots ルートから直接参照可能なところを灰色に このフェーズでは、ミューテータ(アプリケーション側)は オブジェクトの参照構造を変えられない。 2.incremental marking phase roots 灰色のオブジェクトから 順に塗っていく 適当な数だけ塗ったらGCは休憩。 ミューテータの処理が走る。 2.incremental marking phase roots ああっ、黒->白ができてしまった。 (黒なのに子供がマークできてない状態はまずい) でもライトバリアがあるから大丈夫! ライトバリア ククク、参照関係を 変更してやる ミューテータさん ライトバリアによって黒->白への参照が書きこまれた場合は白は灰色に塗られる (ちなみにmrubyでは2種類のライトバリアを持っている、後述する予定) 2.incremental marking phase ミューテータが止まって、GC再開 roots 3.incremental sweep phase roots 白色をスイープ、適当な数をこなしたらまたしてもGC休憩 3.incremental sweep phase roots でも、マーキングが一度おわってしまえば、参照関係 を変更されるのはあまり影響がない。 どうせ全部黒だからな。フハハハ。 (実はまずいケースもあるのだが、これも後述する) ククク、参照関係を 変更してやる ミューテータさん 3.incremental sweep phase roots またGC再開。白色をスイープし終わる。 これでおしまい。 次回はスイープをインクリメンタル にしている工夫をまとめてみる
© Copyright 2024 ExpyDoc