2013-02-17 2 views
8

私はMonitorがkernel-mode/kernel syncオブジェクトを使うようにすべての可能な条件のリストをコンパイルしたいと思います。.NETモニタが正確にカーネルモードに移行するのはいつですか?

同期ブロックはフィールドを参照するカーネルオブジェクトを持っていますので、lockはいつかカーネルモードに移行することを控除しました。 Lock (Monitor) internal implementation in .NET

それが答えられるにはあまりにも多くの質問があり、唯一の有用な情報がOPは、単にlockがいつかカーネルモードに行くことを示すことによって、彼自身の質問に答えていることである:

は、私がこれを発見しました。また、その答えをサポートするものへのリンクはありません。

私の質問は異なります - 正確にlockがカーネルモードに行くのを知りたいのですが、なぜそうでないのかはわかりません。

私は古いバージョンとの違いがあるかどうかについて、.NET 4と4.5を聞いて、より興味を持って

EDIT:リヒター帳から:「シンクブロックは、カーネルオブジェクトのフィールドが含まれています、所有スレッドのID、再帰カウント、および待機スレッド数です。

答えて

19

これらの質問の多くは、SSCLI20 distributionで入手可能なCLRソースコードを参照することで回答できます。 .NET 2.0のヴィンテージですが、多くのコアCLR機能はあまり変わっていません。

見たいソースコードファイルは、clr/src/vm/syncblk.cppです。ここでは3つのクラスが役割を果たします.AwareLockはロックを取得するための低レベルのロック実装であり、SyncBlockはロックの入力を待っているスレッドのキューを実装するクラスであり、CLREventはオペレーティングシステムの同期のラッパーですオブジェクト、あなたが求めているもの。

これはC++コードであり、抽象度が非常に高いため、このコードはガベージコレクタと大きく相互作用し、多くのテストコードが含まれています。そこで、プロセスの簡単な説明をします。

SyncBlockには、AwareLockインスタンスを格納するm_Monitorメンバがあります。 SyncBlock :: Enter()はAwareLock :: Enter()を直接呼び出します。できるだけ安くロックを取得しようとします。最初にスレッドがすでにロックを所有しているかどうかを確認し、ロックカウントをインクリメントします。次に、FastInterlockCompareExchange()を使用して、Interlocked.CompareExchange()と非常によく似た内部関数です。ロックが競合しない場合、これは非常に迅速に成功し、Monitor.Enter()が戻ります。それ以外のスレッドがすでにロックを所有している場合、AwareLock :: EnterEpilogが使用されます。 CLREventが使用されるようにオペレーティングシステムのスレッドスケジューラを関与させる必要があります。必要に応じて動的に作成され、WaitOne()メソッドが呼び出されます。カーネルの移行が必要になります。

あなたの質問に答えるには十分です:モニタークラスは、ロックが競合してスレッドが待機しなければならないときにカーネルモードに入ります。

+0

ありがとうございます。特にSSCLIのために - 私はこれが公に利用可能であったことを知りませんでした。 –

+3

CLRソースの関連部分を私に指摘したコメントをありがとう。私は特に回転部分に興味があります:カーネルに行く前に最初にスピンしたときにMonitorと主張されています。そして私はそれがどのくらい正確に回転するか(反復の回数、...)に興味があります。あなたが記述したコードパスでスピンを見ることはできませんが、AwareLock :: ContEntryがAwareLock :: TryEnterによって呼び出されたスピンロジックを参照しています。これは、タイムアウトが使用されている場合にのみTryEnterに適用されるので、C#のロックキーワードを使用しているときには回転が使用されていないようです。私は正しい? –

1

スピンウェイトステップの後。

スレッドを解放した後にのみ競合したロックが解放される可能性があるため、シングルコアマシンでspinwaitをスキップするなど、追加のインテリジェンスが存在することがあります。

+0

Andrew私はこれがどのように質問に答えるかを見るために、すべてのステップを平面図で表示する必要があります。あなたの答えは、人が死んだときに雷に打たれると死ぬときのようなものです。 –

+0

@BoppityBop:飛行機と滑走路を手に入れてください。その後、この点についてご説明します。 –

+0

Ya。より正確なものをお望みなら、「at 5:04:02.008」はどうですか?真剣に、絶対的な答えは役に立たず、相対的な答えは様々です。残っているのは論理的な答えだけです。前のステップが完了したら、あなたの質問にはあなたが後になっているという点がありません。なんで気にするの?それを提供した場合、より有用な回答を提供できる可能性があります。 –

2

ロックが頻繁に競合する場合。

ロックが軽く競合している場合は、ロックが解放されるのを待つためのクイックCPUスピンロックがありますが、ロックが解放されるのに十分な時間待たなければ、スレッドはミューテックスは、スレッドおよび他のそのような管理を中断するカーネルモード呼び出しを含む。

関連する問題