ISchedulerProxy 结构

计划程序用来与并发运行时的资源管理器进行通信以协商资源分配的接口。

语法

struct ISchedulerProxy;

成员

公共方法

名称 描述
ISchedulerProxy::BindContext 将执行上下文与线程代理相关联(如果尚未关联)。
ISchedulerProxy::CreateOversubscriber 在与现有执行资源关联的硬件线程上创建新的虚拟处理器根。
ISchedulerProxy::RequestInitialVirtualProcessors 请求虚拟处理器根的初始分配。 每个虚拟处理器根代表执行一个可以为调度程序执行工作的线程的能力。
ISchedulerProxy::Shutdown 通知资源管理器调度程序正在关闭。 这将导致资源管理器立即收回授予调度程序的所有资源。
ISchedulerProxy::SubscribeCurrentThread 向资源管理器注册当前线程,将其与此计划程序相关联。
ISchedulerProxy::UnbindContext 取消线程代理与 pContext 参数指定的执行上下文的关联,并将其返回到线程代理工厂的空闲池。 只能在通过 ISchedulerProxy::BindContext 方法绑定且尚未通过作为 IThreadProxy::SwitchTo 方法调用的 pContext 参数启动的执行上下文中调用此方法。

备注

资源管理器向每个使用 IResourceManager::RegisterScheduler 方法注册的计划程序提供 ISchedulerProxy 接口。

继承层次结构

ISchedulerProxy

要求

标头:concrtrm.h

命名空间: 并发

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 方法

请求虚拟处理器根的初始分配。 每个虚拟处理器根代表执行一个可以为调度程序执行工作的线程的能力。

virtual IExecutionResource* RequestInitialVirtualProcessors(bool doSubscribeCurrentThread) = 0;

参数

doSubscribeCurrentThread
是否订阅当前线程并在资源分配期间对其进行核算。

返回值

如果参数 doSubscribeCurrentThread 的值为 true,则为当前线程的 IExecutionResource 接口。 如果值为 false,则该方法返回 NULL。

备注

在计划程序执行任何工作之前,它应该使用此方法从资源管理器请求虚拟处理器根。 资源管理器将使用 IScheduler::GetPolicy 访问计划程序的策略,并使用策略键 MinConcurrencyMaxConcurrencyTargetOversubscriptionFactor 的值来确定最初分配给计划程序的硬件线程数以及为每个硬件线程创建多少虚拟处理器根。 有关如何使用计划程序策略来确定计划程序的初始分配的详细信息,请参阅 PolicyElementKey

资源管理器通过调用具有虚拟处理器根列表的方法 IScheduler::AddVirtualProcessors 将资源授予计划程序。 在此方法返回之前,该方法作为回调调用到计划程序中。

如果计划程序通过将参数 doSubscribeCurrentThread 设置为 true 来请求订阅当前线程,则该方法返回一个 IExecutionResource 接口。 订阅必须在以后使用 IExecutionResource::Remove 方法终止。

在确定选择了哪些硬件线程时,资源管理器将尝试针对处理器节点关联进行优化。 如果当前线程请求订阅,则表明当前线程打算参与分配给此计划程序的工作。 在这种情况下,如果可能,分配的虚拟处理器根位于当前线程正在执行的处理器节点上。

订阅线程的行为将底层硬件线程的订阅级别增加一。 订阅终止时订阅级别减一。 有关订阅级别的详细信息,请参阅 IExecutionResource::CurrentSubscriptionLevel

ISchedulerProxy::Shutdown 方法

通知资源管理器调度程序正在关闭。 这将导致资源管理器立即收回授予调度程序的所有资源。

virtual void Shutdown() = 0;

备注

计划程序由于使用方法 ISchedulerProxy::RequestInitialVirtualProcessorsISchedulerProxy::SubscribeCurrentThread 订阅外部线程而收到的所有 IExecutionContext 接口必须在计划程序自行关闭之前使用 IExecutionResource::Remove 返回到资源管理器。

如果计划程序有任何已停用的虚拟处理器根,你必须使用 IVirtualProcessorRoot::Activate 激活它们,并让在这些根上执行的线程代理离开它们正在分派的执行上下文的 Dispatch 方法,然后再在计划程序代理上调用 Shutdown

计划程序不需要通过调用 Remove 方法分别返回资源管理器授予它的所有虚拟处理器根,因为关机时所有虚拟处理器根都将返回到资源管理器。

ISchedulerProxy::SubscribeCurrentThread 方法

向资源管理器注册当前线程,将其与此计划程序相关联。

virtual IExecutionResource* SubscribeCurrentThread() = 0;

返回值

IExecutionResource 接口表示运行时中的当前线程。

备注

如果希望资源管理器在将资源分配给计划程序和其他计划程序时考虑当前线程,请使用此方法。 当线程计划参与排在计划程序中的工作以及计划程序从资源管理器接收的虚拟处理器根时,它特别有用。 资源管理器使用信息来防止系统上不必要的硬件线程超额订阅。

通过此方法接收的执行资源应使用 IExecutionResource::Remove 方法返回到资源管理器。 调用 Remove 方法的线程必须与之前调用 SubscribeCurrentThread 方法的线程相同。

订阅线程的行为将底层硬件线程的订阅级别增加一。 订阅终止时订阅级别减一。 有关订阅级别的详细信息,请参阅 IExecutionResource::CurrentSubscriptionLevel

ISchedulerProxy::UnbindContext 方法

取消线程代理与 pContext 参数指定的执行上下文的关联,并将其返回到线程代理工厂的空闲池。 只能在通过 ISchedulerProxy::BindContext 方法绑定且尚未通过作为 IThreadProxy::SwitchTo 方法调用的 pContext 参数启动的执行上下文中调用此方法。

virtual void UnbindContext(_Inout_ IExecutionContext* pContext) = 0;

参数

pContext
要与其线程代理解除关联的执行上下文。

另请参阅

并发命名空间
IScheduler 结构
IThreadProxy 结构
IVirtualProcessorRoot 结构
IResourceManager 结构