IExecutionResource 構造体
ハードウェア スレッドの抽象化です。
構文
struct IExecutionResource;
メンバー
パブリック メソッド
名前 | 説明 |
---|---|
IExecutionResource::CurrentSubscriptionLevel | アクティブ化された仮想プロセッサ ルートと、この実行リソースが表す基になるハードウェア スレッドに現在関連付けられているサブスクライブ済み外部スレッドの数を返します。 |
IExecutionResource::GetExecutionResourceId | この実行リソースが表すハードウェア スレッドの一意識別子を返します。 |
IExecutionResource::GetNodeId | この実行リソースが属するプロセッサ ノードの一意識別子を返します。 |
IExecutionResource::Remove | この実行リソースをリソース マネージャーに返します。 |
解説
実行リソースは、スタンドアロンにすることも、仮想プロセッサ ルートに関連付けることもできます。 スタンドアロンの実行リソースは、アプリケーションのスレッドによってスレッド サブスクリプションが作成されたときに作成されます。 ISchedulerProxy::SubscribeThread メソッドと ISchedulerProxy::RequestInitialVirtualProcessors メソッドは、スレッド サブスクリプションを作成し、そのサブスクリプションを表す IExecutionResource
インターフェイスを返します。 スレッド サブスクリプションの作成は、特定のスレッドがスケジューラのキューに登録されている作業、およびリソース マネージャーがスケジューラに割り当てている仮想プロセッサ ルートに参加することを、リソース マネージャーに通知する方法です。 リソース マネージャーはこの情報を使用して、ハードウェア スレッドのオーバーサブスクリプションが発生する可能性がある場合にこれを回避します。
継承階層
IExecutionResource
要件
ヘッダー: concrtrm.h
名前空間: concurrency
IExecutionResource::CurrentSubscriptionLevel メソッド
アクティブ化された仮想プロセッサ ルートと、この実行リソースが表す基になるハードウェア スレッドに現在関連付けられているサブスクライブ済み外部スレッドの数を返します。
virtual unsigned int CurrentSubscriptionLevel() const = 0;
戻り値
現在のサブスクリプション レベル。
解説
サブスクリプション レベルは、ハードウェア スレッドに関連付けられている実行中のスレッドの数を示します。 これには、サブスクライブ済みのスレッドとしてリソース マネージャーが認識しているスレッドと、スレッド プロキシをアクティブに実行している仮想プロセッサ ルートだけが含まれます。
ISchedulerProxy::SubscribeCurrentThread メソッドを呼び出すか、doSubscribeCurrentThread
パラメーターを値 true
に設定して ISchedulerProxy::RequestInitialVirtualProcessors メソッドを呼び出すと、ハードウェア スレッドのサブスクリプション レベルが 1 つインクリメントされます。 また、サブスクリプションを表す IExecutionResource
インターフェイスも返されます。 これに対応する IExecutionResource::Remove を呼び出すと、ハードウェア スレッドのサブスクリプション レベルが 1 つデクリメントされます。
IVirtualProcessorRoot::Activate メソッドを使用して仮想プロセッサ ルートをアクティブ化する操作によって、ハードウェア スレッドのサブスクリプション レベルが 1 つインクリメントされます。 IVirtualProcessorRoot::Deactivate メソッド、または IExecutionResource::Remove メソッドを、アクティブ化された仮想プロセッサ ルートで呼び出すと、サブスクリプション レベルが 1 つデクリメントされます。
リソース マネージャーは、スケジューラ間でリソースを移動するタイミングを決定する方法の 1 つとして、このサブスクリプション レベル情報を使用します。
IExecutionResource::GetExecutionResourceId メソッド
この実行リソースが表すハードウェア スレッドの一意識別子を返します。
virtual unsigned int GetExecutionResourceId() const = 0;
戻り値
この実行リソースの基になるハードウェア スレッドの一意識別子。
解説
各ハードウェア スレッドには、同時実行ランタイムによって一意識別子が割り当てられます。 ハードウェア スレッドに複数の実行リソースが関連付けられている場合、それらの実行リソース識別子はすべて同じになります。
IExecutionResource::GetNodeId メソッド
この実行リソースが属するプロセッサ ノードの一意識別子を返します。
virtual unsigned int GetNodeId() const = 0;
戻り値
プロセッサ ノードの一意識別子。
解説
この同時実行ランタイムは、システム上のプロセッサ ノード グループ内のハードウェア スレッドを表します。 ノードは通常、システムのハードウェア トポロジから派生します。 たとえば、特定のソケットまたは特定の NUMA ノード上のすべてのプロセッサは、同じプロセッサ ノードに属すことができます。 リソース マネージャーは、0
から nodeCount - 1
まで (nodeCount - 1 を含む) の一意識別子をこれらのノードに割り当てます。ここで、nodeCount
はシステム上のプロセッサ ノードの総数を表します。
ノードの数は、GetProcessorNodeCount 関数から取得できます。
IExecutionResource::Remove メソッド
この実行リソースをリソース マネージャーに返します。
virtual void Remove(_Inout_ IScheduler* pScheduler) = 0;
パラメーター
pScheduler
この実行リソースの削除を要求するスケジューラへのインターフェイス。
解説
このメソッドを使用して、スタンドアロンの実行リソースと、仮想プロセッサ ルートに関連付けられている実行リソースをリソース マネージャーに返します。
これが ISchedulerProxy::SubscribeCurrentThread メソッドまたは ISchedulerProxy::RequestInitialVirtualProcessors メソッドから受け取ったスタンドアロンの実行リソースである場合、Remove
メソッドを呼び出すことによって、示すためにリソースを作成したスレッド サブスクリプションが終了します。 スケジューラ プロキシをシャットダウンする前に、すべてのスレッド サブスクリプションを終了する必要があります。また、サブスクリプションを作成したスレッドから Remove
を呼び出す必要があります。
IVirtualProcessorRoot
インターフェイスは IExecutionResource
インターフェイスを継承しているため、Remove
メソッドを呼び出すことで、仮想プロセッサ ルートもリソース マネージャーに返すことができます。 仮想プロセッサ ルートは、IScheduler::RemoveVirtualProcessors メソッドの呼び出しへの応答で、または ISchedulerProxy::CreateOversubscriber メソッドから取得したオーバーサブスクリプション状態の仮想プロセッサ ルートの終了時に、返す必要が生じる場合があります。 仮想プロセッサ ルートの場合、Remove
メソッドを呼び出すことができるスレッドに制限はありません。
pScheduler
パラメーターが NULL
に設定されている場合は invalid_argument
がスローされます。
pScheduler
パラメーターが、この実行リソースが作成されたスケジューラと異なるときや、スタンドアロンの実行リソースの場合で、現在のスレッドがスレッド サブスクリプションを作成したスレッドと異なるときは、invalid_operation
がスローされます。