並列ガベージコレクタを開発中です。これは通常の白→灰色→黒を行うトライマーキングコレクターです。コレクタがオブジェクトを灰色から黒色に移動させると、オブジェクトを灰色にマークするためオブジェクトに降下します。現時点では、オブジェクトの読み込み中にメインスレッドでオブジェクトが変更されないようにロックを解除する必要があります。各オブジェクトに独立したロックを与えるのは非常識なメモリ要件なので、オブジェクトを変更する前にロックする必要がある単一のロック(非gcスレッドごと)があります。 GCはオブジェクトを読み取る前にそのスレッドロックを使用します。C並列ガベージコレクタ、メインスレッドのロックアウトを回避する方法
したがって、GCはスレッドからオブジェクトを反復し、子を読み取る前にロックを取り出し、次の反復の前にロックを解放します。私は、GCが多くのものをロックしていないことを確認したい。私には明らかな解決策は、ロックを解放した直後に 'yield'のように見えるので、ロックを待っている場合にメインスレッドが続行することがあります。ガベージコレクタは優先スレッドではありません。作業を完了するまでに長い時間がかかっても問題ありません。
しかし、私はpthreads(linux)を使用しています。私がgoogleのsched_yield()関数を使用していると、それは有害であると判断されます。結果のほとんどは、それが何をすべきかについての議論である。要するに、あなたがsched_yield()を使って何か間違っていると主張することができるようです。
http://www.technovelty.org/code/c/sched_yield.htmlは代替案を提案しているようですが、アルゴリズムの要点、具体的にはどのように私のニーズに適用するのかが分かりません。
ランダム質問:ガベージコレクションアルゴリズムが、メインスレッドで最初に変更される可能性のあるものを処理するのはなぜですか?メインスレッドがまだ何かを変更しようとしている場合、ガベージコレクタはまだその処理をすべきではないと私には思われます。 – aroth
各スレッドには、ヒープへのポインタのみを含むスタックがあります。ヒープには2つの部分、「トラッキングオブジェクト」リスト(スマートポインタの一種)と実際のデータセクションがあります。スタックハンドル - >ヒープハンドル - >データです。メインスレッドが実行されると、スタックは大きくなり、縮小します。 GCスレッドは、スレッドスタックのロック、ハンドルの繰り返し(灰色のマーク)、スタックのロック解除、ヒープハンドルの灰色→黒の繰り返し、子供の灰色の繰り返しの順に実行されます。グレーが見つからなくなったら、すべての白を無料でマークしてください。メインスレッドでは、一旦ヒープがいっぱいになると、割り当てはヒープ圧縮をトリガーして最後に空き領域を確保します(GCでは行われません)。 – Exodist
以下は、gist.github.com/1129133 – Exodist