問題タブ [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.
linux-kernel - マルチコアシステムのクリティカルセクションを保護するためにスピンロックが機能しない
マルチコアシステムでシステムデッドロックを引き起こしているキャラクターデバイスドライバーがあります。書き込み呼び出しには、スピンロック(spin_lock_irqsave)によって保護されたクリティカルセクションがあります。ISRは、タスクを完了するためにもこのロックを取得する必要があります。書き込みが別のコアでクリティカルセクションを実行しているときにISRが1つのコアで呼び出されると、ウォッチドッグタイマーがISRのコアでのハードロックアップを検出したためにパニックが発生します。書き込みプロセスは、実行を終了するために戻ることはありません。書き込みプロセスはそのコアで実行を継続するべきではありません。ロックを解除すると、ISR内の他のコアが実行できるようになりますか?
クリティカルセクションを完了するには、約5usが必要です。ハードロックは5秒後に発生します。
私は何か間違ったことをしていると思いますが、何がわからないのです。
助けに感謝します!
c - Linux カーネル: Spinlock SMP: spin_lock_irq SMP バージョンに preempt_disable() があるのはなぜですか?
Linux カーネルの元のコードは次のとおりです。
ローカルIRQが無効になった後、現在のパスをプリエンプトできる実行パスはないと思います。
すべての一般的なハード IRQ が無効になっているため、softirq は発生せず、スケジュール ホイールをキックするティックもありません。現在の道は安全だと思います。では、なぜあるのpreempt_disable()
ですか?
linux - futexと競合するときの高いシステムCPU使用率
Linuxのfutexが競合する場合、システムはスピンロックに多くの時間を費やすことがわかりました。これは、futexが直接使用されていない場合でも、malloc / free、rand、glib mutex呼び出し、およびfutexを呼び出すその他のシステム/ライブラリ呼び出しを呼び出す場合にも問題になることに気付きました。この動作を取り除く方法はありますか?
カーネル2.6.32-279.9.1.el6.x86_64でCentOS6.3を使用しています。また、kernel.orgから直接ダウンロードした最新の安定したカーネル3.6.6も試しました。
元々、この問題は16GBのRAMを搭載した24コアサーバーで発生していました。プロセスには700のスレッドがあります。「perfrecord」で収集されたデータは、スピンロックが__lll_lock_wait_privateおよび__lll_unlock_wake_privateから呼び出されたfutexから呼び出され、CPU時間の50%を消費していることを示しています。gdbを使用してプロセスを停止すると、バックトレースは、__lll_lock_wait_private__lll_unlock_wake_privateへの呼び出しがmallocから行われ無料であることを示していました。
私は問題を減らそうとしていたので、スピンロックの問題を引き起こしているのは実際にfutexであることを示す簡単なプログラムを作成しました。
8つのスレッドを開始し、各スレッドは次のことを行います。
私はこれを十分なRAMを備えた8コアマシンで実行しています。
「トップ」を使用して、マシンが10%アイドル、ユーザーモードで10%、システムモードで90%であることを確認しました。
「perftop」を使用して、私は次のことを観察しました。
futexコードはfutex待機キューを取得する必要があるため、このコードはスピンロックでしばらく時間を費やすと思います。また、このコードスニペットでは、ユーザースペースで実行されているコードがほとんどないため、コードがシステム内である程度の時間を費やすことも予想されます。ただし、特にこのcpu時間が他の有用な作業を行うために必要な場合、スピンロックに費やされる時間の50%は過剰であるように思われます。
c - Cのスピンロックなしのノンブロッキングソケットアクセプト
カスタム停止信号が送信されるまで、接続をリッスンする (接続を受け入れてワーカー スレッドに渡す) 小さなサーバーを作成しています。
ブロッキング ソケットを使用すると、カスタム停止シグナルが送信されたときに、メインの受け入れループを中断できません。ただし、ノンブロッキング ソケットでのビジー ウェイト/スピンロック ループは避けたいと考えています。
私が望むのは、接続が受信されるか停止信号が送信されるまで、メインの受け入れループがブロックされることです。
これは Linux の C で可能ですか?
どうもありがとう。
linux-kernel - Linuxカーネルダンプ:スピンロックの所有者を取得する方法
24コアシステムでLinuxカーネルダンプを生成しました。ほとんどのタスクはスピンロックでスタックしています。スピンロックの所有者を取得する方法はありますか?
c - spinlock_t は最初の使用時にすでにロックされています
こんにちは、初めてカーネル (2.6) をプログラミングしていますが、スピンロックの使用に問題があります。
構造体 (ibrid リスト ハッシュテーブル) を外部化するこのシステム コール (inserisci_nodo) を追加し、この構造体にノード (ペルソナ) を追加しようとしています。ノードが既に存在する場合は更新されます。
最初の「更新」で問題が発生しました。実際、すべての新しいノードを挿入しようとすると機能します。しかし、既存のノードを挿入しようとすると、これはすでにロックされているようです。理由がわかりません。
これがコードです。
コードのイタリア語で申し訳ありませんが、コードに英語のコメントを追加します。
これらは 2 つの構造 (ハッシュテーブルと「ペルソナ」(ノード)) です。
「lookup(key)」と「hash(key)」は、構造体からノードを取得するための 2 つの単純な関数です。
私はあなたがそれについての考えを持っていることを願っています:)
さよなら!
gcc - gccでスピンロックを使用する
gcc 4.6.3でpthread_spinlock_tを使用するにはどうすればよいですか?コンパイル時にどのフラグを指定する必要がありますか?私はUbuntu12.04を使用しています!
ありがとう
deadlock - 小さな組み込みシステム上のIRQのスピンロック
オペレーティングシステムを使用せずに、ARMマイクロコントローラ上に小さな組み込みシステムを開発しています。いくつかの異なるタイプの割り込みが発生し(ボタンの押下、AからDへの変換、タイマーなど)、単一のスレッドが実行されます。
処理するイベントのFIFOキューが必要です。ここで、各割り込みサービスルーチンはそのイベントをキューに追加し、メイン(および唯一の)スレッドはイベントをキューから削除して処理します。割り込みサービスルーチンでキューデータ構造に明らかにアクセスすることは危険ですが、メインスレッドにロックがあり、割り込みが発生した場合、ISRはロックを永久に待機するため、スピンロックによってデッドロックが発生します。
もちろん、メインスレッドがキューをいじっている間は割り込みを無効にできることはすでに知っていますが、これは理想的ではありません。
ここに進むための最良の方法は何ですか?
ありがとうA
linux-kernel - SMP 対応の Linux カーネルを Uni プロセッサ (ARM Cortex A8 ベースの SOC) で実行すると、パフォーマンスが低下しますか?
これは、ARM-Cortex 8 ベースの SoC で SMP 対応の Linux を実行しているという些細な観察から生じた 2 つの疑問です。最初の部分は、Uni プロセッサ システムでの SMP と非 SMP Linux カーネルのパフォーマンス (メモリ空間/CPU 時間) の違いについてです。違いはありますか?
後半は、Spinlock の使用についてです。私の知る限り、単一プロセッサの場合、スピンクロックはヌープです。CPU は 1 つしかなく、その上で (一度に) 1 つのプロセスしか実行されないため、ビジー ループの他のプロセスはありません。したがって、同期のために、重要なセクションを保護するために割り込みを無効にする必要があります。私のこの理解は正しいですか?
この議論では、ドライバーの移植性要因は無視してください。
c - 最新 (3.0.0 以降) の Linux カーネルにおける CONFIG_SMP、Spinlocks、および CONFIG_PREEMPT 間のリンクを理解する
完全なコンテキストを提供するために、ユニプロセッサである ARM Cortex A8 ベースの SoC で SMP Linux (3.0.1-rt11) を実行しているという観察から私の議論を始めました。SMP サポートを無効にすることでパフォーマンスが向上するかどうか知りたいと思っていました。はいの場合、ドライバーと割り込みハンドラーにどのような影響がありますか。
いくつか読んだところ、スピンロックとカーネル プリエンプションという 2 つの関連トピックに出くわしました。私はもう少しグーグルと読書をしましたが、今回は古くて矛盾した答えがほとんどありません. それで、stackoverflowを試してみようと思いました。
私の疑問/質問の起源は、Linuxデバイスドライバーの第3版第5章のこのパラです。
スピンロックは、その性質上、マルチプロセッサ システムでの使用を意図していますが、プリエンプティブ カーネルを実行するユニプロセッサ ワークステーションは、並行性に関する限り、SMP のように動作します。非プリエンプティブ ユニプロセッサ システムがロックでスピンに入った場合、永久にスピンします。他のスレッドが CPU を取得してロックを解放することはできません。このため、プリエンプションが有効になっていないユニプロセッサ システムでのスピンロック操作は、IRQ マスキング ステータスを変更するものを除いて、何もしないように最適化されています。コードが SMP システムで実行されるとはまったく予想していない場合でも、プリエンプションのために、適切なロックを実装する必要があります。
私の疑問/質問は次のとおりです。
a) Linux カーネルはデフォルトでカーネル空間でプリエンプティブですか? はいの場合、このプリエンプションはプロセスのみに制限されていますか、それとも割り込みハンドラもプリエンプトできますか?
b) Linux カーネル (ARM 上) はネストされた割り込みをサポートしていますか? はいの場合、各割り込みハンドラー (上半分) は独自のスタックを持ちますか、それとも同じ 4k/8k カーネル モード スタックを共有しますか?
c) SMP ( CONFIG_SMP
) とプリエンプション ( CONFIG_PREEMPT
) を無効にした場合、ドライバーと割り込みハンドラーのスピンロックは意味がありますか?
d) 上半分の実行中に発生した割り込みをカーネルがどのように処理するか、つまり、それらは無効化またはマスクされますか?
いくつかのグーグルの後、私はこれを見つけました:
CONFIG_SMP および CONFIG_PREEMPT なしでコンパイルされたカーネルの場合、スピンロックはまったく存在しません。これは優れた設計上の決定です。他の誰も同時に実行できない場合、ロックを設定する理由はありません。
カーネルが CONFIG_SMP なしでコンパイルされているが、CONFIG_PREEMPT が設定されている場合、スピンロックはプリエンプションを無効にするだけで、競合を防ぐのに十分です。ほとんどの場合、プリエンプションは SMP と同等と考えることができ、個別に心配する必要はありません。
しかし、ソースにはカーネルのバージョンや日付はありません。最新の Linux カーネルに対してまだ有効かどうかを確認できますか?