Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Потоки планируется запускать на основе их приоритет планирования. Каждому потоку назначается приоритет планирования. Уровни приоритета варьируются от нуля (наименьшего приоритета) до 31 (наивысший приоритет). Только поток нулевой страницы может иметь приоритет ноль. Поток нулевой страницы — это системный поток, отвечающий за обнуление свободных страниц, когда другие потоки не нуждаются в выполнении.
Система обрабатывает все потоки с одинаковым приоритетом. Система назначает срезы времени в режиме циклического перебора всем потокам с наивысшим приоритетом. Если ни один из этих потоков не готов к выполнению, система назначает срезы времени в режиме циклического перебора всем потокам с следующим наивысшим приоритетом. Если поток с более высоким приоритетом становится доступным для запуска, система перестает выполнять поток с более низким приоритетом (не позволяя ему завершить срез времени) и назначает срез полного времени потоку с более высоким приоритетом. Дополнительные сведения см. в переключениях контекста.
Приоритет каждого потока определяется следующими критериями:
- Класс приоритета его процесса
- Уровень приоритета потока внутри указанного класса приоритета его процесса
Класс приоритета и уровень приоритета объединяются для формирования базового приоритета потока. Сведения о динамическом приоритете потока см. в разделе Priority Boosts.
Класс приоритета
Каждый процесс принадлежит одному из следующих классов приоритета:
- IDLE_PRIORITY_CLASS
Класс_приоритета_ниже_нормального
Класс_обычного_приоритета
Класс приоритета выше обычного
ХАЙ_ПРИОРИТИ_КЛАСС
КЛАСС ПРИОРИТЕТА РЕАЛЬНОГО ВРЕМЕНИ
По умолчанию класс приоритета процесса — NORMAL_PRIORITY_CLASS. Используйте функцию CreateProcess CreateProcess, чтобы указать класс приоритета дочернего процесса при его создании. Если вызывающий процесс принадлежит к классам IDLE_PRIORITY_CLASS или BELOW_NORMAL_PRIORITY_CLASS, новый процесс унаследует это свойство. Используйте функциюGetPriorityClass, чтобы определить текущий класс приоритета процесса и функцию SetPriorityClass, чтобы изменить класс приоритета процесса.
Процессы, отслеживающие систему, такие как средства сохранения экрана или приложения, которые периодически обновляют дисплей, должны использовать IDLE_PRIORITY_CLASS. Это предотвращает вмешательство потоков этого процесса, не имеющих высокого приоритета, в потоки с более высоким приоритетом.
Используйте HIGH_PRIORITY_CLASS с осторожностью. Если поток выполняется на высоком уровне приоритета в течение длительных периодов, другие потоки в системе не будут получать время процессора. Если одновременно задано несколько потоков с высоким приоритетом, потоки теряют свою эффективность. Класс с высоким приоритетом должен быть зарезервирован для потоков, которые должны реагировать на критически важные события времени. Если приложение выполняет одну задачу, требующую высокоприоритетного класса, а остальные задачи являются обычным приоритетом, используйте SetPriorityClass для временного повышения класса приоритета приложения; затем уменьшите его после завершения критической задачи. Другая стратегия заключается в создании высокоприоритетного процесса, который имеет все свои потоки, блокируемые большую часть времени, и пробуждает потоки только при необходимости выполнения критически важных задач. Важно отметить, что высокоприоритетный поток должен запускаться на короткий срок и только тогда, когда у него есть критически важные задачи для выполнения.
Вы почти никогда не должны использовать REALTIME_PRIORITY_CLASS, так как это прерывает системные потоки, которые управляют вводом мыши, вводом клавиатуры и очисткой фонового диска. Этот класс может быть подходящим для приложений, которые "разговаривают" непосредственно с оборудованием или выполняют краткие задачи, которые должны иметь ограниченные прерывания.
Уровень приоритета
Ниже приведены уровни приоритета в каждом классе приоритета:
- THREAD_PRIORITY_IDLE
НИЗКИЙ_ПРИОРИТЕТ_ПОТОКА
ПРИОРИТЕТ_ПОТОКА_НИЖЕ_НОРМАЛЬНОГО
THREAD_PRIORITY_NORMAL (приоритет потока нормальный)
ПРИОРИТЕТ_ПОТОКА_ВЫШЕ_НОРМАЛЬНОГО THREAD_PRIORITY_ABOVE_NORMAL
НАИВЫСШИЙ_ПРИОРИТЕТ_ПОТОКА
Критический уровень приоритета потока по времени
Все потоки создаются с помощью THREAD_PRIORITY_NORMAL. Это означает, что приоритет потока совпадает с классом приоритета процесса. После создания потока используйте функцию setThreadPriority, чтобы настроить приоритет относительно других потоков в процессе.
Типичная стратегия — использовать THREAD_PRIORITY_ABOVE_NORMAL или THREAD_PRIORITY_HIGHEST для входного потока процесса, чтобы убедиться, что приложение реагирует на пользователя. Фоновые потоки, особенно те, которые являются требовательными к процессору, можно установить на THREAD_PRIORITY_BELOW_NORMAL или THREAD_PRIORITY_LOWEST, чтобы убедиться, что они могут прерываться при необходимости. Однако если у вас есть поток, ожидающий другого потока с более низким приоритетом для выполнения какой-то задачи, обязательно заблокируйте выполнение ожидающего потока с высоким приоритетом. Для этого используйте функцию ожидания , критически важный разделили функцию спящего, SleepExили функцию SwitchToThread. Это предпочтительнее, чем если поток выполняет цикл. В противном случае процесс может застрять, потому что поток с более низким приоритетом никогда не планируется.
Чтобы определить текущий уровень приоритета потока, используйте функцию GetThreadPriority.
Базовый приоритет
Класс приоритета процесса и уровень приоритета потока объединяются для формирования базового приоритета каждого потока.
В следующей таблице показан базовый приоритет для сочетаний классов приоритета процесса и значения приоритета потока.
Класс приоритета процесса | Уровень приоритета потока | Базовый приоритет | |
---|---|---|---|
Класс_приоритета_простоя | THREAD_PRIORITY_IDLE | 1 | |
Самый низкий приоритет нити | 2 | ||
THREAD_PRIORITY_BELOW_NORMAL | 3 | ||
THREAD_PRIORITY_NORMAL | 4 | ||
ПРИОРИТЕТ_ПОТОКА_ВЫШЕ_НОРМАЛЬНОГО | 5 | ||
THREAD_PRIORITY_HIGHEST | 6 | ||
THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
BELOW_NORMAL_PRIORITY_CLASS (класс приоритета ниже нормального) | THREAD_PRIORITY_IDLE | 1 | |
THREAD_PRIORITY_LOWEST (приоритет потока самый низкий) | 4 | ||
ПРИОРИТЕТ_ПОТОКА_НИЖЕ_СРЕДНЕГО | 5 | ||
НОРМАЛЬНЫЙ ПРИОРИТЕТ ПОТОКА | 6 | ||
THREAD_PRIORITY_ABOVE_NORMAL | 7 | ||
ПРИОРИТЕТ_ПОТОКА_НАИВЫСШИЙ | 8 | ||
THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
КЛАСС_НОРМАЛЬНОГО_ПРИОРИТЕТА | THREAD_PRIORITY_IDLE | 1 | |
ПРИОРИТЕТ_НИТЕЙ_НИЖАЙШИЙ | 6 | ||
THREAD_PRIORITY_BELOW_NORMAL | 7 | ||
THREAD_PRIORITY_NORMAL | 8 | ||
ПРИОРИТЕТ_ПОТОКА_ВЫШЕ_НОРМАЛЬНОГО | 9 | ||
ПРИОРИТЕТ_ПОТОКА_НАИВЫСШИЙ | 10 | ||
THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
КЛАСС ПРИОРИТЕТА ВЫШЕ СРЕДНЕГО | THREAD_PRIORITY_IDLE | 1 | |
Приоритет_потока_самый_низкий | 8 | ||
THREAD_PRIORITY_BELOW_NORMAL | 9 | ||
THREAD_PRIORITY_NORMAL | 10 | ||
ПРИОРИТЕТ_ПОТОКА_ВЫШЕ_СРЕДНЕГО | 11 | ||
Приоритет_потока_наивысший | 12 | ||
THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
Класс с высоким приоритетом | THREAD_PRIORITY_IDLE | 1 | |
НИЗШИЙ_ПРИОРИТЕТ_ПОТОКА | 11 | ||
ПРИОРИТЕТ_ПОТОКА_НИЖЕ_СРЕДНЕГО | 12 | ||
Обычный приоритет потока | 13 | ||
ПРИОРИТЕТ_ПОТОКА_ВЫШЕ_НОРМАЛЬНОГО | 14 | ||
Наивысший_приоритет_потока | 15 | ||
Поток_Приоритет_Время_Критичный | 15 | ||
REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 16 | |
Приоритет_потока_Низший | 22 | ||
THREAD_PRIORITY_BELOW_NORMAL | 23 | ||
ОБЫЧНЫЙ_ПРИОРИТЕТ_ПОТОКА | 24 | ||
ПРИОРИТЕТ_ПОТОКА_ВЫШЕ_СРЕДНЕГО | 25 | ||
Самый высокий приоритет потока | 26 | ||
ПРИОРИТЕТ_ПОТОКА_КРИТИЧЕСКОЕ_ВРЕМЯ | 31 |