ガベージコレクションのアルゴリズムと実装 5,6章

ustの進みに合わせて毎週読みます。 http://www.ustream.tv/recorded/6018251
GC
1
Shinichi Tokunaga @deepneko

第六章: マークコンパクトGC

2010-04-10 07:59:15
Shinichi Tokunaga @deepneko

通常のマークスイープによるマークフェーズ → ヒープ領域をスキャンしてコンパクションすることでオブジェクトの詰めなおしをする。

2010-04-10 08:00:16
Shinichi Tokunaga @deepneko

コンパクションするのでオブジェクトのヘッダに移動先を示すポインタが必要です(forwardingポインタ)

2010-04-10 08:02:33
Shinichi Tokunaga @deepneko

それではLisp2アルゴリズムについて読んでいきましょう。

2010-04-10 08:02:59
Shinichi Tokunaga @deepneko

スイープフェーズはマークスイープGCとまったく同じなので割愛。

2010-04-10 08:06:18
Shinichi Tokunaga @deepneko

コンパクションフェーズでは、マークスイープによって虫食い状態になってるヒープ領域を詰めなおします。

2010-04-10 08:07:37
Shinichi Tokunaga @deepneko

やってることは結構シンプル。forwardingポインタの設定→ポインタの更新→オブジェクトの移動。

2010-04-10 08:08:19
Shinichi Tokunaga @deepneko

第五章: マークコンパクトGC

2010-04-10 08:09:33
Shinichi Tokunaga @deepneko

①forwardingポインタの設定

2010-04-10 08:32:02
Shinichi Tokunaga @deepneko

オブジェクトを探索するポインタ(scan)、移動先を指すポインタ(new_address)の2つのポインタを用意します。

2010-04-10 08:33:33
Shinichi Tokunaga @deepneko

ヒープ領域を探索して、scanポインタが生きてるオブジェクトを見つけたら、scan中のオブジェクトのforwardingにnew_addressを設定して、new_addressはオブジェクトのサイズ分進めます。

2010-04-10 08:35:07
Shinichi Tokunaga @deepneko

コピーGCだとFrom空間とTo空間がありましたが、マークコンパクトGCの場合はコピー先コピー元が同じ空間なので、forwardingポインタを新たに設けておく必要があるのです。

2010-04-10 08:36:38
Shinichi Tokunaga @deepneko

む?なんだ?なんのための操作なのかよくわからない。

2010-04-10 08:44:28
Shinichi Tokunaga @deepneko

ルートから直接参照されてるオブジェクト全部に対して*r = (*r).forwarding

2010-04-10 08:48:56
Shinichi Tokunaga @deepneko

ヒープをスキャンして生きているオブジェクトの子オブジェクト全てにたいしても*child = (*child).forwarding

2010-04-10 08:49:44
Shinichi Tokunaga @deepneko

あ、言い忘れてたけどforwardingは何も設定してないとNULLね。

2010-04-10 08:50:09
Shinichi Tokunaga @deepneko

またヒープ領域を生きてるオブジェクトについてだけ全スキャンします。

2010-04-10 08:56:23
Shinichi Tokunaga @deepneko

おいおい、スキャン3回目ですぜ。

2010-04-10 08:56:35
Shinichi Tokunaga @deepneko

new_address = scan.forwarding → copy_data → new_address.forwarding = NULL → new_address.mark = FALSE → $free += new_address.size

2010-04-10 08:58:59
Shinichi Tokunaga @deepneko

つまり、forwarding先に実際にコピー → forwardingポインタとマークビットは初期化しておきましょう。 → フリーリストのポインタも進めておきましょうね。

2010-04-10 09:03:52
Shinichi Tokunaga @deepneko

コピーして上書きしちゃってるけど大丈夫なの?

2010-04-10 09:04:12
Shinichi Tokunaga @deepneko

心配無用。コピー先となるヒープ領域には、この先でコピーしようとしてる生きてるオブジェクトは存在しないよ。

2010-04-10 09:05:46
1 ・・ 9 次へ