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

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

第三章: 参照カウント(Reference Counting)

2010-04-03 08:42:22
Shinichi Tokunaga @deepneko

オブジェクトの被参照数を表すカウンタを使って、人気不人気を表現しましょう!

2010-04-03 08:44:33
Shinichi Tokunaga @deepneko

アロケーションの流れは基本的にマークスイープと同じ。

2010-04-03 08:53:04
Shinichi Tokunaga @deepneko

指定したサイズ以上のチャンクをフリーリストから探して、見つからなかったらallocation_fail

2010-04-03 08:53:58
Shinichi Tokunaga @deepneko

見つかったらそのチャンクを返すんだけど、そのときにref_cnt(参照カウント)をインクリメントする。

2010-04-03 08:54:55
Shinichi Tokunaga @deepneko

あ、この章だと、オブジェクトは「カウンタ : フィールド」という形で話を進めます。(カウンタ=ref_cnt)

2010-04-03 08:55:53
Shinichi Tokunaga @deepneko

嘘つきました。ref_cntをインクリメントするんじゃなくて、1にします。

2010-04-03 08:56:36
Shinichi Tokunaga @deepneko

update_ptrってのが出てきたんだが…ミューテータがオブジェクトのポインタを更新するタイミングはいつだ?

2010-04-03 09:00:18
Shinichi Tokunaga @deepneko

ポインタの更新は、カウンタのインクリメント処理→デクリメント処理

2010-04-03 09:11:56
Shinichi Tokunaga @deepneko

インクリメントは簡単。オブジェクト渡してカウンタをインクリメントするだけ。

2010-04-03 09:26:34
Shinichi Tokunaga @deepneko

デクリメントは少しだけ複雑。

2010-04-03 09:28:32
Shinichi Tokunaga @deepneko

ポインタ(オブジェクトの)を渡して、カウンタをデクリメントする→カウンタが0だったら、子オブジェクトも踏査して同様にデクリメント処理。

2010-04-03 09:29:36
Shinichi Tokunaga @deepneko

そんで一番最初に渡したポインタはフリーリストに連結されるわけ。

2010-04-03 09:30:15
Shinichi Tokunaga @deepneko

これ、ソースか図見ないと絶対わかんなそうだw

2010-04-03 09:30:43
Shinichi Tokunaga @deepneko

お、ポインタの更新タイミングについて(update_ptrがいつ呼ばれるのか)について書いてあった。

2010-04-03 09:34:15
Shinichi Tokunaga @deepneko

「ポインタの更新は、例えば配列の要素を更新するときに行われます」

2010-04-03 09:35:06
Shinichi Tokunaga @deepneko

ふーむ。ということは、色んな処理のあとにupdate_ptrが挿入されてるってことか。参照カウントの実装ってあんまり綺麗なものにならなそうだね。

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

参照カウントはメモリ管理をミューテータと並行して行うので、アロケーション時にチャンクがなかったら、新たにオブジェクトを割り当てることができません。

2010-04-03 09:37:31
Shinichi Tokunaga @deepneko

マークスイープとの大きな違い。(マークスイープはゴミはいったん放置しておいてチャンクが無くなったら回収)

2010-04-03 09:38:46
Shinichi Tokunaga @deepneko

参照カウントのメリット①: ゴミがすぐ回収できる。

2010-04-03 09:40:01
Shinichi Tokunaga @deepneko

他のGCだとチャンクがなくなってGCが走って初めて、ゴミかゴミじゃないかがわかる。つまりGCが走るまではゴミがメモリに残る。

2010-04-03 09:40:31
Shinichi Tokunaga @deepneko

参照カウントのメリット②: ゴミが生成されるたびにゴミだけ回収するので、ミューテータの最大停止時間が短い。

2010-04-03 09:41:36
Shinichi Tokunaga @deepneko

参照カウントノメリット③: ルートからポインタをたどる必要がない。

2010-04-03 09:43:16
Shinichi Tokunaga @deepneko

分散環境において、計算ノード内では参照カウント、ノード間にはマークスイープ、という手法が一般的。

2010-04-03 09:43:47
Shinichi Tokunaga @deepneko

ノード間…グローバルGCなんてあるのか。これは質問したいところ。

2010-04-03 09:44:07
1 ・・ 8 次へ