next up previous contents index
Next: ルートの決定 Up: 共有ヒープのガーベジコレクション Previous: 局所GC

共有ヒープGC

多くの処理系の共有メモリ実装では、共有ヒープのGCは同期して行っていた。全ての ノードが通常処理を中断して、GCを始める。しかし、単一プロセッサの性能 は共有バスのスループットよりも飛躍的に高くなってきている。GCは局所性 が低く、並列処理では共有バスがボトルネックになってくる。

この問題を避けるために、KLICの共有メモリ実装では、 各ノードが独立にGCする非同期GCを採用した。 同時に複数のノードがGCする代りに、ノードが通常処理している中、 あるノードが非同期にGCを始めるのである。

この方式は共有バスアクセスが時間軸に一定になることを期待している。その結果 バスを待ち合わせするアイドル時間を軽減させることにある。

非同期GCでは、古い面を参照して通常処理していたノードが古い面の領域の 不足を検知してGC処理に切り替わる。ノードは参照している古い面のデータを 新しい面にコピーする。それが終わると、また新しい面を参照面として通常処理 に移る。 もし、2つの面しかなければ、新面があふれた 場合にコピーする面がなくなってしまう。それゆえ、もう一つの未使用面を用意 している。未使用面の確保は実データ使用量が一面のサイズを越えない限り、共 有ヒープ領域のオーバーフローを起こさないことを保証している。

11.2 に非同期GCの状態を示した。 この例では、最初に2つのノードが旧面を 参照している。そして、1つのノードが旧面の領域の不足を検知して、参照デー タを新面にコピーする。その間、もう一方のノードは通常処理を行っている。 一方のノードがGCを終え、その後にもう一方のノードが旧面の領域の不足を検 知して、参照データを新面にコピーする。


  
Figure 11.2: 共有ヒープの非同期 GC
\begin{figure}
\begin{center}
\epsfile{file=shm-shared-heap-gc1.eps,width=0.6\textwidth}
\end{center}\end{figure}

新面を使いきった場合に、未だ旧面を参照しているノードがいた場合には、 それらのノードに対して、割り込みにより強制GCを通知する。それらのノードが 新面に参照データをコピーし終われば、旧面は未使用面に切り替わる。この ように面は回転して使用され、新面は次の旧面、未使用面は新面へと切り替わる。 3面を使用する非同期GCでは、以下のような問題を解決しなければならない。

GC ルートの決定:
共有ヒープを参照しているルートは何か?
並列の読み書き:
通常処理とGCの同時処理方法、同じ場所をアクセスする可能性
旧面の解放の保証:
旧面の解放は新面からポインタ付けされないかまたは、そのようなポインタ を識別できることであるが、どのようにするか?

これらの問題の解決方法を以下に述べる。



 

Sekita Daigo
1998-05-18