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 を使用してスケジューラーのポリシーにアクセスし、ポリシー キーMinConcurrencyMaxConcurrency、および TargetOversubscriptionFactor の値を使用してスケジューラーに最初に割り当てるハードウェア スレッドの数と、各ハードウェア スレッドに対して作成する仮想プロセッサ ルートの数を決定します。 スケジューラ ポリシーを使用してスケジューラの初期割り当てを決定する方法の詳細については、「PolicyElementKey」を参照してください。

リソース マネージャーは、仮想プロセッサ ルートのリストを使用して IScheduler::AddVirtualProcessors メソッドを呼び出すことで、リソースをスケジューラーに付与します。 メソッドは、このメソッドが返される前に、スケジューラにコールバックとして呼び出されます。

スケジューラがパラメーター doSubscribeCurrentThreadtrue に設定して現在のスレッドのサブスクリプションを要求した場合、メソッドは 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 構造体