問題タブ [spinlock]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
device-driver - デバイスドライバーのスピンロック
デバイスドライバーの場合のスピンロックの正確な使用法を誰でも説明できますか? スピンロックを見た多くの割り込みハンドラールーチンのように、私は混乱しています。スピンロックは待機中です。他の割り込みで遅延が発生する可能性があります。可能であれば、スピンロックを使用できるデバイス ドライバーのシナリオをいくつか挙げてください。
私はこの分野に不慣れです。あなたの助けは私にとって最初のブーストになります。
multithreading - スレッド数=ハードウェア並列処理の場合のミューテックスとスピンロック
専用サーバーで実行されている最適なスレッド数のプログラムを検討してください。1つのスレッドがロックされている場合、他のスレッドは(ほとんど)CPU時間を待機しません。スピンロックは、そのような状況で考えられるすべての場合に、ミューテックスよりも優れたパフォーマンスを提供しますか?
[編集]いくつかの説明:スレッド間のCPU時間の競合がないため、スレッドは他のスレッドのパフォーマンスに影響を与えることなくスピンロックを使用できます。スピンロックは、十分に重い可能性のある待機モードに切り替わりません(少なくとも、Windowsでは、Linuxでのパフォーマンスを確認してください)。
multithreading - x86 一時停止命令はスピンロックでどのように機能しますか? また、他のシナリオで使用できますか?
このpause
命令は通常、他のスレッドがスピンロックを所有している場合に、スピンロックをテストするループで使用され、タイトなループを軽減します。一部の NOP 命令に相当すると言われています。スピンロックの最適化で正確にどのように機能するか教えてもらえますか? NOP 命令でさえ CPU 時間の無駄に思えます。CPU使用率が低下しますか?
別の質問は、他の同様の目的で一時停止命令を使用できるかどうかです。たとえば、新しいノードを取得するためにいくつかの場所 (キューなど) をスキャンし続けるビジー スレッドがあります。ただし、キューが空で、スレッドが単に CPU 時間を無駄にしている場合があります。スレッドをスリープさせ、他のスレッドで起動することもできますが、スレッドは重要であるため、スリープさせたくありません。
CPU 使用率を軽減する目的で命令作業を一時停止できますか? 現在、物理コアの 100% の CPU を使用していますか?
x86 - Linux / SMPスピンロックは不必要に遅いですか?
カーネル同期の章を読んUnderstanding the Linux kernel (Bovet & Cesati),
でいると、スピンロック取得コードは次のように要約されます。
今、私は当初、ネストされたループを持つことは無駄に思え、次のようなものを実装できると考えていました。
これははるかに簡単です。lock
ただし、他のCPUに影響を与え、単純なCPUよりもタイミングbtsl
が大きいため、なぜそれを行ったのかがわかりtestb
ます。
頭を動かすことができなかったのは、その後のスピンロックのリリースです。この本は、それが次のことをもたらすと述べています:
私の質問は基本的になぜですか?lock/mov-immediate
コンボの方が速いようです。
カーネルにはバグがないという規則に従って(カーネル内の他の多くの場所で想定されている)、古い状態は1になるため、古い状態をキャリーフラグにする必要はありません(そうはなりません)。まだ取得していない場合は、リリースしようとしています)。
そして、少なくとも386では、mov
aはaよりもはるかに高速です。btrl
だから私は何が欠けていますか?
後のチップでそれらの命令のタイミングを変更しましたか?
本が印刷されてからカーネルは更新されましたか?
その本はまったく間違っている(または簡単な説明を示している)のですか?
より高速な命令では満たされないCPU間の同期に関する他の側面を見逃したことがありますか?
linux-kernel - マルチプロセッサ システムで CPU レジスタの状態を保護するためにすべての割り込みを無効にする
コード部分 (カーネル モード) で、他の誰も CR0 レジスタを変更/チェックできないようにする必要があります。1 プロセッサのシステムでは、割り込みを無効にするのが最善だと思います。ただし、マルチプロセッサ システムでは:
コード セクション中にすべてのプロセッサからのすべての割り込みを無効にする方法はありますか (スピンロック メカニズムなどを使用)。
これは必要ですか?マルチプロセッサ システムでレジスタを変更する場合
cr0
、レジスタは現在の CPU に対してのみ変更されると思いますか? --> では、現在の CPU に対してのみ割り込みを無効にするだけで十分でしょうか? --> (同じシステム上の) 他の CPU から別の CPU のレジスタをチェック/変更する方法はありますか?
あなたの答えに感謝します(おおよその英語で申し訳ありません)
ジェローム。
powerpc - PPC の x86 PAUSE 命令と同等
x86 の PAUSE 命令に相当するものはありますか? これはビジーな待機ループ内に配置され、特に SMT マシンや PowerPC でパフォーマンスを向上させますか?
.net - .NETSpinLockがThread.BeginCriticalSectionを解放しない
.NETリフレクターを使用すると、SpinLock構造体がThread.BeginCriticalRegionを呼び出し、Thread.EndCriticalRegionを呼び出さない場合が多いことがわかりました。たとえば、パブリック関数SpinLock.Enter(ref bool lockTaken)(.NET 4.0)では、次のようになります。
別のケースでは、SpinLock.ExitはThread.BeginCriticalRegionを呼び出さずにThread.EndCriticalRegionを呼び出しているようです。
したがって、質問:Begin / EndCriticalRegionへの呼び出しのバランスをとらないことで問題が発生しますか?
pthreads - sem_waitを回転させないようにする方法はありますか?
現在、クロスプラットフォームのタスクスケジューラに取り組んでいますが、セマフォの待機中にsem_waitが回転する問題が発生しています。Windowsでは、WaitForSingleObjectを使用しています。これは、待機中にスレッドを生成します。これは、私が望んでいることです。ただし、sem_waitを使用すると、スレッドがスピンするだけで、非効率的で不要です。単に回転するのではなく、sem_waitにスレッドを生成させる方法はありますか?
ありがとう
synchronization - ミューテックスの代わりにスピンロックを使用する必要があるのはいつですか?
どちらも同じ仕事をしていると思いますが、どちらを同期に使用するかをどのように決定しますか?