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

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

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

Совет

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

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

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

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

Ключ политики Description Значение по умолчанию
SchedulerKind Значение параллелизма::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 Значение параллелизма::SchedulingProtocolType, указывающее используемый алгоритм планирования. EnhanceScheduleGroupLocality
DynamicProgressFeedback Значение параллелизма::D ynamicProgressFeedbackType, указывающее, следует ли перебалансировать ресурсы в соответствии со сведениями о ходе выполнения на основе статистики.

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

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

Важно!

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

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

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

Пример

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

См. также

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