スケジューラ ポリシー

更新 : 2010 年 7 月

ここでは、同時実行ランタイムでのスケジューラ ポリシーの役割について説明します。 スケジューラでタスクを管理する場合、スケジューラ ポリシーによって、スケジューラが使用する方法を制御します。 たとえば、一部のタスクでユーザー モード スケジュール可能 (UMS: User-Mode Schedulable) スレッドを使用し、その他のタスクで通常のスレッド機構を使用するようアプリケーションで要求する場合を考えます。 2 つのスケジューラ インスタンスを作成できます。UMS スレッドの作成をスケジューラ ポリシーの一部として指定するインスタンスと、通常のスレッドをスケジューラ ポリシーの一部として指定するインスタンスの 2 つです。 UMS の詳細については、「User-Mode Scheduling (ユーザー モード スケジューリング)」を参照してください。

また、スケジューラ ポリシーにより、使用できる処理リソースを分割して、リソースの固定セットを各スケジューラに割り当てることもできます。 たとえば、4 つまでのプロセッサに対応した並列アルゴリズムを考えてみます。 この場合、タスクで同時に使用されるプロセッサを 4 つまでに制限するスケジューラ ポリシーを作成できます。

ヒント

同時実行ランタイムには既定のスケジューラが備わっているため、アプリケーションでスケジューラを作成する必要はありません。 タスク スケジューラではアプリケーションのパフォーマンスを微調整できるため、同時実行ランタイムを初めて使用する場合は、並列パターン ライブラリ (PPL) または非同期エージェント ライブラリから始めることをお勧めします。

Concurrency::CurrentScheduler::CreateConcurrency::Scheduler::Create、または Concurrency::Scheduler::SetDefaultSchedulerPolicy メソッドを使用してスケジューラ インスタンスを作成する場合は、Concurrency::SchedulerPolicy オブジェクトを提供し、スケジューラの動作を指定する一連のキーと値のペアを格納します。 SchedulerPolicy コンストラクターは、可変個の引数を受け取ります。 1 番目の引数は、指定するポリシー要素の数です。 残りの引数は、各ポリシー要素を表すキーと値のペアです。 次の例では、3 つのポリシー要素を指定する SchedulerPolicy オブジェクトが作成されます。 指定されていないポリシー キーに対しては、ランタイムは既定値を使用します。

SchedulerPolicy policy(3,       
   MinConcurrency, 2,
   MaxConcurrency, 4,
   ContextPriority, THREAD_PRIORITY_HIGHEST
);

Concurrency::PolicyElementKey 列挙型は、タスク スケジューラに関連付けられるポリシー キーを定義します。 次の表で、ポリシー キーと、ランタイムが各ポリシー キーに対して使用する既定値について説明します。

ポリシー キー

説明

既定値

SchedulerKind

タスクのスケジュールに通常スレッドと UMS スレッドのどちらを使用するかを指定する Concurrency::SchedulerType 値。

ThreadScheduler (通常スレッドを使用)

MaxConcurrency

スケジューラが使用する同時実行リソースの最大数を指定する unsigned int 値。

Concurrency::MaxExecutionResources

MinConcurrency

スケジューラが使用する同時実行リソースの最小数を指定する unsigned int 値。

1

TargetOversubscriptionFactor

各処理リソースに割り当てるスレッドの数を指定する unsigned int 値。

1

LocalContextCacheSize

各仮想プロセッサのローカル キューにキャッシュすることができるコンテキストの最大数を指定する unsigned int 値。

8

ContextStackSize

各コンテキスト用に予約するスタックのサイズ (キロバイト単位) を指定する unsigned int 値。

0 (既定のスタック サイズを使用)

ContextPriority

各コンテキストのスレッド優先順位を指定する int 値。 これには、SetThreadPriority または INHERIT_THREAD_PRIORITY に渡すことができる任意の値を使用できます。

THREAD_PRIORITY_NORMAL

SchedulingProtocol

使用するスケジューリング アルゴリズムを指定する Concurrency::SchedulingProtocolType 値。

EnhanceScheduleGroupLocality

DynamicProgressFeedback

統計ベースの進行状況情報に従いリソースのバランスを再調整するかどうかを指定する Concurrency::DynamicProgressFeedbackType 値。

メモ   このポリシーを ProgressFeedbackDisabled に設定しないでください。 ProgressFeedbackDisabled は、ランタイムによる使用が予約されています。

ProgressFeedbackEnabled

各スケジューラは、タスクをスケジュールするとき、独自のポリシーを使用します。 したがって、あるスケジューラに関連付けられているポリシーは、その他のスケジューラの動作には影響しません。 また、Scheduler オブジェクトを作成した後にスケジューラ ポリシーを変更することはできません。

重要

ランタイムによって作成されるスレッドの属性を制御するには、スケジューラ ポリシーだけを使用します。 ランタイムによって作成されるスレッドの関係または優先順位を変更すると、未定義の動作が発生します。

スケジューラを明示的に作成しない場合は、ランタイムによって既定のスケジューラが作成されます。 アプリケーションで既定のスケジューラを使用し、そのスケジューラで使用するポリシーを指定する場合は、並列処理をスケジュールする前に Concurrency::Scheduler::SetDefaultSchedulerPolicy メソッドを呼び出します。 Scheduler::SetDefaultSchedulerPolicy メソッドを呼び出さない場合、ランタイムは表の既定ポリシー値を使用します。

スケジューラ ポリシーのコピーを取得するには、Concurrency::CurrentScheduler::GetPolicy メソッドおよび Concurrency::Scheduler::GetPolicy メソッドを使用します。 これらのメソッドから取得するポリシー値は、スケジューラを作成するときに指定したポリシー値とは異なる場合があります。 たとえば、UMSThreadDefault ポリシー値は、オペレーティング システム (たとえば、Windows 7 の 64 ビット バージョン) で UMS スレッド機能が使用できる場合、スケジューラでその機能を使用することを指定します。 UMS スレッドが使用できない場合、スケジューラはこのポリシー値を ThreadScheduler に設定します。これは、スケジューラで通常スレッドを使用することを指定します。

特定のスケジューラ ポリシーを使用してスケジューラの動作を制御する例については、「方法: 特定のスケジューラ ポリシーを指定する」および「方法: 特定のスケジューラ ポリシーを使用するエージェントを作成する」を参照してください。

参照

その他の技術情報

タスク スケジューラ (同時実行ランタイム)

方法: 特定のスケジューラ ポリシーを指定する

方法: 特定のスケジューラ ポリシーを使用するエージェントを作成する

履歴の変更

日付

履歴

理由

2010 年 7 月

内容を再構成。

情報の拡充