Структура IScheduler

Интерфейс для абстракции планировщика работы. Диспетчер ресурсов среды выполнения с параллелизмом использует этот интерфейс для взаимодействия с планировщиками работы.

Синтаксис

struct IScheduler;

Участники

Открытые методы

Имя Описание
IScheduler::AddVirtualProcessors Предоставляет планировщик с набором корней виртуального процессора для его использования. Каждый IVirtualProcessorRoot интерфейс представляет право выполнить один поток, который может выполнять работу от имени планировщика.
IScheduler::GetId Возвращает уникальный идентификатор планировщика.
IScheduler::GetPolicy Возвращает копию политики планировщика. Дополнительные сведения о политиках планировщика см. в разделе SchedulerPolicy.
IScheduler::NotifyResourcesExternallyBusy Уведомляет этот планировщик о том, что аппаратные потоки, представленные набором корней виртуальных процессоров в массиве ppVirtualProcessorRoots , теперь используются другими планировщиками.
IScheduler::NotifyResourcesExternallyIdle Уведомляет этот планировщик о том, что аппаратные потоки, представленные набором корней виртуальных процессоров в массиве ppVirtualProcessorRoots , не используются другими планировщиками.
IScheduler::RemoveVirtualProcessors Инициирует удаление корней виртуального процессора, которые ранее были выделены для этого планировщика.
IScheduler::Statistics Предоставляет сведения, связанные с скоростью прибытия и завершения задачи, а также изменение длины очереди планировщика.

Замечания

Если вы реализуете пользовательский планировщик, взаимодействующий с Resource Manager, необходимо предоставить реализацию IScheduler интерфейса. Этот интерфейс является одним из двухстороннего канала обмена данными между планировщиком и Диспетчером ресурсов. Другой конец представлен интерфейсами IResourceManager , ISchedulerProxy реализованными Resource Manager.

Иерархия наследования

IScheduler

Требования

Заголовок: concrtrm.h

Пространство имен: concurrency

Метод IScheduler::AddVirtualProcessors

Предоставляет планировщик с набором корней виртуального процессора для его использования. Каждый IVirtualProcessorRoot интерфейс представляет право выполнить один поток, который может выполнять работу от имени планировщика.

virtual void AddVirtualProcessors(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Параметры

ppVirtualProcessorRoots
Массив интерфейсов, представляющих корни виртуального IVirtualProcessorRoot процессора, добавляемые в планировщик.

count
Количество IVirtualProcessorRoot интерфейсов в массиве.

Замечания

Resource Manager вызывает AddVirtualProcessor метод, чтобы предоставить начальный набор корней виртуального процессора планировщику. Он также может вызвать метод, чтобы добавить корневы виртуальных процессоров в планировщик, когда он перебалансирует ресурсы между планировщиками.

Метод IScheduler::GetId

Возвращает уникальный идентификатор планировщика.

virtual unsigned int GetId() const = 0;

Возвращаемое значение

Уникальный целочисленный идентификатор.

Замечания

Для получения уникального идентификатора объекта, реализующего IScheduler интерфейс, следует использовать функцию GetSchedulerId, прежде чем использовать интерфейс в качестве параметра для методов, предоставленных Resource Manager. Ожидается, что при вызове функции возвращается тот же идентификатор 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 интерфейсов в массиве.

Замечания

Resource Manager вызывает 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 в политике планировщика, и Resource Manager не вызовет этот метод на планировщике.

В отсутствие статистической информации Resource Manager будет использовать уровни подписки на поток оборудования для принятия решений о выделении ресурсов и миграции. Дополнительные сведения об уровнях подписки см. в разделе IExecutionResource::CurrentSubscriptionLevel.

См. также

Пространство имен concurrency
PolicyElementKey
Класс SchedulerPolicy
Структура IExecutionContext
Структура IThreadProxy
Структура IVirtualProcessorRoot
Структура IResourceManager