13


9

スピンロックの機能に困惑しています。

スピンロックは、プロセスのスケジュール変更を防ぐために使用されます。 しかし、コアが1つしかないマシンでは、コンテキストの切り替えを防ぐためにスピンロックを使用すると便利ですか。

4 Answer


10


短い答え:いいえ。

スピンロックは、シングルプロセッサシステムでは使用しないでください。 最良の場合、単一プロセッサシステム上のスピンロックはリソースを浪費し、ロックの所有者を遅くします。最悪の場合、プロセッサがデッドロックします。

投稿者:http://blogs.microsoft.co.il/blogs/sasha/archive/2008/08/10/practical-concurrency-patterns-spinlock.aspx

シングルプロセッサシステムでは、スピンロック同期は高IRQLでのみ必要なので、スピンロックは必要ありません。 IRQLが高い場合(IRQLがディスパッチされている場合)、コンテキストの切り替えは発生しないため、取得スレッドを回転させる代わりに、関連するIRQLで割り込みを要求して戻ることができます。解放スレッドがIRQLを要求されたIRQL以下に下げるまで、割り込みはマスクされます。

シングルプロセッサシステムでは、カーネルはスピンカウント値を無視し、それをゼロとして扱います - 基本的にスピンロックを何もしません。

はい、スピンロックは便利であり、いくつかの操作の効率を向上させることができます。 ただし、一般的にはミューテックスから始める必要があります。プロファイリングでそれがボトルネックになっていることが判明した場合は、スピンロックを検討することをお勧めします。


10


あなたの観察は良いです。ユニプロセッサシステムでは、リソースを待つために回転する意味がありません。なぜなら、後でスレッドを切り替えるよりも早く切り替えるかもしれないからです。 ミューテックスとセマフォはまさにこれを行います。

マルチプロセッサシステムでは、コンテキストを切り替えずに他のプロセッサのスレッドがロックを解除することがあります。 その場合、他のスレッドがロックを解除するまでハングアップしたほうが速いため、スピンロックは長く待つことを期待していない場合に便利です。 あなたがミューテックスで眠りにつく場合、あなたは基本的にあなたがスケジュール変更される前にいくつかの重要なデッドタイムを保証します。

ただし、カーネルコードでは状況が変わります。割り込みハンドラはカーネルの他の部分と共有リソースにアクセスする必要がありますが、スリープすることはできません。 ミューテックスはカーネルをスリープ状態にするので、それらを使用することはできませんが、スピンロックは有用ではありません。なぜなら、ユニプロセッサ上の割り込みハンドラには何も割り込まないからです。

カーネルでは、割り込みハンドラ内でスピンロックし、何もしないようにコンパイルします。 あなたが考えるかもしれないように、それらは完全に捨てられています。 同時に、競合を防ぐために、カーネルの他の部分でスピンロックをかけることで、実際に何かを実行する直前に割り込みを無効にすることができます(カーネルタスクをスケジュールできるため)。 これらのコードは、割り込みハンドラとコードを共有する場合にのみ、(ミューテックスとは対照的に)スピンロックを必要とします。

一般的には、正しいです。ミューテックスを使用している場合、スピンロックは実際にはあまり意味がありません。ミューテックスは時間の無駄が少ないからです。


0


はいといいえ;どんなオペレーティングシステムが存在しているか、存在しているかどうか、そして何を達成しようとしているかによります。

完全なマルチタスクおよびマルチスレッドのオペレーティングシステムをご用意しているのであれば、それを提供するコレクションからプリミティブを選択する必要があります。 各OSには、その慣用句と優先されるメカニズムがあり、これらの規則に従わないとコストがかかる可能性もあります。

フルカーネルから(または、カーネルとデバイスドライバのより深いところへ)進むにつれて、最良のイディオムは低レベルの同期プリミティブを含むことがわかります。

シングルコアCPUでさえも、(原則として)任意の命令のペア間で、またはいくつかのアーキテクチャでは特定のマルチサイクル命令の間でも実行できる割り込みハンドラを持っています。 これは実質的に一種の並行処理ですが、セカンドコアよりは弱いですが、バックグラウンドでフォアグラウンドスレッドと割り込みハンドラとの間で通信を行う場合は同期プリミティブが必要です。 シングルコアでは、フォアグラウンドスレッド間の同期にはもちろんコンテキストスイッチが必要です。

割り込みハンドラで設定された条件またはハードウェアレジスタで設定された条件を待機することは、どちらもシングルコアの単一のフォアグラウンドスレッドがフラグまたはレジスタをスピンするよりも適していない可能性がある場合です。

*編集:*私はこの答えを明確にして、スピンロックの特定のOSの実装よりも一般的に同期について話していることを明確にするようにしました。 この質問は、どのOSがあるか(もしあれば)について具体的ではなく、特定のOSについてもタグ付けされていません。


0


いいえ

より詳細な回答については、コメントと一緒に " http://www.moserware.com/2008/09/how-do-locks-lock.html[ロックをロックするには?