スケジュール グループ
ここでは、同時実行ランタイムでのスケジュール グループの役割について説明します。 スケジュール グループは、関連するタスクの関係付け (グループ化) を行います。 各スケジューラは、1 つ以上のスケジュール グループを使用します。 関連するタスクのグループが同一プロセッサ ノードでの実行によって恩恵を受ける場合など、タスク間で高いレベルの局所性が求められる場合は、スケジュール グループを使用します。 一方、一連のタスクに割り当てられる処理リソースの量を制限する場合など、アプリケーション固有の品質要求がある場合は、スケジューラ インスタンスを使用します。 スケジューラ インスタンスの詳細については、「スケジューラ インスタンス」を参照してください。
ヒント
同時実行ランタイムには既定のスケジューラが備わっているため、アプリケーションでスケジューラを作成する必要はありません。タスク スケジューラではアプリケーションのパフォーマンスを微調整できるため、同時実行ランタイムを初めて使用する場合は、並列パターン ライブラリ (PPL) または非同期エージェント ライブラリから始めることをお勧めします。
すべての Scheduler オブジェクトには、すべてのスケジューリング ノード用の既定のスケジュール グループがあります。 スケジューリング ノードは、基になるシステム トポロジにマップされます。 ランタイムは、すべてのプロセッサ パッケージまたは NUMA (Non-Uniform Memory Architecture) ノードに対し、どれだけ数が多い場合でも、1 つのスケジューリング ノードを作成します。 明示的にタスクをスケジュール グループに関連付けない場合、スケジューラはタスクの追加先グループを選択します。
SchedulingProtocol スケジューラ ポリシーは、スケジューラが各スケジュール グループ内のタスクを実行する順序に影響を与えます。 SchedulingProtocol が EnhanceScheduleGroupLocality (既定値) に設定されている場合、現在のタスクが終了すると、または現在のタスクが協調的に譲歩すると、タスク スケジューラは、処理中のスケジュール グループから次のタスクを選択します。 タスク スケジューラは、次の使用できるグループに移動する前に、現在のスケジュール グループを検索して作業対象を見つけます。 これに対し、SchedulingProtocol が EnhanceForwardProgress に設定されている場合、各タスクが終了または譲歩した後、スケジューラは次のスケジュール グループに移動します。 これらのポリシーを比較した例については、「方法: スケジュール グループを使用して実行順序に影響を与える」を参照してください。
ランタイムは、スケジュール グループを表すために concurrency::ScheduleGroup クラスを使用します。 ScheduleGroup オブジェクトを作成するには、concurrency::CurrentScheduler::CreateScheduleGroup または concurrency::Scheduler::CreateScheduleGroup のメソッドを呼び出します。 ランタイムは、Scheduler オブジェクトの有効期間を制御するために参照カウント メカニズムを使用しますが、ScheduleGroup オブジェクトの有効期間を制御するためにも、この参照カウント メカニズムを使用します。 ScheduleGroup オブジェクトを作成すると、ランタイムは参照カウントを 1 に設定します。 concurrency::ScheduleGroup::Reference のメソッドは 1 ずつ参照カウンターをインクリメントします。 concurrency::ScheduleGroup::Release のメソッドは 1 ずつ参照カウンターをデクリメントします。
同時実行ランタイムの多くの型により、オブジェクトをスケジュール グループに関連付けることができます。 たとえば、concurrency::unbounded_buffer、concurrency::joinと concurrency::timerなどの concurrency::agent クラスとメッセージ ブロック クラスは、ScheduleGroup オブジェクトを受け取るコンストラクターのオーバーロードされたバージョンを提供します。 ランタイムは、この ScheduleGroup に関連付けられている Scheduler オブジェクトを使用してタスクをスケジュールします。
また軽量タスクをスケジュールする concurrency::ScheduleGroup::ScheduleTask のメソッドを使用できます。 軽量タスクの詳細については、「軽量タスク」を参照してください。
例
スケジュール グループを使用してタスクの実行順序を制御する例については、「方法: スケジュール グループを使用して実行順序に影響を与える」を参照してください。
参照
処理手順
方法: スケジュール グループを使用して実行順序に影響を与える