問題タブ [preemption]
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.
worker - Linux は、CPU を占有しているプロセスをどのように検出し、プリエンプトするのではなく削除する必要がありますか?
作業キューで、関数がシステムを占有している場合 (例: 無限ループを実行している)、カーネルはそれが占有していることをどのように認識し、作業を横取りするかキャンセルする必要がありますか?
linux - Linux 2.6 スケジューリングとプリエンプション - preempt_count の使用
質問の前にちょっと雑談。Linux 2.4 カーネルはプリエンティブではないため、カーネル モードでシステム コールを処理しているときにコンテキスト スイッチが必要な場合は、フラグを立てるために set_need_resched のみを実行し、ユーザー モードに戻るときに、フラグを付けてコンテキスト切り替えを行います。
これをプリエンプティブ カーネルを持つ Linux 2.6 と比較してみましょう。カーネル 2.4 をそのまま使用して、set_need_resched (フラグを上げる) を schedule() (再スケジューリングのディレクティブ実行) に変更することはできません。そのため、Linux カーネル 2.6 にはカウンター preempt_count があり、spin_lock() で毎回増加し、で減少します。 spin_unlock()。
実際には、このフィールド「preempt_count」によって、カーネルをプリエンプトできるかどうかが決まります。たとえば、クロック割り込みからの復帰で、次の条件の場合:
が true の場合、カーネルは context-switch を実行します。
問題は、スピンロック タイプのロックが保持されているときに、Linux 2.6 のカーネルがプリエンプションを防止する理由です。
カーネルがプリエンプションを防げなかった場合に起こりうるシナリオは何ですか? できるだけ具体的な例を教えてください。
ありがとうございました。
go - スケジュールされたティック内で時間がかかりすぎる関数の実行に割り込みを強制する方法
このスケジューラーを作成しましたが、入力時間間隔よりも時間がかかるf
場合にその入力関数を「kill」することができません。f
recurring
それf
がスレッドではなくプロセスである場合、私が探しているのは、ある種の定義済みのハード プリエンプションである可能性があります。
そのf
定義は、私が制御できないものです。これは、バッチ実行中に複数のデータベースからデータを処理する ETL ジョブを表しています。それf
は書かれてgo
おり、正常に動作しますが、実行に時間がかかりすぎる何らかの制御が必要です。
私f
はアトミックであることを知っているので、実行の最後にデータベースを変更するかどうかのどちらかです。したがって、時間がかかりすぎる場合は、「殺す」のが安全であると見なすことができます。
何が起こっているかを見るために、私はこのテストを書きました: