Экземпляры планировщика
В этом документе описывается роль экземпляров планировщика в среде выполнения параллелизма и использование параллелизма::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 . Если планировщик по умолчанию создается после этого вызова, среда выполнения использует параметры политики по умолчанию для создания планировщика. |
[В начало]
Пример
Основные примеры создания экземпляра планировщика и управления ими см. в статье "Практическое руководство. Управление экземпляром планировщика".
См. также
Планировщик заданий
Практическое руководство. Управление экземпляром планировщика
Политики планировщика
Группы планирования