「GCとPCLの和解」の編集履歴(バックアップ)一覧に戻る

GCとPCLの和解 - (2011/12/23 (金) 20:58:40) の編集履歴(バックアップ)


はじめに


toy-lang にコルーチンを実装するにあたって、BoehmGC と PCL(Portable Coroutine Library) の間で色々不都合があったのでこれに対応を行ったのでその際の方法をメモとして公開します。

現在の開発中の版では問題がわかってこれらのライブラリを組み合わせた際の問題については解決していますが、その中でわかったことやプログラミング上のテクニックについて参考になればと思います。

BoehmGCの動作について


toy-langを実装するにあたっては、できる限り汎用のライブラリを使用して実装することにしています。
toy-langにおいては、GC(ガベージコレクション)はBoehmGCを、コルーチンの実装には PCL を使用しています。

2年ほど前、コルーチンを実装していてどうしてもうまく動かなくて悩んでいました。

まず、GCの動作について非常に簡単ですが説明したいと思います。(Fig.1)


メモリが足りなくなりGCが発動すると、Fig.2>のように、

  • ヒープ領域のGC
  • スタック領域のGC

が実行され、ごみ(どこからも参照されない)と判断されたメモリ領域の回収プロセスが実行されます。


当初、各コルーチンのスタック領域はヒープ領域に確保していました。
このようにすると、GCのタイミングでプロセスが確実に落ちます。

*

本現象の原因は