私はいつもそれらが何であるか疑問に思っていました.それらについて聞くたびに、未来的なフライホイールのようなデバイスのイメージが頭の中で踊る(転がる?).
彼らは何ですか?
私はいつもそれらが何であるか疑問に思っていました.それらについて聞くたびに、未来的なフライホイールのようなデバイスのイメージが頭の中で踊る(転がる?).
彼らは何ですか?
通常のロック (ミューテックス、クリティカル セクションなど) を使用すると、オペレーティング システムはスレッドを WAIT 状態にし、同じコアで他のスレッドをスケジュールすることでスレッドを先取りします。待機時間が非常に短い場合、スレッドは CPU 時間を再度受け取るためにプリエンプションを待機する必要があるため、パフォーマンスが低下します。
さらに、カーネルオブジェクトは、割り込みハンドラやページングが利用できない場合など、カーネルのすべての状態で利用できるわけではありません.
スピンロックはプリエンプションを引き起こしませんが、他のコアがロックを解放するまでループ (「スピン」) で待機します。これにより、スレッドがそのクォンタムを失うのを防ぎ、ロックが解放されるとすぐに続行します。スピンロックの単純なメカニズムにより、カーネルはほぼすべての状態でスピンロックを利用できます。
そのため、シングル コア マシンでは、スピンロックは単に「割り込みを無効にする」または「IRQL を上げる」だけであり、スレッド スケジューリングを完全に防止します。
スピンロックは最終的に、カーネルが「ビッグ カーネル ロック」(コアがカーネルに入ったときに取得され、終了時に解放されるロック) を回避できるようにし、カーネル プリミティブをきめ細かくロックすることで、マルチコア マシンでのマルチプロセッシングを向上させ、パフォーマンスを向上させます。
EDIT : 「可能な限りスピンロックを使用する必要があるということですか?」という質問がありました。そして私はそれに答えようとします:
先に述べたように、スピンロックは、予想される待機時間がクォンタム (読み取り: ミリ秒) よりも短く、プリエンプションがあまり意味をなさない (たとえば、カーネル オブジェクトが利用できない) 場合にのみ役立ちます。
待機時間が不明な場合、またはユーザー モードの場合、スピンロックは効率的ではありません。スピンロックが使用可能かどうかを確認している間、待機中のコアで 100% の CPU 時間を消費します。クォンタムが期限切れになるまで、そのコアで他のスレッドが実行されないようにします。このシナリオは、カーネル レベルでの短いバーストに対してのみ実行可能であり、ユーザー モード アプリケーションのオプションではありません。
これは、SO の対処に関する質問です。
リソースがロックによって保護されているとします。リソースへのアクセスを必要とするスレッドは、最初にロックを取得する必要があります。ロックが使用できない場合、スレッドはロックが解放されたかどうかを繰り返し確認する可能性があります。この間、スレッドはビジー状態で待機し、ロックをチェックし、CPU を使用しますが、有用な作業は行いません。このようなロックは、スピンロックと呼ばれます。
特定の条件が満たされるまで続くのはかなりのループです。
while(cantGoOn) {};
while(something != TRUE ){};
// it happend
move_on();
ビジーウェイトを行うタイプのロックです
これは、非常に低レベルのドライバープログラミングを除いて、アンチパターンと見なされます(「適切な」待機関数を呼び出すと、数サイクルの単純なロックよりもオーバーヘッドが大きくなる可能性があります)。
たとえば、Linuxカーネルのスピンロックを参照してください。
SpinLocks は、ロックが使用可能になるまでスレッドが待機するロックです。これは通常、カーネル オブジェクトを取得する範囲がわずかな時間内にある場合に、カーネル オブジェクトを取得するオーバーヘッドを回避するために使用されます。
元:
While(SpinCount-- && Kernel Object is not free)
{}
try acquiring Kernel object
条件が満たされるまでぐるぐる回るループです。
簡単に言えば、スピンロックは、アトミック比較およびスワップ (CAS) またはテスト アンド セットのような命令を使用して、ロック フリー、待機フリー スレッド セーフなイディオムを実装します。このような構造は、マルチコア マシンで適切にスケーリングされます。
はい、そうです-スピンロックのポイント(従来のクリティカルセクションなどと比較して)は、スレッドの残りのクォンタムをすぐに生成しないため、特定の状況(マルチコアシステム..)でより優れたパフォーマンスを提供することです。