は重要な課常が早い?
-
21-08-2019 - |
質問
したデバッグマルチスレッド申請の内部構造 CRITICAL_SECTION
.このデータ員 LockSemaphore
のCRITICAL_SECTIONというのも面白い点です。
のようにな LockSemaphore
はオートリセットイベントなセマフォその名の通り、営業システムを作成しこのイベント通知なが初めてのスレッドが待機に Critcal Section
はロックされるその他のねじになります。
現在、私は重要な課常が早い?イベントはカーネルのオブジェクト毎に重要な部オブジェクトに関連イベントオブジェクトをどのよう Critical Section
できる高速度カーネルのオブジェのようなミューテックス?また、どのような内部イベントオブジェクトで実際に能力を左右する重要なのでしょうか。
この構造 CRITICAL_SECTION
:
struct RTL_CRITICAL_SECTION
{
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
ULONG_PTR SpinCount;
};
解決
、彼らは「それはすでに別のスレッドによってロックされていないときには1を取得するために安いです」を意味する。
[もしそれがのことに注意してください、すでに別のスレッドによってロックされ、それは問題ではほぼそんなにそれがどのように速くない。
それは速い理由は、カーネルに入る前に、それは(おそらくInterlockedIncrement
フィールド上の)これらのLONG
分野の一つにLockCount
と同等のものを使用している、ので、それが成功した場合、それはロックがなくなっことなく、後天性考慮しますカーネルにます。
InterlockedIncrement
APIは、私が思うに、他の言葉であなたはすべてのカーネルに任意の環遷移を行わずに無競争のクリティカルセクションを取得することができます...「LOCK INC」オペコードとしてユーザーモードで実装されています。
他のヒント
性能仕事にいくつかは"常に"カテゴリー:)を実装する場合には何か自分に似ているOSによる断使用その他のプリミティブにし妙なが遅くなることが必要である。
にお答えする性能を測定します。どのOSのオブジェをは 非常に 依存性のシナリオ。例えば、重要なセクション全般を対象に行われているこの速い"の場合は競合が低い。もとに速い場合、ロック時間は以下のスピンの数。
最も重要なことをする場合で競重要な部分は、必要不可欠な存在であるにします。ない場合には、それだけで利用に重要な部正常に作業を利用するアプリケーションの一次のボトルネック(または首).
場合による断性能が重要であるが、そのとの関わりを考えることができる。
- 丁寧にセットのスピンロックカウントのご'ホッ'とする重要。た場合の性能が重要であるが、そちらの仕事の価値があります。このスピンロックは避けるが、ユーザーモードのカーネルの移行消費量でのCPU時間が激しくな紡糸、それ以外なにもありませんが利用するCPU。場合にロックが開催されたが、その糸のスレッドが実際にブロックを解放し、そこでCPUいます。
- いリーダ/ライターのパターンにその利用を考える スリムリーダ/ライター(SRW)ロック.下の方にはこちらかのみとなっておりますVista-Windows Server2008年以降の製品です。
- ご利用できる場合もあり 状態変数 との重要な部をポーリングと競合目覚め、スレッドの場合のみ必要です。でも、そのサポートがありますVista-Windows Server2008年以降の製品です。
- 利用をお考えの 連結単独連リスト (SLIST)-これらは効率よび"ロック無料'.しかも、彼らのサポートがありますXP、Windows Server2003以降の製品です。
- をコードすることができるbreak up a'ホッ'とするロックによるリファクタリングの一部のコードを連動運転、SLIST同期をとる。
概要-チューニングシナリオロック競合でき厳しいものが面白い!) ます。を中心測定用性能および理解が熱いパス。のxperfツール Windows性能なツールキット お友達はこちら)に発売されたばかりバージョン4.5マイクロソフトマイクロソフトセWindows SDK Windows7ます。NET Framework3.5SP1(ISOはこちら, webインストーラがここに).きのフォーラムのxperfツール こちらの.V4.5ポートでは、Win7,Vista,Windows Server2008-allできます。
CriticalSections高速ですが、 InterlockedIncrementする / InterlockedDecrement をよりです。この実装の使用サンプル LightweightLock完全コピーを参照してください。
CriticalSectionsは、しばらくの間(数ミリ秒)スピンロックがフリーであるかどうかをチェックし続けます。スピン・カウント「がタイムアウト」の後、それは当時のカーネルイベントに分類されます。ロックの保持者がすぐに取得する場合には、あなたがコードをカーネルに高価な移行を行う必要がありませんので。
編集:私のコードでいくつかのコメントを行ってい:どうやらMSヒープマネージャは、4000(整数単位ではなくミリ秒)のスピン数を使用しています。
ここでそれを見る方法です。
何の競合はありません場合は、スピンロックは、ミューテックスのためにカーネルモードに行くと比べて本当に速いです。
の競合がある場合、クリティカルセクションはやや高価(スピンロック状態を検出するための余分な作業で)直接ミューテックスを使用するよりもある。
それは重みがあなたの呼び出しパターンの仕様に依存加重平均に沸くので。それはあなたが少しの競合を持っている場合、クリティカルセクションが大きな勝利で、言われています。一方、あなたは一貫して競合をたくさん持っている場合は、直接、ミューテックスを使用しての上に非常に小さなペナルティを支払うことと思います。しかし、その場合には、あなたがミューテックスに切り替えることにより得るだろうが小さいので、あなたはおそらく、競合を軽減しようとしたほうが良いと思います。
クリティカルセクションは、カーネルオブジェクトではないので、なぜクリティカルセクションでは、ミューテックスよりも高速です。これは、現在のプロセスのグローバルメモリの一部です。ミューテックスは、実際には、カーネルに存在し、mutextオブジェクトの作成には、カーネルのスイッチが必要ですが、クリティカルセクションの場合ではありません。クリティカルセクションが速いにもかかわらずスレッドが待機状態しようとしているとき、クリティカルセクションを使用している間、カーネルスイッチがあるでしょう。スレッドのスケジューリングは、カーネル側で起こるためです。