IScheduler 構造体
作業スケジューラの抽象化のインターフェイスです。 コンカレンシー ランタイムのリソース マネージャーは、このインターフェイスを使用して作業スケジューラと通信します。
構文
struct IScheduler;
メンバー
パブリック メソッド
名前 | 説明 |
---|---|
IScheduler::AddVirtualProcessors | スケジューラに、使用する仮想プロセッサ ルートのセットを提供します。 各 IVirtualProcessorRoot インターフェイスは、スケジューラに代わって処理を実行できる 1 つのスレッドを実行する権限を表します。 |
IScheduler::GetId | スケジューラの一意識別子を返します。 |
IScheduler::GetPolicy | スケジューラのポリシーのコピーを返します。 スケジューラのポリシーの詳細については、SchedulerPolicy に関する記事を参照してください。 |
IScheduler::NotifyResourcesExternallyBusy | ppVirtualProcessorRoots 配列内の仮想プロセッサ ルートのセットで表されるハードウェア スレッドが、他のスケジューラによって現在使用されていることをこのスケジューラに通知します。 |
IScheduler::NotifyResourcesExternallyIdle | ppVirtualProcessorRoots 配列内の仮想プロセッサ ルートのセットで表されるハードウェア スレッドが、他のスケジューラによって使用されていないことをこのスケジューラに通知します。 |
IScheduler::RemoveVirtualProcessors | このスケジューラに以前に割り当てられた仮想プロセッサ ルートの削除を開始します。 |
IScheduler::Statistics | タスクの到着率と完了率、およびスケジューラのキューの長さの変更に関連する情報を提供します。 |
解説
Resource Manager と通信するカスタム スケジューラを実装する場合は、IScheduler
インターフェイスの実装を提供する必要があります。 このインターフェイスは、スケジューラと Resource Manager 間の双方向通信チャネルの一端です。 もう一方の端は、Resource Manager によって実装される IResourceManager
インターフェイスと ISchedulerProxy
インターフェイスで表されます。
継承階層
IScheduler
要件
ヘッダー: concrtrm.h
名前空間: concurrency
IScheduler::AddVirtualProcessors メソッド
スケジューラに、使用する仮想プロセッサ ルートのセットを提供します。 各 IVirtualProcessorRoot
インターフェイスは、スケジューラに代わって処理を実行できる 1 つのスレッドを実行する権限を表します。
virtual void AddVirtualProcessors(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
パラメーター
ppVirtualProcessorRoots
スケジューラに追加される仮想プロセッサ ルートを表す IVirtualProcessorRoot
インターフェイスの配列。
count
配列内の IVirtualProcessorRoot
インターフェイスの数。
解説
Resource Manager は、AddVirtualProcessor
メソッドを呼び出して、仮想プロセッサ ルートの初期セットをスケジューラに付与します。 また、スケジューラ間でリソースのバランスを再調整するときに、このメソッドを呼び出して仮想プロセッサ ルートをスケジューラに追加することもできます。
IScheduler::GetId メソッド
スケジューラの一意識別子を返します。
virtual unsigned int GetId() const = 0;
戻り値
一意の整数識別子。
解説
Resource Manager によって提供されるメソッドのパラメーターとして IScheduler
インターフェイスを使用する前に、GetSchedulerId 関数を使用して、このインターフェイスを実装するオブジェクトの一意識別子を取得する必要があります。 GetId
関数が呼び出されたときに、同じ識別子を返すことが求められます。
別のソースから取得した識別子を使用すると、未定義の動作が発生する可能性があります。
IScheduler::GetPolicy メソッド
スケジューラのポリシーのコピーを返します。 スケジューラのポリシーの詳細については、SchedulerPolicy に関する記事を参照してください。
virtual SchedulerPolicy GetPolicy() const = 0;
戻り値
スケジューラのポリシーのコピー。
IScheduler::NotifyResourcesExternallyBusy メソッド
ppVirtualProcessorRoots
配列内の仮想プロセッサ ルートのセットで表されるハードウェア スレッドが、他のスケジューラによって現在使用されていることをこのスケジューラに通知します。
virtual void NotifyResourcesExternallyBusy(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
パラメーター
ppVirtualProcessorRoots
他のスケジューラがビジー状態になっているハードウェア スレッドに関連付けられた IVirtualProcessorRoot
インターフェイスの配列。
count
配列内の IVirtualProcessorRoot
インターフェイスの数。
解説
特定のハードウェア スレッドが、同時に複数のスケジューラに割り当てられる可能性があります。 その理由の 1 つとして、リソースを共有せずに、すべてのスケジューラの最小コンカレンシーを満たすことができる十分なハードウェア スレッドがシステム上にないことが考えられます。 もう 1 つの可能性は、所有しているスケジューラがリソースを使用していないときに、そのハードウェア スレッド上のすべての仮想プロセッサ ルートを非アクティブ化することによって、リソースが他のスケジューラに一時的に割り当てられることです。
ハードウェア スレッドのサブスクリプション レベルは、そのハードウェア スレッドに関連付けられているサブスクライブされたスレッドとアクティブ化された仮想プロセッサ ルートの数で示されます。 特定のスケジューラの観点から、ハードウェア スレッドの外部サブスクリプション レベルは、他のスケジューラが寄与するサブスクリプションの一部です。 ハードウェア スレッドの外部サブスクリプション レベルがゼロからプラスの領域に移行すると、リソースが外部でビジー状態であるという通知がスケジューラに送信されます。
このメソッドによる通知は、MinConcurrency
ポリシー キーの値が MaxConcurrency
ポリシー キーの値と等しいポリシーが設定されたスケジューラにのみ送信されます。 スケジューラのポリシーの詳細については、SchedulerPolicy に関する記事を参照してください。
通知の対象となるスケジューラは、その作成時に、割り当てられたばかりのリソースが外部でビジー状態かアイドル状態かを通知する一連の初期通知を受け取ります。
IScheduler::NotifyResourcesExternallyIdle メソッド
ppVirtualProcessorRoots
配列内の仮想プロセッサ ルートのセットで表されるハードウェア スレッドが、他のスケジューラによって使用されていないことをこのスケジューラに通知します。
virtual void NotifyResourcesExternallyIdle(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
パラメーター
ppVirtualProcessorRoots
他のスケジューラがアイドル状態になっているハードウェア スレッドに関連付けられた IVirtualProcessorRoot
インターフェイスの配列。
count
配列内の IVirtualProcessorRoot
インターフェイスの数。
解説
特定のハードウェア スレッドが、同時に複数のスケジューラに割り当てられる可能性があります。 その理由の 1 つとして、リソースを共有せずに、すべてのスケジューラの最小コンカレンシーを満たすことができる十分なハードウェア スレッドがシステム上にないことが考えられます。 もう 1 つの可能性は、所有しているスケジューラがリソースを使用していないときに、そのハードウェア スレッド上のすべての仮想プロセッサ ルートを非アクティブ化することによって、リソースが他のスケジューラに一時的に割り当てられることです。
ハードウェア スレッドのサブスクリプション レベルは、そのハードウェア スレッドに関連付けられているサブスクライブされたスレッドとアクティブ化された仮想プロセッサ ルートの数で示されます。 特定のスケジューラの観点から、ハードウェア スレッドの外部サブスクリプション レベルは、他のスケジューラが寄与するサブスクリプションの一部です。 ハードウェア スレッドの外部サブスクリプション レベルがこれまでの正の値からゼロになると、リソースが外部でビジー状態であるという通知がスケジューラに送信されます。
このメソッドによる通知は、MinConcurrency
ポリシー キーの値が MaxConcurrency
ポリシー キーの値と等しいポリシーが設定されたスケジューラにのみ送信されます。 スケジューラのポリシーの詳細については、SchedulerPolicy に関する記事を参照してください。
通知の対象となるスケジューラは、その作成時に、割り当てられたばかりのリソースが外部でビジー状態かアイドル状態かを通知する一連の初期通知を受け取ります。
IScheduler::RemoveVirtualProcessors メソッド
このスケジューラに以前に割り当てられた仮想プロセッサ ルートの削除を開始します。
virtual void RemoveVirtualProcessors(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
パラメーター
ppVirtualProcessorRoots
削除する仮想プロセッサ ルートを表す IVirtualProcessorRoot
インターフェイスの配列。
count
配列内の IVirtualProcessorRoot
インターフェイスの数。
解説
Resource Manager は、RemoveVirtualProcessors
メソッドを呼び出して、スケジューラから仮想プロセッサ ルートのセットを回収します。 スケジューラでは、仮想プロセッサ ルートの処理が完了したら、各インターフェイスに対して Remove メソッドを呼び出す必要があります。 Remove
メソッドを呼び出した後は、IVirtualProcessorRoot
インターフェイスを使用しないでください。
ppVirtualProcessorRoots
パラメーターは、インターフェイスの配列を参照します。 削除する仮想プロセッサ ルートのセットの中で、一度もアクティブ化されたことがないルートは、Remove
メソッドを使用してすぐに戻すことができます。 アクティブ化され、処理を実行中のルート、または非アクティブ化され、処理の到着を待機しているルートは、非同期で戻す必要があります。 スケジューラでは、仮想プロセッサ ルートをできるだけ早く削除するために最善を尽くす必要があります。 仮想プロセッサ ルートの削除を遅らせると、スケジューラ内で意図しないオーバーサブスクリプションが発生する可能性があります。
IScheduler::Statistics メソッド
タスクの到着率と完了率、およびスケジューラのキューの長さの変更に関連する情報を提供します。
virtual void Statistics(
_Out_ unsigned int* pTaskCompletionRate,
_Out_ unsigned int* pTaskArrivalRate,
_Out_ unsigned int* pNumberOfTasksEnqueued) = 0;
パラメーター
pTaskCompletionRate
このメソッドの最後の呼び出し以降にスケジューラによって完了されたタスクの数。
pTaskArrivalRate
このメソッドの最後の呼び出し以降にスケジューラに到着したタスクの数。
pNumberOfTasksEnqueued
すべてのスケジューラ キューにあるタスクの総数。
解説
このメソッドは、スケジューラの統計を収集するために Resource Manager によって呼び出されます。 ここで収集された統計は、動的フィードバック アルゴリズムを実行して、さらに多くのリソースをスケジューラに割り当てるのが適切であるタイミングと、リソースを回収するタイミングを判断するために使用されます。 スケジューラから提供される値はオプティミスティックでもかまわず、必ずしも現在のカウントを正確に反映する必要はありません。
使用しているスケジューラと Resource Manager に登録されている他のスケジューラの間でリソースのバランスを取る方法を決定するために、Resource Manager でタスクの到着などに関するフィードバックを使用する場合は、このメソッドを実装する必要があります。 統計を収集しないことにした場合は、スケジューラのポリシーでポリシー キー DynamicProgressFeedback
を値 DynamicProgressFeedbackDisabled
に設定すると、Resource Manager はそのスケジューラに対してこのメソッドを呼び出さなくなります。
統計情報がない場合、Resource Manager はハードウェア スレッドのサブスクリプション レベルを使用して、リソースの割り当てと移行を決定します。 サブスクリプション レベルの詳細については、「IExecutionResource::CurrentSubscriptionLevel」を参照してください。
関連項目
コンカレンシー名前空間
PolicyElementKey
SchedulerPolicy クラス
IExecutionContext 構造体
IThreadProxy 構造体
IVirtualProcessorRoot 構造体
IResourceManager 構造体