• 検索結果がありません。

第 4 章 生成順序保存を利用する世代別ごみ 集め集め

4.2 提案方式

提案する方式の実装は第3章に示したアルゴリズムを拡張する形で行った.以下に述べるアルゴリ ズムでは,ごみ集めの対象外にされた古いオブジェクトから,ごみ集めの対象になる新しいオブジェ クトを参照しているポインタの管理のための,remember setや間接参照等を必要としない.

提案方式の世代別ごみ集めとしての振る舞いは,Appelの方式に近い動きをする.ただし,Appel の方式では,複写法に基づいているのでそうせざるを得ないのだが,圧縮の結果できたヒープの空き 領域を半分にして生成領域としていたのに対して,提案方式は空き領域を全て生成領域に振り向け ることができるので,ごみ集めの発生間隔を倍以上にできる.また,Appelの方式では,古い領域が ヒープの半分に達すると,全体的なごみ集めを行うのに対して,提案方式では,古い領域としてヒー プ全体を利用できるので,全体的なごみ集めの発生間隔も倍にできる.ただし,このタイミングは次 に詳述するように,1つのパラメタで制御可能である.

そして,Appelの方式ではremember set(RS)を用いて世代間ポインタの管理を行っているが,

提案方式では世代間ポインタが置かれている位置の最も上(番地が小さいもの)を更新するだけにし て,RSのための領域を必要としない代わりに,古い領域の世代間ポインタを線形探索で調べる必要 がある.

4.2.1 アルゴリズム

ヒープの上端と下端のアドレスをそれぞれHT,HB(HT < HB)とする.次の変数やパラメタを用 意する.

指標cmfa: 逆方向ポインタでヒープの最も上に位置するものを指す.

指標mfa: HTからmfaまでの領域のオブジェクトは印付けや移動の対象にならない.これを「古い 領域」と呼ぶ.mfaより下HBに至るまでの領域を「生成領域」(generation area)と呼び,オ ブジェクトの確保に使われ,ごみ集め時には印付けや移動の対象となる.

パラメタ salvage pointと指標 svgp: 0salvage point1を満たし,svgpはsvgp=salvage point×

HB+ (1salvale point)×HTとして与えられる.mfaがsvgpを越えたら,つまり古い領域 のサイズがヒープのsalvage point以上になったら,mfaをHTに戻し,全体的なごみ集めを 行う(系をご破算にする).

4.2. 提案方式 45

¶ ³

// 初期化 void init() {

mfa = HT;

cmfa = HB;

cross = false;

}

// フィールド f に対する書き換え時の処理

void setf(word *f, word d) { // d はポインタだと仮定

*f = d; // 書き換え

if ((f < d) && // 逆方向ポインタ

(f < cmfa)) // 始点がcmfaより小さい

cmfa = f; // cfmaを更新

if ((f < mfa) && // 始点が古い領域内で

(mfa < d)) // 終点が古い領域の外

cross = true; // 古い領域を跨ぐ逆方向ポインタあり

}

// ごみ集め void GC() {

if (cross == true) // 古い領域から飛び出していたら

mfa = cmfa; // 逆方向ポインタを全てごみ集め!

if (mfa > svgp) { // 古い領域が水準を越えたら mfa = HT; cmfa = HB; } // ご破算

cross = false; // この時点で古い領域を跨ぐ逆方向ポインタは

// 全てごみ集め済み

mfaとヒープ先頭の間のオブジェクトを辿らないようにして印付け;

クラスタ化とソーティング;

後ろ向き走査; // ヒープを下から上への走査(クラスタのみ)

if (C0 が古い領域に隣接 // ごみ集めを1回生き延びた

mfa = C0の次のアドレス;

// 前向き走査では古い領域も含める.

// 古い領域で最初の逆方向ポインタをcmfaに設定.

}

µ ´

図4.1: 生成順序保存に注目した世代別管理

フラグcross: mfaを跨ぐ逆方向ポインタ,つまり古い領域から生成領域のオブジェクトを指すポイ

ンタが発生したことを示す.

cmfa

mfa

mfa = cmfa lower

address

higher address

cmfa

mfa reverse C0

pointer

cross == false

cmfa

mfa

cmfa

mfa

cross == true

program execution

garbage collection

garbage collection

OLD-region generation area

OLD-region

HT

HB

図4.2: 古い領域の変化

図4.1にアルゴリズムを,図4.2に古い領域の変化の例を示す.図では古い領域のことをOLD-region と標記している.