Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Интерфейс для абстракции планировщика работы. Диспетчер ресурсов среды выполнения с параллелизмом использует этот интерфейс для взаимодействия с планировщиками работы.
Синтаксис
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, которые реализованы диспетчером ресурсов.
Иерархия наследования
IScheduler
Требования
Заголовок: concrtrm.h
Пространство имен: конкурентность
Метод 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;
Возвращаемое значение
Уникальный целочисленный идентификатор.
Замечания
Перед использованием интерфейса в качестве параметра для методов, предложенных диспетчером ресурсов, следует использовать функцию 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 интерфейсов в массиве.
Замечания
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 не вызовет этот метод на планировщике.
При отсутствии статистической информации диспетчер ресурсов будет использовать уровни подписки на аппаратные потоки для принятия решений о распределении ресурсов и миграции. Дополнительные сведения об уровнях подписки см. в разделе IExecutionResource::CurrentSubscriptionLevel.
См. также
Пространство имен параллелизм
PolicyElementKey
Класс SchedulerPolicy
Структура IExecutionContext
Структура IThreadProxy
Структура IVirtualProcessorRoot
Структура IResourceManager