マルチコア PC でシングル スレッド プロセスをリアルタイム優先度に設定するとどうなりますか?

マルチコア PC でシングル スレッド プロセスをリアルタイム優先度に設定するとどうなりますか?

私は Windows 10 オペレーティング システムについて言及していますが、答えは OS に依存しない可能性があると思います。

Windows では、リアルタイム優先レベルは最高の優先レベルであり、たとえばキーボードやマウスの入力を処理するために使用されます。

ネットで読んだところによると:

CPU を集中的に使用するプロセスをリアルタイムに設定すると、OS がこれらの入力を処理するのに十分な CPU 時間を確保できなくなるため、キーボードとマウスが応答しなくなります。

基本的に、リアルタイム優先度に設定されたプロセスは、タスク マネージャーを含め、他のプロセスに CPU を渡すことなく実行されます。何か問題が発生した場合、それを停止することはできません。

たとえば、次の Microsoft の投稿をご覧ください。100% CPUプログラムをリアルタイム優先度に設定すると、要求どおりの結果が得られます

質問:

これらすべての理由から、自分のマシンでこのレベルの優先度をテストするのは不安です。そのため、自分で試してみるのではなく、この質問をしています。また、理論的な答えは、おもちゃのスクリプトで試すよりも将来性があるように思えます。

リアルタイム優先度でシングルスレッドプロセスを実行すると、終了するまで停止せずに実行されることは理解しています。しかし、2 番目のコアがある場合、この 2 番目のコアのおかげで、このプロセスの実行中に PC を使用できるでしょうか?

もしそうなら、これは実用的な応用があります。すぐに結果が必要な計算タスクを 1 つのコアで実行しながら、もう 1 つのコアで PC を使用することができます。

答え1

リアルタイム優先度でシングルスレッドプロセスを実行すると、終了するまで停止せずに実行されることがわかります。

それは誇張です。それが真実ではない理由がいくつかあります。

  1. タスク マネージャーで「リアルタイム優先度」として表示されるものは、実際にはプロセスのスレッドがアクセスできる優先度の範囲です。ある「リアルタイム」プロセスのスレッドが、別の「リアルタイム」プロセスのスレッドよりも高い優先度を持つ可能性があります。私の回答を参照してください。ここただし、「リアルタイム」クラス内のすべての優先度は、他のすべてのクラスの優先度よりも高くなります。

  2. ほとんどのスレッドは、CPU ですべてのコードをスピンさせるわけではないので、優先度に関係なく CPU を 100% 使用することはありません。ほとんどのスレッドは、時々何かを待つ必要があります。通常、I/O が完了するのを待つか、ハード ページ フォールトが解決されるのを待つか、または他のスレッドがそれ以上待つ必要がないことを示すのを待ちます (他のスレッドは同じプロセス内にある場合もあれば、別のプロセス内にある場合もあります)。

  3. ハードウェアデバイスからの割り込み(リアルタイムクロックからの割り込みを含む)の処理の最初の段階は、どれでもスレッドベースのコード。優先度はスレッドの属性であるため、この処理には「優先度」がありませんが、割り込みはスレッドによって処理されません。割り込みは、スレッドベースのコードの優先度に関係なく、スレッドベースのコードよりも優先されます。この処理にかかった時間は、Windows 10 のタスク マネージャーの [詳細] タブで [システム割り込み] として確認できます。

リアルタイム優先クラスは、次の点で他の優先クラスと異なります。

  1. これは、他のすべての優先クラスよりも優先度が高くなります (当然ですが)。

  2. このクラスのプロセスのスレッドは、デフォルトでは、他のクラスのプロセスのスレッドのように、最近のアクティビティに応じて優先順位が自動的に調整されることはありません。(スレッドの優先順位の調整はプログラムでオン/オフを切り替えることができますが、デフォルトでは、非リアルタイム プロセスではオンになっています。)

しかし、2 番目のコアがある場合、この 2 番目のコアのおかげで、このプロセスの実行中に PC を使用できるでしょうか?

おそらくそうです。実際、ハイパースレッディングが有効になっているコアが 1 つしかない場合でも、これは当てはまります。

リアルタイム優先度クラスは、CPU を集中的に使用するプロセスには適していません。イベントにすばやく応答する必要があるタスクには、高い優先度を使用します。これらのイベントに対応する CPU を集中的に使用する作業は、対話型ユーザーの邪魔にならないように、低い優先度、理想的には「通常」以下の優先度で行う必要があります。

答え2

基本的に、リアルタイムは非常に優先度が高く、必要な場合を除いて実行すべきではありません。これは、利用可能なすべてのリソースを使用するプロセスをブーストしようとすると、基本的なプロセス (キーボードとマウスについて言及したように) にも影響が及ぶためです。これにより、貪欲なプロセスを停止することが困難になる可能性があります。

理想的には、優先順位ではなく、何かを使用してコアを割り当てる必要があります。優先順位は CPU 全体に影響します。たとえば、VBox を使用する場合、優先順位を設定するよりも、スレッドの数を高く設定する方が、マルチタスクと同時に使用するにははるかに効果的です。

TL;DR CPU を集中的に使用するタスクでマルチタスクを実行する場合は、タスクにコアを割り当て、リアルタイムの優先順位を上書きしないでください。必要に応じて、仮想化を使用してリソースをセグメント化すると役立ちます。

関連情報