次の方法で共有


スケジュール グループ

更新 : 2010 年 7 月

ここでは、同時実行ランタイムでのスケジュール グループの役割について説明します。 スケジュール グループは、関連するタスクの関係付け (グループ化) を行います。 各スケジューラは、1 つ以上のスケジュール グループを使用します。 関連するタスクのグループが同一プロセッサ ノードでの実行によって恩恵を受ける場合など、タスク間で高いレベルの局所性が求められる場合は、スケジュール グループを使用します。 一方、一連のタスクに割り当てられる処理リソースの量を制限する場合など、アプリケーション固有の品質要求がある場合は、スケジューラ インスタンスを使用します。 スケジューラ インスタンスの詳細については、「スケジューラ インスタンス」を参照してください。

ヒント

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

すべての Scheduler オブジェクトには、すべてのスケジューリング ノード用の既定のスケジュール グループがあります。 スケジューリング ノードは、基になるシステム トポロジにマップされます。 ランタイムは、すべてのプロセッサ パッケージまたは NUMA (Non-Uniform Memory Architecture) ノードに対し、どれだけ数が多い場合でも、1 つのスケジューリング ノードを作成します。 明示的にタスクをスケジュール グループに関連付けない場合、スケジューラはタスクの追加先グループを選択します。

SchedulingProtocol スケジューラ ポリシーは、スケジューラが各スケジュール グループ内のタスクを実行する順序に影響を与えます。 SchedulingProtocolEnhanceScheduleGroupLocality (既定値) に設定されている場合、現在のタスクが終了すると、または現在のタスクが協調的に譲歩すると、タスク スケジューラは、処理中のスケジュール グループから次のタスクを選択します。 タスク スケジューラは、次の使用できるグループに移動する前に、現在のスケジュール グループを検索して作業対象を見つけます。 これに対し、SchedulingProtocolEnhanceForwardProgress に設定されている場合、各タスクが終了または譲歩した後、スケジューラは次のスケジュール グループに移動します。 これらのポリシーを比較した例については、「方法: スケジュール グループを使用して実行順序に影響を与える」を参照してください。

ランタイムは、Concurrency::ScheduleGroup クラスを使用してスケジュール グループを表します。 ScheduleGroup オブジェクトを作成するには、Concurrency::CurrentScheduler::CreateScheduleGroup メソッドまたは Concurrency::Scheduler::CreateScheduleGroup メソッドを呼び出します。 ランタイムは、Scheduler オブジェクトの有効期間を制御するために参照カウント メカニズムを使用しますが、ScheduleGroup オブジェクトの有効期間を制御するためにも、この参照カウント メカニズムを使用します。 ScheduleGroup オブジェクトを作成すると、ランタイムは参照カウントを 1 に設定します。 Concurrency::ScheduleGroup::Reference メソッドは、参照カウントを 1 つインクリメントします。 Concurrency::ScheduleGroup::Release メソッドは、参照カウントを 1 つデクリメントします。

同時実行ランタイムの多くの型により、オブジェクトをスケジュール グループに関連付けることができます。 たとえば、Concurrency::agent クラス、および Concurrency::unbounded_bufferConcurrency::joinConcurrency::timer などの各メッセージ ブロック クラスは、ScheduleGroup オブジェクトを受け取るコンストラクターのオーバーロードされたバージョンを提供します。 ランタイムは、この ScheduleGroup に関連付けられている Scheduler オブジェクトを使用してタスクをスケジュールします。

また、Concurrency::ScheduleGroup::ScheduleTask メソッドを使用して、軽量タスクをスケジュールすることもできます。 軽量タスクの詳細については、「軽量タスク」を参照してください。

スケジュール グループを使用してタスクの実行順序を制御する例については、「方法: スケジュール グループを使用して実行順序に影響を与える」を参照してください。

参照

その他の技術情報

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

スケジューラ インスタンス

方法: スケジュール グループを使用して実行順序に影響を与える

履歴の変更

日付

履歴

理由

2010 年 7 月

内容を再構成。

情報の拡充