IScheduler 结构
工作计划程序的抽象的接口。 并发运行时的资源管理器使用此接口与工作计划程序进行通信。
语法
struct IScheduler;
成员
公共方法
名称 | 描述 |
---|---|
IScheduler::AddVirtualProcessors | 为调度器提供一组虚拟处理器根供其使用。 每个 IVirtualProcessorRoot 接口代表执行单个线程的权利,该线程可以代表调度器执行工作。 |
IScheduler::GetId | 返回计划程序的唯一标识符。 |
IScheduler::GetPolicy | 返回调度器策略的副本。 有关调度器策略的详细信息,请参阅 SchedulerPolicy。 |
IScheduler::NotifyResourcesExternallyBusy | 向此调度器通知数组 ppVirtualProcessorRoots 中的虚拟处理器根集表示的硬件线程现在正由其他调度器使用。 |
IScheduler::NotifyResourcesExternallyIdle | 向此调度器通知数组 ppVirtualProcessorRoots 中的虚拟处理器根集表示的硬件线程未由其他调度器使用。 |
IScheduler::RemoveVirtualProcessors | 启动删除先前分配到此调度器的虚拟处理器根的操作。 |
IScheduler::Statistics | 提供与任务抵达率和完成率相关的信息,以及调度器的队列长度变化。 |
注解
如果你要实现与资源管理器通信的自定义调度器,则应提供 IScheduler
接口的实现。 此接口是调度器与 Azure 资源管理器之间的双向通信通道的一端。 另一端由 Azure 资源管理器实现的 IResourceManager
和 ISchedulerProxy
接口表示。
继承层次结构
IScheduler
要求
标头:concrtrm.h
命名空间: 并发
IScheduler::AddVirtualProcessors 方法
为调度器提供一组虚拟处理器根供其使用。 每个 IVirtualProcessorRoot
接口代表执行单个线程的权利,该线程可以代表调度器执行工作。
virtual void AddVirtualProcessors(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
参数
ppVirtualProcessorRoots
一个 IVirtualProcessorRoot
接口数组,表示要添加到调度器的虚拟处理器根。
count
数组中 IVirtualProcessorRoot
接口的数量。
备注
资源管理器调用 AddVirtualProcessor
方法将一组初始虚拟处理器根授予调度器。 当它重新平衡调度器之间的资源时,它也可以调用该方法将虚拟处理器根添加到调度器。
IScheduler::GetId 方法
返回计划程序的唯一标识符。
virtual unsigned int GetId() const = 0;
返回值
唯一的整数标识符。
注解
在将接口用作资源管理器提供的方法的参数之前,应使用 GetSchedulerId 函数来获取实现 IScheduler
接口的对象的唯一标识符。 调用 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
接口的数量。
备注
可以同时将一个特定的硬件线程分配到多个调度器。 执行此操作的一种可能原因是在不共享资源的情况下,系统上没有足够的硬件线程用于满足所有调度器的最小并发性。 另一种可能原因是,拥有方调度器未使用的资源已临时分配到其他调度器,分配方式是停用该硬件线程上的所有虚拟处理器根。
硬件线程的订阅级别由订阅的线程数量以及与该硬件线程关联的已激活虚拟处理器根表示。 从特定调度器的角度看,硬件线程的外部订阅级别是其他调度器贡献的订阅部分。 当硬件线程的外部订阅级别从零转变为正区域时,将向调度器发送资源外部繁忙的通知。
通过此方法发送的通知只会发送到其中某个策略的 MinConcurrency
策略键值等于 MaxConcurrency
策略键值的调度器。 有关调度器策略的详细信息,请参阅 SchedulerPolicy。
符合通知条件的调度器在创建时会收到一组初始通知,告知刚刚为它分配的资源在外部是处于繁忙还是空闲状态。
IScheduler::NotifyResourcesExternallyIdle 方法
向此调度器通知数组 ppVirtualProcessorRoots
中的虚拟处理器根集表示的硬件线程未由其他调度器使用。
virtual void NotifyResourcesExternallyIdle(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
参数
ppVirtualProcessorRoots
与硬件线程关联的 IVirtualProcessorRoot
接口数组,其他调度器在这些线程上将变得空闲。
count
数组中 IVirtualProcessorRoot
接口的数量。
备注
可以同时将一个特定的硬件线程分配到多个调度器。 执行此操作的一种可能原因是在不共享资源的情况下,系统上没有足够的硬件线程用于满足所有调度器的最小并发性。 另一种可能原因是,拥有方调度器未使用的资源已临时分配到其他调度器,分配方式是停用该硬件线程上的所有虚拟处理器根。
硬件线程的订阅级别由订阅的线程数量以及与该硬件线程关联的已激活虚拟处理器根表示。 从特定调度器的角度看,硬件线程的外部订阅级别是其他调度器贡献的订阅部分。 当硬件线程的外部订阅级别从先前的正值降至零时,将向调度器发送资源外部繁忙的通知。
通过此方法发送的通知只会发送到其中某个策略的 MinConcurrency
策略键值等于 MaxConcurrency
策略键值的调度器。 有关调度器策略的详细信息,请参阅 SchedulerPolicy。
符合通知条件的调度器在创建时会收到一组初始通知,告知刚刚为它分配的资源在外部是处于繁忙还是空闲状态。
IScheduler::RemoveVirtualProcessors 方法
启动删除先前分配到此调度器的虚拟处理器根的操作。
virtual void RemoveVirtualProcessors(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
参数
ppVirtualProcessorRoots
一个 IVirtualProcessorRoot
接口数组,表示要删除的虚拟处理器根。
count
数组中 IVirtualProcessorRoot
接口的数量。
备注
资源管理器调用 RemoveVirtualProcessors
方法从调度器中取回一组虚拟处理器根。 处理完虚拟处理器根后,调度器预期会在每个接口上调用 Remove 方法。 在 IVirtualProcessorRoot
接口上调用 Remove
方法后,请不要使用该接口。
参数 ppVirtualProcessorRoots
指向一个接口数组。 在要删除的虚拟处理器根集中,可以使用 Remove
方法立即返回从未激活的根。 应以异步方式返回已激活并正在执行工作,或者已停用并正在等待工作抵达的根。 调度器必须尽最大努力尽快删除虚拟处理器根。 延迟删除虚拟处理器根可能导致调度器中发生意外的过度订阅。
IScheduler::Statistics 方法
提供与任务抵达率和完成率相关的信息,以及调度器的队列长度变化。
virtual void Statistics(
_Out_ unsigned int* pTaskCompletionRate,
_Out_ unsigned int* pTaskArrivalRate,
_Out_ unsigned int* pNumberOfTasksEnqueued) = 0;
参数
pTaskCompletionRate
自上次调用此方法以来调度器已完成的任务数。
pTaskArrivalRate
自上次调用此方法以来已抵达调度器的任务数。
pNumberOfTasksEnqueued
所有调度器队列中的任务总数。
注解
资源管理器调用此方法来收集调度器的统计信息。 此处收集的统计信息用于驱动动态反馈算法,以确定何时适合将更多资源分配到调度器,以及何时适合释放资源。 调度器提供的值可以是乐观的,不一定非要准确反映当前计数。
如果希望资源管理器使用有关任务到达等的反馈来确定如何平衡您的计划程序和向资源管理器注册的其他计划程序之间的资源,则应实现此方法。 如果你选择不收集统计信息,可以在调度器的策略中将策略键 DynamicProgressFeedback
设置为值 DynamicProgressFeedbackDisabled
,资源管理器不会在调度器上调用此方法。
在没有统计信息的情况下,资源管理器将使用硬件线程订阅级别来做出资源分配和迁移的决策。 有关订阅级别的详细信息,请参阅 IExecutionResource::CurrentSubscriptionLevel。
另请参阅
并发命名空间
PolicyElementKey
SchedulerPolicy 类
IExecutionContext 结构
IThreadProxy 结构
IVirtualProcessorRoot 结构
IResourceManager 结构