6

私はプログラミング言語の設計を実験してきましたが、ガベージコレクションシステムを実装する必要が出てきました。ここで最初に頭に浮かんだのは参照カウントでしたが、これは参照ループを処理しません。アルゴリズムを検索するときに出くわすページのほとんどは、Javaなどの既存の言語でのガベージコレクターの調整に関するリファレンスです。特定のアルゴリズムを説明するものを見つけたとき、実装のための十分な詳細が得られていません。たとえば、ほとんどの説明には「プログラムのメモリが不足したとき...」が含まれていますが、これは、スワップが十分にある4GBシステムではすぐには発生しない可能性があります。したがって、私が探しているのは、ガベージコレクターを開始するタイミングを調整する方法など、実装の詳細が記載されたチュートリアルです(つまり、

私がやろうとしていることについてもう少し詳しく説明するために、Postscriptに似たスタックベースのインタプリタを書くことから始めます。次の試みは、おそらくLisp方言の1つに基づくS式言語です。 。私はストレートCで実装しています。私の目標は、独学と、さまざまな段階を「インタプリタの設計と作成方法」チュートリアルに文書化することの両方です。

これまでに行ったことについては、スタックマシンスタイルのVMによって解析および処理されるCスタイルの命令型言語を実装する単純なインタープリターを作成しました(lang2e.sourceforge.netを参照)。ただし、この言語は関数の入力時に新しいメモリを割り当てず、ポインタデータ型も持たないため、当時はどのタイプの高度なメモリ管理も実際には必要ありませんでした。次のプロジェクトでは、非ポインター型オブジェクト(整数、文字列など)の参照カウントから始めて、別のメモリープール内のポインター型オブジェクト(循環参照を生成できる)を追跡することを考えています。 。次に、プールが前のガベージコレクションサイクルの終了時よりもX割り当て単位を超えて大きくなるたびに、コレクターを再度開始します。

私の要件は、非効率的ではないが、実装と文書化が簡単であるということです(他の人がフォローできるように、これを紙や本に発展させたいことを忘れないでください)。私が現在前面に持っているアルゴリズムは3色のマーキングですが、世代別コレクターの方が少し優れているように見えますが、文書化して理解するのは困難です。ですから、私が始めるのに十分な実装の詳細を含むいくつかの明確な参考資料(できればオンラインで入手可能)を探しています。

4

2 に答える 2

5

ガベージ コレクションに関する素晴らしい本があります。これはGarbage Collection: Algorithms for Automatic Dynamic Memory Managementと呼ばれ、優れています。私はそれを読んだので、Google で検索できるという理由だけでこれをお勧めしているわけではありません。ここを見てください

単純なプロトタイピングの場合は、マーク アンド スイープまたは単純な非世代別、非増分圧縮コレクターを使用します。増分コレクターは、システムからの「リアルタイム」応答を提供する必要がある場合にのみ適しています。システムが特定の時点で任意に大幅に遅れることが許可されている限り、増分のものは必要ありません。世代別コレクターは、オブジェクトのライフサイクルについて何かを想定するという犠牲を払って、平均的なガベージ コレクションのオーバーヘッドを削減します。

私はすべて (世代別/非世代別、増分/非増分) を実装しましたが、ガベージ コレクタのデバッグは非常に困難です。言語の設計に集中したいので、より複雑なガベージ コレクターのデバッグにはあまり力を入れたくないので、単純なガベージ コレクターに固執することができます。私はおそらくマークアンドスイープに行きます。

ガベージ コレクションを使用する場合、参照カウントは必要ありません。それを捨てる。

于 2012-05-18T06:01:42.127 に答える
1

アロケータをいつ開始するかは、おそらく広く開かれています。そうでなければメモリ割り当てが失敗するときに GC を実行するか、参照がドロップされるたびに GC を実行するか、途中でどこでも実行できます。

選択の余地がなくなるまで待つということは、実行中のコードが十分に含まれている場合、GC を実行しないことを意味する場合があります。または、環境に巨大な一時停止が発生し、応答時間、アニメーション、またはサウンドの再生が完全に破壊される可能性があります。

すべてで完全な GC を実行すると、free()より多くの操作でコストを償却できますが、結果としてシステム全体の実行が遅くなる可能性があります。より予測可能になりますが、全体的に遅くなります。

人為的にメモリを制限してテストしたい場合は、非常に制限的なリソース制限を設定して実行できます。実行ulimit -v 1024すると、そのシェルによって生成されたすべてのプロセスは、1 メガバイトのメモリしか使用できなくなります。

于 2012-05-18T01:39:51.777 に答える