優先度のスケジュール設定

スレッドは、スケジュールの優先順位に基づいて実行 するようにスケジュールされます。 各スレッドにはスケジュールの優先順位が割り当てられます。 優先度レベルの範囲は、0 (最も低い優先度) から 31 (最も高い優先度) です。 優先度を 0 にできるのは、ページ 0 のスレッドだけです。 (ゼロページ スレッドは、実行する必要がある他のスレッドがない場合に空きページをゼロにするシステム スレッドです)。

システムは、同じ優先度を持つすべてのスレッドを等しいとして扱います。 システムは、優先度が最も高いすべてのスレッドにラウンドロビン方式でタイム スライスを割り当てます。 これらのスレッドを実行する準備ができていない場合、システムはラウンドロビン方式でタイム スライスを次に優先度の高いすべてのスレッドに割り当てます。 優先度の高いスレッドを実行できるようになると、システムは優先度の低いスレッドの実行を停止し (タイム スライスの使用を終了できません)、優先度の高いスレッドにフル タイム スライスを割り当てます。 詳細については、「 コンテキスト スイッチ」を参照してください。

各スレッドの優先度は、次の条件によって決まります。

  • そのプロセスの優先度クラス
  • プロセスの優先度クラス内のスレッドの優先度レベル

優先度クラスと優先度レベルが組み合わされて、スレッドの 基本優先度 が形成されます。 スレッドの動的優先度の詳細については、「 優先度ブースト」を参照してください。

Priority クラス

各プロセスは、次のいずれかの優先度クラスに属します。

IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS

既定では、プロセスの優先度クラスはNORMAL_PRIORITY_CLASS。 CreateProcess 関数を使用して、子プロセスの作成時に優先度クラスを指定します。 呼び出し元のプロセスがIDLE_PRIORITY_CLASSまたはBELOW_NORMAL_PRIORITY_CLASS場合、新しいプロセスはこのクラスを継承します。 GetPriorityClass 関数を使用して、プロセスの現在の優先度クラスを決定し、SetPriorityClass 関数を使用してプロセスの優先度クラスを変更します。

スクリーン セーバーやディスプレイを定期的に更新するアプリケーションなど、システムを監視するプロセスでは、IDLE_PRIORITY_CLASSを使用する必要があります。 これにより、優先度が高くないこのプロセスのスレッドが、優先度の高いスレッドに干渉するのを防ぐことができます。

HIGH_PRIORITY_CLASSは注意して使用してください。 スレッドが長時間にわたって最も優先度の高いレベルで実行されている場合、システム内の他のスレッドはプロセッサ時間を取得しません。 複数のスレッドが同時に高い優先度で設定されている場合、スレッドの有効性は失われます。 優先度の高いクラスは、タイム クリティカルなイベントに応答する必要があるスレッド用に予約する必要があります。 アプリケーションが優先度の高いクラスを必要とする 1 つのタスクを実行し、その他のタスクが通常の優先度である場合は、 SetPriorityClass を使用してアプリケーションの優先度クラスを一時的に上げます。次に、タイム クリティカルなタスクが完了した後にそれを減らします。 もう 1 つの方法は、優先度の高いプロセスを作成し、すべてのスレッドがほとんどの時間ブロックされ、重要なタスクが必要な場合にのみスレッドを起動することです。 重要なポイントは、優先度の高いスレッドを短時間実行し、実行する時間が重要な作業がある場合にのみ実行する必要があるということです。

マウス入力、キーボード入力、およびバックグラウンド ディスクフラッシュを管理するシステム スレッドが中断されるため、REALTIME_PRIORITY_CLASSはほとんど使用しないでください。 このクラスは、ハードウェアと直接通信するアプリケーションや、中断が制限されている必要がある簡単なタスクを実行するアプリケーションに適しています。

優先度レベル

各優先度クラス内の優先度レベルを次に示します。

THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_TIME_CRITICAL

すべてのスレッドは、THREAD_PRIORITY_NORMALを使用して作成されます。 これは、スレッドの優先度がプロセス優先度クラスと同じであることを意味します。 スレッドを作成したら、 SetThreadPriority 関数を使用して、プロセス内の他のスレッドに対する優先順位を調整します。

一般的な方法は、プロセスの入力スレッドにTHREAD_PRIORITY_ABOVE_NORMALまたはTHREAD_PRIORITY_HIGHESTを使用して、アプリケーションがユーザーに対して確実に応答できるようにすることです。 バックグラウンド スレッド (特にプロセッサ負荷の高いスレッド) は、必要に応じてプリエンプトできるように、THREAD_PRIORITY_BELOW_NORMALまたはTHREAD_PRIORITY_LOWESTに設定できます。 ただし、優先度の低い別のスレッドを待機しているスレッドがタスクを完了する場合は、待機中の優先度の高いスレッドの実行をブロックしてください。 これを行うには、 待機関数クリティカル セクション、または Sleep 関数、 SleepEx、または SwitchToThread 関数を使用します。 これは、スレッドでループを実行する場合に推奨されます。 それ以外の場合、優先順位の低いスレッドがスケジュールされていないため、プロセスがデッドロックになる可能性があります。

スレッドの現在の優先度レベルを確認するには、 GetThreadPriority 関数を 使用します。

基本優先度

プロセス優先度クラスとスレッド優先度レベルが組み合わされ、各スレッドの基本優先度が形成されます。

次の表は、プロセス優先度クラスとスレッド優先度値の組み合わせの基本優先度を示しています。

プロセス優先度クラス スレッドの優先度レベル 基本優先度
IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 2
THREAD_PRIORITY_BELOW_NORMAL 3
THREAD_PRIORITY_NORMAL 4
THREAD_PRIORITY_ABOVE_NORMAL 5
THREAD_PRIORITY_HIGHEST 6
THREAD_PRIORITY_TIME_CRITICAL 15
BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 4
THREAD_PRIORITY_BELOW_NORMAL 5
THREAD_PRIORITY_NORMAL 6
THREAD_PRIORITY_ABOVE_NORMAL 7
THREAD_PRIORITY_HIGHEST 8
THREAD_PRIORITY_TIME_CRITICAL 15
NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 6
THREAD_PRIORITY_BELOW_NORMAL 7
THREAD_PRIORITY_NORMAL 8
THREAD_PRIORITY_ABOVE_NORMAL 9
THREAD_PRIORITY_HIGHEST 10
THREAD_PRIORITY_TIME_CRITICAL 15
ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 8
THREAD_PRIORITY_BELOW_NORMAL 9
THREAD_PRIORITY_NORMAL 10
THREAD_PRIORITY_ABOVE_NORMAL 11
THREAD_PRIORITY_HIGHEST 12
THREAD_PRIORITY_TIME_CRITICAL 15
HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 11
THREAD_PRIORITY_BELOW_NORMAL 12
THREAD_PRIORITY_NORMAL 13
THREAD_PRIORITY_ABOVE_NORMAL 14
THREAD_PRIORITY_HIGHEST 15
THREAD_PRIORITY_TIME_CRITICAL 15
REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE 16
THREAD_PRIORITY_LOWEST 22
THREAD_PRIORITY_BELOW_NORMAL 23
THREAD_PRIORITY_NORMAL 24
THREAD_PRIORITY_ABOVE_NORMAL 25
THREAD_PRIORITY_HIGHEST 26
THREAD_PRIORITY_TIME_CRITICAL 31