問題タブ [smp]
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.
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 カーネルに対してまだ有効かどうかを確認できますか?
language-agnostic - アトミック操作はハードウェア レベルでどのように実装されますか?
アセンブリ言語レベルの命令セット アーキテクチャでは、比較とスワップなどの操作が提供されます。ただし、チップがこれらの保証をどのように提供できるかはわかりません。
私が想像するように、命令の実行は
- メモリから値をフェッチする
- 値を比較する
- 比較に応じて、別の値をメモリに保存する可能性があります
最初のコアがメモリアドレスをフェッチした後、新しい値を設定する前に、別のコアがメモリアドレスにアクセスするのを妨げているのは何ですか? メモリコントローラはこれを管理しますか?
編集: x86 の実装が秘密である場合は、プロセッサ ファミリがそれをどのように実装しているかを知りたいです。
linux-kernel - NUMA および SMP 上の Linux スケジューラ
schedule() 関数のコピーが各プロセッサで実行されるのか、それともプロセッサごとに 1 つの schedule() が実行されるだけなのかを知りたかったのです。
各プロセッサ/コアで実行されている schedule() のコピーがある場合、プロセスは特定の CPU/CPU ランキューにどのようにディスパッチされますか。ロードバランサーの仕事ですか?すべての CPU に対して実行されているロード バランサーは 1 つだけですか? それとも、フラグ/通信方式を使用して分散方式で実行されていますか?
ps- クラスのスケジューリングなどの作業は知っていますが、さまざまなランキュー間でのプロセスの分散を理解するのに苦労しています。
c++ - QAtomicInt をメモリ フェンスとして使用する
再びロックフリーについて何か...
単純な配列ベースの整数の循環 FIFO を実装するとします。FIFO は、2 つのスレッドのシングル プロデューサー、シングル コンシューマーによってアクセスされます。読み取りインデックスと書き込みインデックスは、アイテムがアクセスされた後に常に更新されます。単一の CPU では、インデックスへの書き込みアクセス権を持つスレッドは 1 つだけなので、これは安全です (インデックスの更新操作がアトミックであると仮定します)。SMP マシンでは、キャッシュと再配列のために両方の CPU がインデックスの異なる表現を参照する可能性があるため、問題が発生する可能性があります。
QTには、メモリフェンスも実装するクロスプラットフォームのアトミック変数があります.QAtomicIntを使用すると、FIFO実装SMPが安全になりますか、それとも何かを見落としていますか?
android - wake_up イベントが時間内に発生しても、wait_event_interruptible_timeout は常に期限切れになります
プリエンプティブな Linux 3.0 カーネルを搭載した Android 組み込みプラットフォーム (Exynos5dual ベース) での wait_event と wake_up の奇妙な動作について質問があります。非プリエンプティブ カーネル (すべてのバージョン) を使用する通常の SMP ラップトップでは発生しません。
従来のスリーパー/ウェイカー シナリオの Linux デバイス ドライバーがあり、次のようになります。
フラグのすべての読み取りと書き込みはアトミックであり、アトミック bitops (カーネル セット/テスト ビット) から揮発性の atom_t まで、atomic_t vars を使用した各読み取り/書き込み用のメモリ バリアの使用に移行しました (これによると)。
TaskA が実際に待機を開始した場合 (wait_event_* カーネル関数が最初に条件をチェックするため、常にそうであるとは限りません)、フラグの値が変更され、wake_up() が呼び出されたときに taskB によってウェイクアップされるのではなく、完全なタイムアウトを待機します。
2 つのタスクが異なるコアで発生していると思われます。Core1 は、wait_event_..() の後にディープ スリープし、Core2 で発生する wake_up_interruptible() によってウェイクアップできません。
これが本当なのか、それとも他の何かが原因なのか、誰か知っていますか?
注: スリーパーのタスク構造体 ptr を保存してから、wake_up_interruptible() の前に (およびそれに加えて) wake_up_process (saved_ptr) を実行すると、この問題は解決するようです。これは最適とは言えず、もっと良い方法はないかと考えています。
windows - Windows でのピン プロセッサ CPU アイソレーション
私が主に働いている Linux では、CPU アイソレーションと呼ばれる手法を使用しています。これは、プロセスをプロセッサに効果的にロックし、プロセッサが他の何かを実行するのを防ぎます。私たちのカーネル担当者は、割り込みを処理するためにいくつかの魔法を使いました。
Windows で私が見つけた最も近いものは、プロセス/スレッドをプロセッサにバインドするように見えるアフィニティの概念です。ただし、プロセッサがそのプロセス/スレッドのみを実行していることを保証するものではありません。つまり、コンテキストの切り替えやその他のジッターが発生する可能性があります。
半決定論的な実行時間のために Windows で CPU を分離する方法はありますか?
assembly - APIC を使用して IPI を作成し、x86 アセンブリで SMP の AP をウェイクアップする方法を教えてください。
ブート後の環境 (OS なし) で、BSP (最初のコア/プロセッサ) を使用して AP (他のすべてのコア/プロセッサ) の IPI を作成するにはどうすればよいですか? 基本的に、あるコアから開始するときに、他のコアの命令ポインタをどのように起動して設定するのですか?
linux - percpu ポインターは Linux カーネルにどのように実装されていますか?
マルチプロセッサでは、各コアが独自の変数を持つことができます。それらは同じプロセスにあり、同じ名前を持っていますが、異なるアドレスの異なる変数だと思いました。
しかし、カーネルはこれをどのように実装しているのでしょうか? すべてのpercpuポインターをデポジットするためにメモリの一部を分配し、シフトなどでポインターを特定のアドレスにリダイレクトするたびに?
linux - Linuxカーネルのメモリバリアはどのように使用されていますか
次のように、カーネル ソース Documentation/memory-barriers.txt に図があります。
介入がなければ、CPU 1 によって発行された書き込みバリアにもかかわらず、CPU 2 は CPU 1 のイベントを事実上ランダムな順序で認識する可能性があります。
書き込みバリアがあるため、わかりません。C = &B が実行されたときにストアが有効になる必要があります。つまり、Ce B が 2 に等しくなったときです。 C は &B ですが、なぜ B を 7 と認識するのでしょうか。私は本当に混乱しています。
kernel - Linux カーネルの BUG() 呼び出しでカーネルがハングしない
古いバージョンの Linux コード (2.6.27) を実行しています。CONFIG_BUG=y と HAVE_ARCH_BUG が定義されています。そのため、asm-generic の代わりに asm-x86/bug.h で BUG() 定義を使用しています。テスト モジュール (BUG() 呼び出しのみ) を insmod すると、ボックスがクラッシュしないことがわかります。コンソールにアクセスできます。これは SMP システムなので、期待できます。私が持っている質問は、設計上、BUG() はパニックのようにボックスをハングアップすることになっていましたか? もしそうなら、それがこのカーネルにない理由は何ですか?
thxムラリ