2011-08-06 4 views
3

並列ガベージコレクタを開発中です。これは通常の白→灰色→黒を行うトライマーキングコレクターです。コレクタがオブジェクトを灰色から黒色に移動させると、オブジェクトを灰色にマークするためオブジェクトに降下します。現時点では、オブジェクトの読み込み中にメインスレッドでオブジェクトが変更されないようにロックを解除する必要があります。各オブジェクトに独立したロックを与えるのは非常識なメモリ要件なので、オブジェクトを変更する前にロックする必要がある単一のロック(非gcスレッドごと)があります。 GCはオブジェクトを読み取る前にそのスレッドロックを使用します。C並列ガベージコレクタ、メインスレッドのロックアウトを回避する方法

したがって、GCはスレッドからオブジェクトを反復し、子を読み取る前にロックを取り出し、次の反復の前にロックを解放します。私は、GCが多くのものをロックしていないことを確認したい。私には明らかな解決策は、ロックを解放した直後に 'yield'のように見えるので、ロックを待っている場合にメインスレッドが続行することがあります。ガベージコレクタは優先スレッドではありません。作業を完了するまでに長い時間がかかっても問題ありません。

しかし、私はpthreads(linux)を使用しています。私がgoogleのsched_yield()関数を使用していると、それは有害であると判断されます。結果のほとんどは、それが何をすべきかについての議論である。要するに、あなたがsched_yield()を使って何か間違っていると主張することができるようです。

http://www.technovelty.org/code/c/sched_yield.htmlは代替案を提案しているようですが、アルゴリズムの要点、具体的にはどのように私のニーズに適用するのかが分かりません。

+0

ランダム質問:ガベージコレクションアルゴリズムが、メインスレッドで最初に変更される可能性のあるものを処理するのはなぜですか?メインスレッドがまだ何かを変更しようとしている場合、ガベージコレクタはまだその処理をすべきではないと私には思われます。 – aroth

+0

各スレッドには、ヒープへのポインタのみを含むスタックがあります。ヒープには2つの部分、「トラッキングオブジェクト」リスト(スマートポインタの一種)と実際のデータセクションがあります。スタックハンドル - >ヒープハンドル - >データです。メインスレッドが実行されると、スタックは大きくなり、縮小します。 GCスレッドは、スレッドスタックのロック、ハンドルの繰り返し(灰色のマーク)、スタックのロック解除、ヒープハンドルの灰色→黒の繰り返し、子供の灰色の繰り返しの順に実行されます。グレーが見つからなくなったら、すべての白を無料でマークしてください。メインスレッドでは、一旦ヒープがいっぱいになると、割り当てはヒープ圧縮をトリガーして最後に空き領域を確保します(GCでは行われません)。 – Exodist

+0

以下は、gist.github.com/1129133 – Exodist

答えて

2

オブジェクトごとのロックの対象については、スペース要件を制限するために使用したアプローチの1つは、円形の配列のロックを持つことです(ロックではなく、 )。次に、あるオブジェクトを配列内の次のロックに関連付けるアービタをその前に置きます(または、オブジェクトがすでに配列内のロックに関連付けられている場合、アービターはそのロックを配列の先頭に戻します) 。

これは、オブジェクトごとに個別のロックを維持するというパフォーマンス上の利点をもたらします。個々のオブジェクトインスタンスごとに個別のロックオブジェクトが実際に存在するという控え目なスペースは必要ありません。もちろん、ロックの循環配列全体を循環するのにかかる時間が常にオブジェクトを処理するのに必要な時間よりも短くなるように、アルゴリズムのロック数を調整する必要があります。

"チェックアウト"と "チェックイン"を行うロックのプールのリソースマネージャーのように、アービターをもっと機能させる方がよいかもしれません。その後、誰かがロックをチェックアウトするよう要求すると、アービタは、プール内で利用可能であるか(または同じオブジェクトインスタンスに対してすでにチェックアウトされている)、ただちにロックを戻すことができます。あなたが質問に直接当てはまるかどうかはわかりませんが、「各オブジェクトに1つのロック」と「今までに1つだけのロック」の間に他の実行可能なオプションがあることを指摘したかっただけです。あなたの使用モデル内で役に立つかもしれません。

+0

の提案から適応されたチェックイン/アウトシステムを考慮に入れた後のアルゴリズムの高レベルのビューです。それは私の状況に当てはまるのかどうかはわかりませんがそれは非常に良いアイデアです。私はそれに投票しました。あなたの "チェックイン"と "チェックアウト"システムは私の心の中で解決策を引き起こしました。オブジェクト書き込みのロック(gcの読み込み)の代わりに、オブジェクトのチェックイン/アウト状態を変更する前にロックを取らなければなりません。チェックイン/アウトはオブジェクトのビットフラグによって追跡されます(各オブジェクトは既にフラグの8ビットフィールドを持っていますが、この目的に少し割り当てることができます)。 – Exodist

+0

ここでは、チェックイン/アウトシステムhttps://gist.github.com/1129133を考慮した後のアルゴリズムの概要を示します。 – Exodist

関連する問題