Структура 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