Поделиться через


Экземпляры планировщика

В этом документе описывается роль экземпляров планировщика в среде выполнения параллелизма и использование параллелизма::Scheduler и параллелизма::CurrentScheduler для создания экземпляров планировщика и управления ими. Экземпляры планировщика полезны, если требуется связать явные политики планирования с определенными типами рабочих нагрузок. Например, можно создать один экземпляр планировщика для выполнения некоторых задач с повышенным приоритетом потока и использовать планировщик по умолчанию для выполнения задач с обычным приоритетом потока.

Совет

Среда выполнения с параллелизмом предоставляет планировщик по умолчанию, и таким образом не требуется создавать планировщик в приложении. Так как планировщик задач помогает точно настроить производительность приложений, рекомендуется начать с библиотеки параллельных шаблонов (PPL) или библиотеки асинхронных агентов, если вы не знакомы со средой выполнения параллелизма.

Разделы

Классы Планировщика и CurrentScheduler

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

Поток, подключенный к планировщику, называется контекстом выполнения или просто контекстом. Один планировщик может быть активным в текущем контексте в любое время. Активный планировщик также называется текущим планировщиком. Среда выполнения параллелизма использует класс параллелизма::CurrentScheduler для предоставления доступа к текущему планировщику. Текущий планировщик для одного контекста может отличаться от текущего планировщика для другого контекста. Среда выполнения не предоставляет представление текущего планировщика на уровне процесса.

Как правило, CurrentScheduler класс используется для доступа к текущему планировщику. Класс Scheduler полезен, если необходимо управлять планировщиком, который не является текущим.

В следующих разделах описывается создание экземпляра планировщика и управление им. Полный пример, демонстрирующий эти задачи, см. в статье "Практическое руководство. Управление экземпляром планировщика".

[В начало]

Создание экземпляра планировщика

Существует три способа создания Scheduler объекта:

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

  • Метод параллелизма::CurrentScheduler::Create создает Scheduler объект, который использует определенную политику и связывает планировщика с текущим контекстом.

  • Метод параллелизма::Scheduler::Create создает Scheduler объект, использующий определенную политику, но не связывает его с текущим контекстом.

Разрешение среды выполнения создавать планировщик по умолчанию позволяет всем параллельным задачам совместно использовать один планировщик. Как правило, функции, предоставляемые библиотекой параллельных шаблонов (PPL) или библиотекой асинхронных агентов, используются для параллельной работы. Поэтому вам не нужно работать непосредственно с планировщиком для управления политикой или временем существования. При использовании PPL или библиотеки агентов среда выполнения создает планировщик по умолчанию, если он не существует и делает его текущим планировщиком для каждого контекста. При создании планировщика и его настройке в качестве текущего планировщика среда выполнения использует этот планировщик для планирования задач. Создайте дополнительные экземпляры планировщика только в том случае, если требуется определенная политика планирования. Дополнительные сведения о политиках, связанных с планировщиком, см. в разделе "Политики планировщика".

[В начало]

Управление временем существования экземпляра планировщика

Среда выполнения использует механизм подсчета Scheduler ссылок для управления временем существования объектов.

При использовании метода или Scheduler::Create метода для создания Scheduler объекта среда выполнения задает начальное CurrentScheduler::Create число ссылок этого планировщика одному. Среда выполнения увеличивает число ссылок при вызове метода параллелизма::Scheduler::Attach . Метод Scheduler::Attach связывает Scheduler объект с текущим контекстом. Это делает его текущим планировщиком. При вызове CurrentScheduler::Create метода среда выполнения создает Scheduler объект и присоединяет его к текущему контексту (и задает счетчик ссылок одному). Для увеличения числа Scheduler ссылок объекта можно также использовать метод параллелизма::Scheduler::Reference.

Среда выполнения уменьшает количество ссылок при вызове метода параллелизма::CurrentScheduler::D etach для отключения текущего планировщика или вызова метода параллелизма::Scheduler::Release . Когда число ссылок достигает нуля, среда выполнения уничтожает Scheduler объект после завершения всех запланированных задач. Выполняющаяся задача может увеличить число ссылок текущего планировщика. Таким образом, если число ссылок достигает нуля, а задача увеличивает число ссылок, среда выполнения не уничтожает Scheduler объект до тех пор, пока счетчик ссылок снова не достигнет нуля и все задачи завершатся.

Среда выполнения поддерживает внутренний стек объектов для каждого контекста Scheduler . При вызове Scheduler::Attach или CurrentScheduler::Create методе среда выполнения отправляет этот Scheduler объект в стек для текущего контекста. Это делает его текущим планировщиком. При вызове CurrentScheduler::Detachсреда выполнения появляется текущий планировщик из стека для текущего контекста и задает предыдущий планировщик в качестве текущего планировщика.

Среда выполнения предоставляет несколько способов управления временем существования экземпляра планировщика. В следующей таблице показан соответствующий метод, который освобождает или отсоединяет планировщика от текущего контекста для каждого метода, создающего или присоединяющего планировщика к текущему контексту.

Создание или присоединение метода Метод выпуска или отсоединения
CurrentScheduler::Create CurrentScheduler::Detach
Scheduler::Create Scheduler::Release
Scheduler::Attach CurrentScheduler::Detach
Scheduler::Reference Scheduler::Release

Вызов недопустимого метода выпуска или отсоединения приводит к непреднамеренному поведению во время выполнения.

При использовании функциональных возможностей, например PPL, что приводит к созданию планировщика по умолчанию, не выпускайте или отключайте этот планировщик. Среда выполнения управляет временем существования любого планировщика, который он создает.

Так как среда выполнения не уничтожает Scheduler объект до завершения всех задач, можно использовать метод параллелизма::Scheduler::RegisterShutdownEvent или метод параллелизма::CurrentScheduler::RegisterShutdownEvent для получения уведомления при Scheduler уничтожении объекта. Это полезно, когда необходимо ожидать завершения каждой задачи, запланированной Scheduler объектом.

[В начало]

Методы и компоненты

В этом разделе приведены важные методы и Scheduler классыCurrentScheduler.

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

В следующей таблице показаны важные методы, определенные классом CurrentScheduler .

Метод Description
Создание Scheduler Создает объект, использующий указанную политику, и связывает его с текущим контекстом.
Get Извлекает указатель на Scheduler объект, связанный с текущим контекстом. Этот метод не увеличивает число Scheduler ссылок объекта.
Отсоединить Отсоединяет текущий планировщик от текущего контекста и задает предыдущий планировщик в качестве текущего планировщика.
RegisterShutdownEvent Регистрирует событие, которое задает среда выполнения при уничтожении текущего планировщика.
CreateScheduleGroup Создает объект параллелизма::ScheduleGroup в текущем планировщике.
ScheduleTask Добавляет упрощенную задачу в очередь планирования текущего планировщика.
GetPolicy Извлекает копию политики, связанной с текущим планировщиком.

В следующей таблице показаны важные методы, определенные классом Scheduler .

Метод Description
Создание Scheduler Создает объект, использующий указанную политику.
Присоединить Связывает Scheduler объект вместе с текущим контекстом.
Справочные материалы Увеличивает счетчик Scheduler ссылок объекта.
Выпуск Уменьшает счетчик Scheduler ссылок объекта.
RegisterShutdownEvent Регистрирует событие, которое среда выполнения задает при Scheduler уничтожении объекта.
CreateScheduleGroup Создает объект параллелизма::ScheduleGroup в объектеScheduler.
ScheduleTask Планирует упрощенную задачу из Scheduler объекта.
GetPolicy Извлекает копию политики, связанной с Scheduler объектом.
SetDefaultSchedulerPolicy Задает политику среды выполнения, используемую при создании планировщика по умолчанию.
ResetDefaultSchedulerPolicy Восстанавливает политику по умолчанию до активного перед вызовом SetDefaultSchedulerPolicy. Если планировщик по умолчанию создается после этого вызова, среда выполнения использует параметры политики по умолчанию для создания планировщика.

[В начало]

Пример

Основные примеры создания экземпляра планировщика и управления ими см. в статье "Практическое руководство. Управление экземпляром планировщика".

См. также

Планировщик заданий
Практическое руководство. Управление экземпляром планировщика
Политики планировщика
Группы планирования