Политики планировщика

 

Самая актуальная документация по Visual Studio 2017: Документация по Visual Studio 2017.

В этом документе описана роль политик планировщика в среде выполнения с параллелизмом. Политика планировщика определяет стратегию, которую планировщик использует при управлении задачами. Например, рассмотрим приложение, которое требует выполнение некоторых задач с THREAD_PRIORITY_NORMAL и других задач с THREAD_PRIORITY_HIGHEST. Можно создать два экземпляра планировщика: один задает политику ContextPriority THREAD_PRIORITY_NORMAL, а второй определяет ту же политику как THREAD_PRIORITY_HIGHEST.

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

System_CAPS_ICON_tip.jpg Совет

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

При использовании метода concurrency::CurrentScheduler::Create, concurrency::Scheduler::Create или concurrency::Scheduler::SetDefaultSchedulerPolicy для создания экземпляра планировщика следует предоставить объект concurrency::SchedulerPolicy, содержащий набор пар ключ-значение, определяющих поведение планировщика. Конструктор SchedulerPolicy принимает переменное число аргументов. Первый аргумент — количество элементов политики, которые собирается задать пользователь. Остальные аргументы представляют собой пары "ключ-значение" для каждого элемента политики. В следующем примере создается объект SchedulerPolicy, задающий три элемента политики. Среда выполнения использует для незаданных ключей политики значения по умолчанию.

No code example is currently available or this language may not be supported.

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

Ключ политикиОписаниеЗначение по умолчанию
SchedulerKindЗначение concurrency::SchedulerType, задающее тип потоков для планирования задач.ThreadScheduler (использование стандартных потоков) Это единственное допустимое значение для этого ключа.
MaxConcurrencyЗначение unsigned int, задающее максимальное количество ресурсов параллелизма, которые используются планировщиком.concurrency::MaxExecutionResources
MinConcurrencyЗначение unsigned int, задающее минимальное количество ресурсов параллелизма, которые используются планировщиком.1
TargetOversubscriptionFactorЗначение unsigned int, задающее, сколько потоков необходимо выделить каждому ресурсу для обработки.1
LocalContextCacheSizeЗначение unsigned int, задающее максимальное число контекстов, которые можно кэшировать в локальной очереди каждого виртуального процессора.8
ContextStackSizeЗначение unsigned int, задающее размер стека (в килобайтах), который необходимо зарезервировать для каждого контекста.0 (использовать размер стека по умолчанию)
ContextPriorityЗначение int, задающее потоковый приоритет каждого контекста. Это может быть любое значение, которое можно передать SetThreadPriority или INHERIT_THREAD_PRIORITY.THREAD_PRIORITY_NORMAL
SchedulingProtocolЗначение concurrency::SchedulingProtocolType, задающее используемый алгоритм планирования.EnhanceScheduleGroupLocality
DynamicProgressFeedbackЗначение concurrency::DynamicProgressFeedbackType, задающее, нужно ли перераспределять ресурсы в соответствии со статистическими данными о ходе выполнения.

 Примечание Не устанавливайте этой политике значение ProgressFeedbackDisabled, поскольку оно зарезервировано для использования средой выполнения.
ProgressFeedbackEnabled

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

System_CAPS_ICON_important.jpg Важно

Для управления атрибутами потоков, создаваемых средой выполнения, следует использовать только политики планировщиков. Не изменяйте сходство или приоритет потоков, созданных средой выполнения, поскольку это приводит к неопределенному поведению.

Среда выполнения с параллелизмом создает планировщик по умолчанию, если он не создан явно. Если вы хотите использовать в приложении планировщик по умолчанию, но при этом ему нужно задать политику, вызовите метод concurrency::Scheduler::SetDefaultSchedulerPolicy перед планированием параллельной работы. Если не вызывается метод Scheduler::SetDefaultSchedulerPolicy, среда выполнения использует значения политики по умолчанию из таблицы.

Для извлечения копии политики планировщика необходимо использовать методы concurrency::CurrentScheduler::GetPolicy и concurrency::Scheduler::GetPolicy. Значения политики, полученные от этих методов, могут отличаться от значений политики, задаваемых при создании планировщика.

Пример

Примеры, в которых конкретные политики планировщика используются для контроля поведения планировщика, см. в разделах Практическое руководство. Задание определенных политик планировщика и Практическое руководство. Создание агентов, использующих определенные политики планировщика.

См. также

Планировщик задач
Практическое руководство. Задание определенных политик планировщика
Практическое руководство. Создание агентов, использующих определенные политики планировщика