Upload
stefano-carton
View
64
Download
0
Embed Size (px)
DESCRIPTION
曖昧なポインタの存在下での Copying Garbage Collection. 2001/11/13 米澤研究室修士1年 小林 義徳. 発表の内容. 私の研究について。なにを目指しているか。 古典的な Copying Garbage Collection Cheney ’ s Breadth-First Copying Algorithm Bartlett ’ s Mostly-Copying Collection. 私の研究について。何をめざしているか。. Allocation が高速で、 言語処理系の一部として容易に利用可能な GC. 背景. - PowerPoint PPT Presentation
Citation preview
発表の内容
私の研究について。なにを目指しているか。 古典的な Copying Garbage Collection
– Cheney’s Breadth-First Copying Algorithm
Bartlett’s Mostly-Copying Collection
背景
言語処理系を作るにあたり、 Garbage Collectorを 各処理系の作者が自前で実装しているのが現状
はっきりいって、似たようなものが世の中に存在するのに、もう一度実装しなおすのは無駄な努力ライブラリとして容易に利用可能な
GC を つくろう !
世の中に存在する、容易に利用可能な GC
Boehm GC– 全ての word がポインタか否か分からないような環
境で、 Mark-Sweep GC を実現 (Conservative GC)– ライブラリとして容易に利用可能。– C 言語のプログラムにすら使える ( 例 mozilla,w3m)
Allocation が遅いので、 ML や Scheme のような、 Allocation を頻繁に行う言語処理系の GC として、不向き。
実現したいこと (1)
言語処理系を作る際、容易にライブラリとして利用可能 メモリ上のデータの型が分からない環境でも利用可能。
– 各領域の word について、どれがポインタで、 どれがポインタ でないか、部分的に情報がある処理系を仮定。
– Conservative GC Fast Allocation 可能
– 連続した大きな領域の確保が必要– Copy GC
実現したいこと (2)
Native なコードで生成したオブジェクトについて、型を GC に教えるも教えないも自由な Interface– 型がわかるオブジェクトについてのみ Copy を実
行 メモリの断片化を解消
– その際、コピー量をできるだけ減らす。
今日、 Bartlett’s の Mostly-Copying Collector を選んだ動機
もともと、言語処理系用に作られたものである– Bartlett’s Scheme-to-C Compiler
一部ポインタか否かが分からない状況で、 Copy GC を実現している。
古典的 Copying Garbage Collector
完全に どの word もポインタか否か 完全に分かる状況を想定
生きているオブジェクトをコピーすることで GC を実現
Fast Allocation– 空き領域の先頭を指すポインタをずらすだけで
allocation 完了 ヒープ内メモリの断片化が決して起こらない。
Garbage Collection 用語
Root set– アプリケーション内の任意の場所で常に利用可能な領
域 ( 普通、レジスタ、スタック、静的変数を Root set とする )
– Root set からオブジェクトのポインタをたどっていき、到達可能なオブジェクトは、将来アプリケーションに利用される可能性がある。
– 逆に、到達可能でないオブジェクトは、将来利用されることはない。
Garbage Collection 用語
Tracing Collector– Root set からポインタをたどっていき、到達不可能
な オブジェクトをゴミとして回収。– Root set から到達可能なオブジェクトの中にも
将来アプリケーションによって使われないものがあるが、 そのようなオブジェクトも生き残らせておく。
cf. Reference Counting
古典的 Copying Garbage Collector
アプリケーションから オブジェクトの allocate 要求があった際、ヒープ内の空き領域が足りないとき、起動される。
– アプリケーションは、 GC が終わるまで一時停止、終わったら再開
Tracing Collector– Root set からポインタをたどっていき、到達可能なオブジェ
クトを生き残らせる。 Root set からポインタをたどりながら、たどられた
オブジェクトをコピーしていく。– コピーされなかったオブジェクトがゴミ
Copy GC の ヒープ構造
From_space と To_space という、大きさが同じ 二つのヒープ。
通常、オブジェクトを From_space より allocate
From_space To_space
Copy GC での Fast Allocation
Copy GC は Allocation が速い!From_space
free
limit
void* allocate(size_t size){
prev = free;
free = free + size;
if(free < limit){
return prev;
}else{ ・・・ }
}
Allocation 要求
Copy GC の概略 (2)
From_space To_space1. Object は From_space より 端から順に allocate
2. Allocation 要求に応えられるだけの空き領域がなくなったら、 GC を実行
Copy GC の概略 (4)
From_space To_space
4. From_space と To_space を入れ替えておしまい。
これでめでたく、 allocation 要求に応えられるようになる
Copy GC の詳細
前提条件– Root set および ヒープ内の全てのデータについて、
どの word がポインタで、どの word がポインタでないかは全て知っているものとする。
GC の前後で、ヒープ内のオブジェクトの グラフ構造が保たれていなければならない– Node – 各オブジェクト– Edge – オブジェクト内のポインタ
Copy GC におけるコピー操作
GC の前後で、ヒープ内のオブジェクトの グラフとしての構造が保たれていなければならない
1. あるオブジェクトを別の場所にコピー2. コピーされたオブジェクトを指していたポイ
ンタ全てを、 GC の終了時までに、オブジェクトの新しい位置を指すように更新
Cheney’s Breadth-first Copyingアルゴリズムとデータ構造
キューを用いた幅優先探索アルゴリズム To_space をキューとして用いる。
– To_space へのオブジェクトのコピーは、同時に、 オブジェクトをキューに追加することを意味する。
探索しながら、オブジェクトをコピーしていく。
Cheney’s Breadth-first Copyingデータ構造
ヒープ : From_space と To_space To_space 内を指すポインタ
– scan – 次に探索されるオブジェクトを指すポインタ キューの先頭を指すポインタ– free – To_space の空き領域の先頭を指すポイン
タ キューの末尾を指すポインタ
Forwarding pointer – コピーされるオブジェクトの古い位置に置か
れ 、 新しい位置を指すポインタ。
Cheney’s Breadth-first Copyingアルゴリズム
1. 初期化 – キューを空にする scan = free = (To_space の先頭 )
2. ルートから指されているオブジェクトを To_space にコピー (キューに追加 )
3. キュー内のオブジェクトに指されているオブジェクトをコピー (キューに追加 )
4. 以上を、キューが空になるまで続ける。5. 最後に、 From_space と To_space を交換
Cheney’s Breadth-first Copyingアルゴリズム ( オブジェクトのコピー )
object* copy(object* p){if ( p is already copied) { return p->forwarding_addr; }object* newaddr = free;memcpy(newaddr,p,p->size);free = free + p->size;p->forwarding_addr = newaddr;return newaddr;
}
Cheney’s Breadth-first Copyingアルゴリズム ( オブジェクトのコピー )
scan
free
From_space To_space
- コピー前 -
From_space To_space
- コピー後 -
オブジェクトのコピー
ポインタの更新
Forwarding pointer
Cheney’s Breadth-first Copyingアルゴリズム ( オブジェクトのコピー )
From_space To_space From_space To_space
すでにコピーされたオブジェクトを指している場合、
ポインタを forwarding pointer で置き換える
Forwarding pointer
Cheney’s Breadth-first Copyingアルゴリズム (GC のメインループ )
gc(){
scan = free = (To_space の先頭 ); // 1.foreach r in rootset { r = copy(r); } // object* r;
// 2.while(scan < free){
foreach p in scan.children{ // object* p;
p = copy(p); 3. 4.
}scan = scan + p->size;
}
swap(To_space,From_space); // 5.}
Bartlett’s Mostly Copying Collector
Root set の型が分からない状況下での Copying GC
~ Compacting Garbage Collection with Ambiguous Roots~
Bartlett’s Mostly-Copying Collector
もともと Scheme => C コンパイラ用に開発された。
想定している条件 Root set( レジスタ、スタック ) は、曖昧なポインタ
として扱う。 ヒープ内のオブジェクトの構造については、 GC は
完全に知っている。 上のような条件のもとで Copy GC を実現
Conservative GC 用語
曖昧なポインタ– ある word について、それがポインタであるか否
かがわからないような word– ポインタかもしれないので、「指されている」オ
ブジェクトは生きている可能性がある。– ポインタでないかもしれないので、書き換えると
プログラムが正しく動かなくなる場合がある。 Bartlett’s Mostly-Copying GC 等では、
曖昧なポインタに「指されている」オブジェクトは、とりあえず生かされる(Conservative GC) 。
Mostly Copying Collector の概要 (1)
同じサイズのページ達で構成されるヒープ { 曖昧なポインタすべて } = {Rootset の word} GC の始めの Rootset の 探索時に、
曖昧なポインタに「指されている」オブジェクトを含むページを next_space に指定。
next_space 内のオブジェクトは、 GC 中コピーせず、そのままその場に残す。
Mostly Copying Collector の概要 (2)
曖昧なポインタに指されているオブジェクトを含むページ内のオブジェクト全体を Rootset だと思って、古典的な Copy GC を実行するのと等価– ただ、上記のようなページを、 explicit に Rootset
として扱っているわけではない。– アルゴリズムが非常に簡単
キューを用いた幅優先探索アルゴリズム
Bartlett’s Mostly-Copying Collector データ構造
ヒープ : 同じ大きさに区切られたページより構成– Next_space – 曖昧なポインタに指されているページ
– GC 中に新しく確保されたページ – To_space に相当
– Current_space – それ以外。 From_space に相当キュー
– page 単位で管理– Next_space が連続した領域でないため、必要。
Forwarding Pointer – Copy GC と同じ
Bartlett’s Mostly-Copying Collectorアルゴリズム
1. 初期設定 – キューを空にする2. 本来のルートから「指されている」オブジェ
クトを含むページを next_space に指定、キューに追加
3. キュー内の各ページについて1. ページ内の各オブジェクトについて、指されてい
るオブジェクトをキューの最後のページにコピー。
4. 以上を、キューが空になるまで続ける。
古典的 Copy GC におけるコピー操作
GC の前後で、ヒープ内のオブジェクトの グラフとしての構造が保たれていなければならない
1. あるオブジェクトを別の場所にコピー2. コピーされたオブジェクトを指していたポイ
ンタ全てを、 GC の終了時までに、オブジェクトの新しい位置を指すように更新
Bartlett’s Mostly-Copying Collectorのコピー操作 (1)
オブジェクトのコピー– オブジェクトが既に next_space にある場合は、コ
ピーしない。– オブジェクトがまだコピーされていない場合は、
オブジェクトを キューの最後のページの最後にコピーし、もとの位置に forwarding_pointer を残す
– もし、キューの最後のページの空き領域が足りない場合、新しいページをキューの最後に追加し、そこにコピー。
Bartlett’s Mostly-Copying Collectorのコピー操作 (2)
object* copy(object* p){if(p belongs to next_space || p == NULL){ return p; }if(p is already copied){ return p->forwarding_addr; }object* newobj = move(p);p->forwarding_addr = newobj;return newobj;
}
Bartlett’s Mostly-Copying Collectorアルゴリズム
1. 初期設定 – キューを空にする2. 本来のルートから「指されている」オブジェ
クトを含むページを next_space に指定、キューに追加
3. キュー内の各ページについて1. ページ内の各オブジェクトについて、指されてい
るオブジェクトをキューの最後のページにコピー。
4. 以上を、キューの最後まで続ける。
Bartlett’s Mostly Copying Collector
void gc(){next_space = current_space + 1;
queue = empty; // 1.foreach r in rootset{ promote_page(page pointed by r); }
// 2.while(queue is not empty){
block = queue.dequeue();
foreach obj in block{ 3. 4.
foreach q in obj.children{ q = copy (q); }}
}current_space = next_space:
}
Bartlett’s Mostly Copying Collector
void promote_page(page* p){if(p->spaceID == current_space){
p->spaceID = next_space; 2.queue.enqueue(p);
}}
Bartlett’s Mostly-Copying Collectorアルゴリズム
Root set
キュー
2. 本来のルートから「指されている」オブジェクトを含むページを next_space に指定、キューに追加
Bartlett’s Mostly-Copying Collector
キュー
3. キュー内の各ページについて
1. ページ内の各オブジェクトについて、指されているオブジェクトをページキューの最後のページにコピー。
指されているオブジェクトを
Bartlett’s Mostly-Copying Collector
キュー
3. キュー内の各ページについて
1. ページ内の各オブジェクトについて、指されているオブジェクトをページキューの最後のページにコピー。
コピー
指されているオブジェクトを
結局、何がうれしいか。
スタックやレジスタなどの、曖昧なポインタの存在の元で、 Copy GC が実現できた。– 曖昧なポインタに指されていないページについて、
断片化を解消できる。– アルゴリズムが非常に単純 - 実装がラク
Root set の中にオブジェクトの中間を指すポインタが存在しても OK
Bartlett’s Mostly-Copying Collector の欠点
曖昧なポインタに指されているページにあるオブジェクトが生き残ってしまう。– さらに、その子孫まで生き残ってしまう。
曖昧なポインタに指されているページについて、 断片化が起こってないように見えるが、 実は死んでいるオブジェクトが間を埋めているだけ。
関連研究
[Appel 1988] Copying Garbage Collection in the Presence of Ambiguous References (http://research.microsoft.com/~drh/pubs/tr-162-88.pdf)
[Yip 1991] Incremental,Generational Mostly-Copying Garbage Collection in Uncooperative Environments (http://www.research.compaq.com/wrl/techreports/abstracts/91.8.html)
[田中 1998] 卒業論文 ,Copying Garbage Collection in the Presence of Uncertain Pointers (/home/yl2/y-tanaka/ise-env/work/98winter/senior-thesis/thesis)