同時実行をサポートするインタープリターのガベージ コレクターを作成する必要がありますが、同時実行とは関係なく、ガベージ コレクションに関する情報しか見つかりません。
マルチスレッド システムでオブジェクトのガベージ コレクションを行うための特定の方法はありますか? それらのアーキテクチャと実装に関する情報はどこにありますか?
同時実行をサポートするインタープリターのガベージ コレクターを作成する必要がありますが、同時実行とは関係なく、ガベージ コレクションに関する情報しか見つかりません。
マルチスレッド システムでオブジェクトのガベージ コレクションを行うための特定の方法はありますか? それらのアーキテクチャと実装に関する情報はどこにありますか?
並行ガベージ コレクションは、実際には正しく処理するのが非常に難しいものです。ただし、並行ガベージ コレクション アルゴリズムに関する研究は行われています。
マーク & スイープ: http://doc.cat-v.org/inferno/concurrent_gc/
マーク & スイープ (PDF 警告): http://www.win.tue.nl/~jfg/articles/CSR-04-31.pdf
世代コピー: https://labs.oracle.com/techrep/2000/abstract-88.html
世代コピー: http://chaoticjava.com/posts/parallel-and-concurrent-garbage-collectors/
スレッドの同期が難しいため、ヒープが一貫性のない (無効な) 状態のままになることはありません。
マルチスレッド システムでオブジェクトのガベージ コレクションを行うための特定の方法はありますか? それらのアーキテクチャと実装に関する情報はどこにありますか?
主な解決策は 2 つあります。
あるスレッドから別のスレッドに値が渡されるときに値をディープ コピーすることにより、変更を禁止し、結果の一方向ヒープの参照透過性を活用します。次に、非並行コレクションを使用します。Erlang はこれを行います。
コンカレント ガベージ コレクタを使用します。詳細については、ガベージ コレクション ハンドブックの第 15 章「同時ガベージ コレクション」を参照してください。.NET と JVM がこれを行います。コレクターの実行中にヒープ トポロジの変更を記録するには、書き込みバリア (Dijkstra、Steele、または Yuasa) が必要です。
同時実行ガベージ コレクタは、完全な同時実行 (一時停止なし) からほぼ同時実行 (通常は、グローバル ルートの自己一貫性のあるスナップショットを取得するための、世界を一時停止する短い一時停止) までさまざまです。常に変化するヒープ トポロジを GC に通知するには、きめの細かい同期が必要になるため、完全な同時実行はスループットの点でコストがかかります。粗粒度の同期は、美しいVery Concurrent Garbage Collector (VCGC)のようなコレクターで可能です。FWIW、 F#.NET Journalに F# での VCGC 実装に関する記事を書きました。
たぶん私はこれをよく理解していないだけです...しかし、オブジェクトへの参照が生きていることと並行性は何の関係があるのでしょうか? 生きた参照があるか、ないかのどちらかです。複数のスレッドはそれに影響しません。
どの参照が生きているかどうかを確認するために、各スレッドを個別にトレースする必要があるかもしれません。しかし、それはシングルスレッドのトレースを複数回適用するだけです。
また、すでにこれらすべてを実行している VM の上にインタープリターをプログラムするだけではどうですか? JRuby (Java VM) や IronPython (.NET) のように。