ISchedulerProxy 構造体
スケジューラは、このインターフェイスを使用してコンカレンシー ランタイムのリソース マネージャーと通信して、リソース割り当てをネゴシエートします。
構文
struct ISchedulerProxy;
メンバー
パブリック メソッド
名前 | 説明 |
---|---|
ISchedulerProxy::BindContext | まだ関連付けられていない場合、実行コンテキストをスレッド プロキシに関連付けます。 |
ISchedulerProxy::CreateOversubscriber | 既存の実行リソースに関連付けられているハードウェア スレッドに新しい仮想プロセッサ ルートを作成します。 |
ISchedulerProxy::RequestInitialVirtualProcessors | 仮想プロセッサ ルートの初期割り当てを要求します。 すべての仮想プロセッサ ルートは、スケジューラに対して処理を実行できる 1 つのスレッドを実行する機能を表します。 |
ISchedulerProxy::Shutdown | スケジューラがシャットダウン中であることをリソース マネージャーに通知します。 これにより、リソース マネージャーは、スケジューラに付与されているすべてのリソースを直ちに回収します。 |
ISchedulerProxy::SubscribeCurrentThread | 現在のスレッドをリソース マネージャーに登録し、このスケジューラに関連付けます。 |
ISchedulerProxy::UnbindContext | pContext パラメーターによって指定された実行コンテキストからスレッド プロキシの関連付けを解除し、スレッド プロキシ ファクトリの解放プールに返します。 このメソッドは、ISchedulerProxy::BindContext メソッドを使用してバインドされた実行コンテキストでのみ呼び出すことができます。また、IThreadProxy::SwitchTo メソッド呼び出しの pContext パラメーターとしてまだ開始されていません。 |
解説
リソース マネージャーは、IResourceManager::RegisterScheduler メソッドを使用して、それに登録するすべてのスケジューラにISchedulerProxy
インターフェイスを渡します。
継承階層
ISchedulerProxy
要件
ヘッダー: concrtrm.h
名前空間: concurrency
ISchedulerProxy::BindContext メソッド
まだ関連付けられていない場合、実行コンテキストをスレッド プロキシに関連付けます。
virtual void BindContext(_Inout_ IExecutionContext* pContext) = 0;
パラメーター
pContext
スレッド プロキシに関連付ける実行コンテキストへのインターフェイス。
解説
通常、IThreadProxy::SwitchTo メソッドは必要に応じてスレッド プロキシを実行コンテキストにバインドします。 ただし、SwitchTo
メソッドが既にバインドされているコンテキストに切り替わっていることを確認するために、事前にコンテキストをバインドする必要がある状況もあります。 これは、メモリを割り当てるメソッドを呼び出すことができず、スレッド プロキシ ファクトリの空きプールでスレッド プロキシを使用できない場合に、スレッド プロキシのバインドにメモリの割り当てが含まれている可能性があるため、UMS スケジューリング コンテキストのケースです。
パラメーター pContext
の値が NULL
の場合、invalid_argument
がスローされます。
ISchedulerProxy::CreateOversubscriber メソッド
既存の実行リソースに関連付けられているハードウェア スレッドに新しい仮想プロセッサ ルートを作成します。
virtual IVirtualProcessorRoot* CreateOversubscriber(_Inout_ IExecutionResource* pExecutionResource) = 0;
パラメーター
pExecutionResource
オーバーサブスクライブするハードウェア スレッドを表す IExecutionResource
インターフェイス。
戻り値
IVirtualProcessorRoot
インターフェイスです。
解説
スケジューラが特定のハードウェア スレッドを制限された時間内にオーバーサブスクライブする場合は、このメソッドを使用します。 仮想プロセッサ ルートが完成したら、IVirtualProcessorRoot
インターフェイスで Remove メソッド を呼び出して、それをリソース マネージャーに返す必要があります。
IVirtualProcessorRoot
インターフェイスは IExecutionResource
インターフェイスから継承するため、既存の仮想プロセッサ ルートをオーバーサブスクライブすることもできます。
ISchedulerProxy::RequestInitialVirtualProcessors メソッド
仮想プロセッサ ルートの初期割り当てを要求します。 すべての仮想プロセッサ ルートは、スケジューラに対して処理を実行できる 1 つのスレッドを実行する機能を表します。
virtual IExecutionResource* RequestInitialVirtualProcessors(bool doSubscribeCurrentThread) = 0;
パラメーター
doSubscribeCurrentThread
リソースの割り当て中に、現在のスレッドとアカウントをサブスクライブするかどうかを指定します。
戻り値
パラメーター doSubscribeCurrentThread
に値 true
がある場合は、現在のスレッドの IExecutionResource
インターフェイス。 値が false
の場合、メソッドは NULL を返します。
解説
スケジューラは、すべての作業を実行する前に、このメソッドを使用してリソース マネージャーから仮想プロセッサ ルートを要求する必要があります。 リソース マネージャーは IScheduler::GetPolicy を使用してスケジューラーのポリシーにアクセスし、ポリシー キーMinConcurrency
、MaxConcurrency
、および TargetOversubscriptionFactor
の値を使用してスケジューラーに最初に割り当てるハードウェア スレッドの数と、各ハードウェア スレッドに対して作成する仮想プロセッサ ルートの数を決定します。 スケジューラ ポリシーを使用してスケジューラの初期割り当てを決定する方法の詳細については、「PolicyElementKey」を参照してください。
リソース マネージャーは、仮想プロセッサ ルートのリストを使用して IScheduler::AddVirtualProcessors メソッドを呼び出すことで、リソースをスケジューラーに付与します。 メソッドは、このメソッドが返される前に、スケジューラにコールバックとして呼び出されます。
スケジューラがパラメーター doSubscribeCurrentThread
を true
に設定して現在のスレッドのサブスクリプションを要求した場合、メソッドは IExecutionResource
インターフェイスを返します。 サブスクリプションは、IExecutionResource::Remove メソッドを使用して、後で終了する必要があります。
選択されているハードウェア スレッドを特定するときに、リソース マネージャーはプロセッサ ノード アフィニティの最適化を試行します。 現在のスレッドに対してサブスクリプションが要求された場合、現在のスレッドがこのスケジューラに割り当てられた作業に参加しようとしていることを示します。 このような場合、割り当てられた仮想プロセッサのルートは、可能であれば、現在のスレッドが実行されているプロセッサ ノードに配置されます。
スレッドをサブスクライブすると、基になるハードウェア スレッドのサブスクリプション レベルが 1 つ増加します。 サブスクリプションを終了すると、サブスクリプション レベルは 1 つ減少します。 サブスクリプション レベルの詳細については、「IExecutionResource::CurrentSubscriptionLevel」を参照してください。
ISchedulerProxy::Shutdown メソッド
スケジューラがシャットダウン中であることをリソース マネージャーに通知します。 これにより、リソース マネージャーは、スケジューラに付与されているすべてのリソースを直ちに回収します。
virtual void Shutdown() = 0;
解説
メソッド ISchedulerProxy::RequestInitialVirtualProcessors
を使用して外部スレッドをサブスクライブした結果としてスケジューラが受信した、またはスケジューラがシャットダウンする前に IExecutionResource::Remove
を使用して ISchedulerProxy::SubscribeCurrentThread
がリソース マネージャーに返す必要があるすべての IExecutionContext
インターフェイス。
スケジューラに非アクティブ化された仮想プロセッサ ルートがある場合、IVirtualProcessorRoot::Activate を使用してアクティブ化する必要があります。また、スケジューラ プロキシで Shutdown
を呼び出す前に、それらを実行しているスレッド プロキシが、ディスパッチしている実行コンテキストの Dispatch
メソッドをそのまま残すようにする必要があります。
すべての仮想プロセッサ ルートはシャットダウン時にリソース マネージャーに返されるため、スケジューラは、Remove
メソッドへの呼び出しによって付与されたすべての仮想プロセッサ ルートを個別にリソース マネージャーに返す必要はありません。
ISchedulerProxy::SubscribeCurrentThread メソッド
現在のスレッドをリソース マネージャーに登録し、このスケジューラに関連付けます。
virtual IExecutionResource* SubscribeCurrentThread() = 0;
戻り値
ランタイムでの現在のスレッドを表す IExecutionResource
インターフェイス。
解説
リソース マネージャーが、使用するスケジューラや他のスケジューラにリソースを割り当てるときに現在のスレッドを考慮する必要がある場合は、このメソッドを使用します。 これは特に、スケジューラにキューイングされている作業にスレッドが参加する予定の場合に、スケジューラがリソース マネージャーから受け取る仮想プロセッサ ルートと併用すると役立ちます。 リソース マネージャーは情報を使用して、システム上のハードウェア スレッドの不要なオーバーサブスクリプションを回避します。
このメソッドを使用して受信された実行リソースは、IExecutionResource::Remove メソッドを使用してリソース マネージャーに返される必要があります。 Remove
メソッドを呼び出すスレッドは、以前に SubscribeCurrentThread
メソッドを呼び出したスレッドと同じである必要があります。
スレッドをサブスクライブすると、基になるハードウェア スレッドのサブスクリプション レベルが 1 つ増加します。 サブスクリプションを終了すると、サブスクリプション レベルは 1 つ減少します。 サブスクリプション レベルの詳細については、「IExecutionResource::CurrentSubscriptionLevel」を参照してください。
ISchedulerProxy::UnbindContext メソッド
pContext
パラメーターによって指定された実行コンテキストからスレッド プロキシの関連付けを解除し、スレッド プロキシ ファクトリの解放プールに返します。 このメソッドは、ISchedulerProxy::BindContext メソッドを使用してバインドされた実行コンテキストでのみ呼び出すことができます。また、IThreadProxy::SwitchTo メソッド呼び出しの pContext
パラメーターとしてまだ開始されていません。
virtual void UnbindContext(_Inout_ IExecutionContext* pContext) = 0;
パラメーター
pContext
スレッド プロキシから関連付けを解除する実行コンテキスト。
関連項目
コンカレンシー名前空間
IScheduler 構造体
IThreadProxy 構造体
IVirtualProcessorRoot 構造体
IResourceManager 構造体