問題タブ [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.
c - スレッド化されたプログラム対後藤
複数のスレッドで構成されるシステムがあります。たとえば、プロセス A、B、および C であり、これらのプロセスは完全に SDL で記述されており、コンパイル後に最終的に C 言語に変換されます。
同じプロセスを持つ同等のシミュレーション環境もあり、1 つのスレッドのみで実行されますが、これらの各プロセスをシミュレートします。基本的に、プロセス A、B、C のそれぞれが異なるオプション セットで再コンパイルされ、どういうわけかすべてが 1 つのプロセスとして機能します (IBM-SDL シミュレーションの典型)。これは理論的には、実際のプロセスの軽量化されたシステムを表し、すべてが 1 つのプロセスとして機能します。このシミュレーション環境では、次の 3 つのファイルが生成されます。たとえば、Ac Bc と Cc です。明らかに、このシミュレーションでは、プロセスをプリエンプションする余地はありません。メッセージ X がプロセス A に到達すると、A はこのシグナルを完全に処理してから次の状態遷移に進み、次のシグナルがシステムに着信したときにのみ次のプロセスが実行されます。
スレッドなしでこのシミュレーション システムにプリエンプションを実装しようとしています。結局のところ、シミュレーションでは、これらのファイルのそれぞれを (いくつかのスクリプトを介して) 編集することができ、特定の信号セットを次々と実行する過程で可能なプリエンプション ポイントを正確に把握しています。
私の質問は次のとおりです:- 条件付きの goto / break ステートメントを挿入し (各 Ac、Bc、および Cc のすべての行を想定した後)、コードの実行中にあるファイルから別のファイルにジャンプする場合、シミュレートされたスレッド環境を実装しますか?
または、ここで何か不足していますか?
私はそれが非常に幅広い質問であることを知っています.OSの知識はあまりありません. また、そのようなシナリオが機能するには多くの条件が考えられることも知っています。しかし、これらの問題を解決する方法を見つけたとしましょう。私の質問はこれに要約されます:-「スマートな」gotoをシングルスレッド環境の複数のスレッドの代わりとして同等に使用できる場合?? 私はシミュレートされた時間で作業しているので、タイミングは私にとって問題ではありません。システム負荷などは関係ありません。これらの各ファイル Ac、Bc、および Cc の各ステップの後に制御関数呼び出しを追加することを考えていました。この制御関数では、戻るか、他の場所にジャンプして別のファイルから実行を継続するかを確認できます。このようなアプローチでは、どのような実装上の問題に直面するでしょうか?
ruby - Railsアプリケーションがガベージコレクターを実行するのはなぜですか?
すべてのRackアプリケーションサーバー( UnicornとPassengerの経験があります)は、作成時にすべてのワーカーに対して単一のプロセスを作成しており、その状態は「凍結」されていたと確信していました。
アプリサーバーが処理要求を受信するたびに、マスタープロセスからフォークされ、フォークされたプロセスへのそれ以降のすべての変更は元のプロセスから分離されます。それらはコピーオンライトの最適化の恩恵を受けており、リクエストの処理によって「損傷」しても安全です。環境へのすべての変更は、とにかくプリエンプトされる単一のプロセスにのみ影響します。
RoRアプリケーションスタックの私のビジョンが正しければ、単一のリクエストの処理に多くの時間とメモリがかかる場合を除いて、ガベージコレクションはほとんど必要ありません(通常はそうではありません)。
一方、NewRelicで行われたGC測定についての質問とその答えから、私は完全に間違っているに違いないと結論付けました。
誰かがこのプロセスを明確にすることができますか?
monitoring - 詳細なマルチタスク監視
私はコンピューターのモデルを組み立てて、その上でいくつかのシミュレーションを実行しようとしています(学校の課題の一部)。これは非常に単純なモデルです。CPU、ディスク、およびCPUの使用とディスクへのアクセスを交互に行うユーザープロセスを生成するプロセスジェネレーターです(Process Explorerによると、次に使用するため、さまざまなシステムプロセスを省略することにしました。 CPU時間なし-これは、Windows7で実行されているMicrosoftProcessExplorerツールに基づいています。そして、これは私が立ち寄ったところです。
さまざまなプロセスがディスクに対して読み取り/書き込みを行う頻度、一度に実行するデータの量、およびCPUの使用に費やす時間に関する関連データを取得する方法がわかりません。PCでの一般的な操作(音楽/映画の再生、インターネットの閲覧、ゲームの再生、Officeの操作、ビデオ編集など)の統計を取得したいとします...そのようなデータを収集する方法さえありますか?
プロセスを切り替えるために
15msのタイムクォンタムを持つRRを使用してプリエンプティブマルチタスクをシミュレートしています。これは次のようになります。
そして今、2つのオプションが発生します:
a)プロセスはCPUを再び取得する前、または何もすることがない場合はユーザー入力を取得する前にただ座って待機しますb)ディスクから要求されたデータを処理し、そのデータが出るまでキューに再参加しません利用可能です
そして、モデルのa)とb)の間の決定は、確率に基づいて行われるようにしたいと思います。たとえば、a)の場合は90%、b)の場合は10%です。しかし、特定のタイプのプロセスでこれらのパーセンテージを少なくとも少し現実的にする方法がわかりません。また、プロセスは通常、一度にどのくらいのデータにアクセスできますか?
これに利用できるヒント、ソース、ユーティリティはありますか?
c - set_current_state を使用してカーネルでスリープする
http://www.linuxjournal.com/article/8144を読んで、次の状況について考えています。
では、プロセスをスリープ状態に設定する 4254 行目の直前に kthread_stop が呼び出され、その行の直後に実際にプリエンプト/スケジュールが設定され、プロセスも実際にスリープ状態に移行した場合はどうなるでしょうか。
この場合、ウェイクアップ コールは状態を変更する直前に受信され (したがって影響はありません)、オペレーティング システムの通常の動作では、実際に何かを確認する前にスリープ状態になります。
おそらく、次の 2 つのオプションのいずれかが欠けていると思います。 set_current_state 呼び出しの後、schedule() 呼び出しの前。
ご協力ありがとうございます。
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 カーネルに対してまだ有効かどうかを確認できますか?
algorithm - 非先制的 最早締切優先スケジューリング
タスク スケジューラに取り組んでおり、EDF スケジューリングを使用したいと考えています。スケジュールする必要があるタスク セットには、期限がその期間と等しいタスクのみが含まれており、タスクは定期的にスケジュールする必要があります。私が抱えている問題は、実行を開始するとタスクを中断できないことです。
EDF が最適なスケジューリング アルゴリズムであるのは、タスクが単一のプロセッサでプリエンプティブにスケジュールされる場合のみであることを知っているので、タスク セットを使用してタスク セットをスケジュールできることを確認するために、タスクに課す可能性のあるテストまたは制約があるかどうか疑問に思っていました。非プリエンプティブ EDF。
どんな助けでも大歓迎です。ありがとうございました
kernel - カーネルコードがスピンロックを保持した後、Linux がカーネルプリエンプションを無効にするのはなぜですか?
私は Linux を初めて使用し、Rubini & Corbet による Linux デバイス ドライバーの本を読んでいます。に関連する 1 つのステートメントで混乱していspinlocks
ます。本の状態
非プリエンプティブ ユニプロセッサ システムがロックでスピンに入った場合、永久にスピンします。他のスレッドが CPU を取得してロックを解放することはできません。このため、プリエンプションが有効になっていないユニプロセッサ システムでのスピンロック操作は、IRQ マスキング ステータスを変更するものを除いて、何もしないように最適化されています。
さらに本の状態
カーネル プリエンプションのケースは、スピンロック コード自体によって処理されます。カーネル コードがスピンロックを保持している場合は常に、関連するプロセッサでプリエンプションが無効になります。単一プロセッサ システムでも、競合状態を回避するために、この方法でプリエンプションを無効にする必要があります。
質問 : ユニプロセッサ システムで、カーネル コード (ユーザー プロセスに代わって実行) がスピンロックを保持するたびにカーネル プリエンプションが無効になっている場合、別のプロセスが実行する機会を得て、スピンロックを取得しようとする可能性はありますか? カーネル コードがスピンロックを保持するたびに Linux カーネルがカーネル プリエンプションを無効にするのはなぜですか?