IScheduler 结构

工作计划程序的抽象的接口。 并发运行时的资源管理器使用此接口与工作计划程序进行通信。

语法

struct IScheduler;

成员

公共方法

名称 描述
IScheduler::AddVirtualProcessors 为调度器提供一组虚拟处理器根供其使用。 每个 IVirtualProcessorRoot 接口代表执行单个线程的权利,该线程可以代表调度器执行工作。
IScheduler::GetId 返回计划程序的唯一标识符。
IScheduler::GetPolicy 返回调度器策略的副本。 有关调度器策略的详细信息,请参阅 SchedulerPolicy
IScheduler::NotifyResourcesExternallyBusy 向此调度器通知数组 ppVirtualProcessorRoots 中的虚拟处理器根集表示的硬件线程现在正由其他调度器使用。
IScheduler::NotifyResourcesExternallyIdle 向此调度器通知数组 ppVirtualProcessorRoots 中的虚拟处理器根集表示的硬件线程未由其他调度器使用。
IScheduler::RemoveVirtualProcessors 启动删除先前分配到此调度器的虚拟处理器根的操作。
IScheduler::Statistics 提供与任务抵达率和完成率相关的信息,以及调度器的队列长度变化。

注解

如果你要实现与资源管理器通信的自定义调度器,则应提供 IScheduler 接口的实现。 此接口是调度器与 Azure 资源管理器之间的双向通信通道的一端。 另一端由 Azure 资源管理器实现的 IResourceManagerISchedulerProxy 接口表示。

继承层次结构

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 结构