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

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

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

Совет

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

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

SchedulerPolicy policy(3,       
   MinConcurrency, 2,
   MaxConcurrency, 4,
   ContextPriority, THREAD_PRIORITY_HIGHEST
);

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

Ключ политики Описание Значение по умолчанию
SchedulerKind Значение concurrency::SchedulerType, указывающее тип потоков, используемых при планировании задач. ThreadScheduler (используйте стандартные потоки). Это единственное допустимое значение для этого ключа.
MaxConcurrency Значение unsigned int , указывающее максимальное количество ресурсов параллелизма, используемых планировщиком. конкурентность::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 Значение параллелизма::DynamicProgressFeedbackType, указывающее, следует ли перебалансировать ресурсы в соответствии со статистической информацией о ходе выполнения.

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

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

Внимание

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

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

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

Пример

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

См. также

Планировщик заданий
Как указать определённые политики планировщика
Как создать агентов, использующих определенные политики планировщика