Планирование потоков в ос Windows
Процессорное время — ограниченный ресурс, поэтому планирование — важная и критичная для производительности операция. Один из ключевых вопросов — выбор момента для запуска процедуры планирования. В системе реализовано приоритетное вытесняющее планирование с динамическими приоритетами. Для удобства пользователя и мобильности программ поддерживается слой абстрагирования приоритетов. Механизмы привязки позволяют организовать эффективное исполнение программ в многопроцессорных системах
Введение
Выбор текущего потока из нескольких активных потоков, пытающихся получить доступ к процессору, называется планированием. Планирование – очень важная и критичная для производительности операция, поэтому система предоставляет много рычагов для ее гибкой настройки.
Выбранный для выполнения поток работает в течение некоего периода, называемого квантом, по истечении которого поток вытесняется, то есть процессор передается другому потоку. Предполагается, что поток не знает, в какой момент он будет вытеснен. Поток также может быть вытеснен даже, если его квант еще не истек. Это происходит, когда к выполнению готов поток с более высоким приоритетом.
Процедура планирования обычно связана с весьма затратной процедурой диспетчеризации – переключением процессора на новый поток, поэтому планировщик должен заботиться об эффективном использовании процессора. Принадлежность потоков к процессу при планировании не учитывается, то есть единицей планирования в ОС Windows является именно поток. Запуск процедуры планирования удобно проиллюстрировать на упрощенной (по сравнению с диаграммой, изображенной в предыдущей лекции) диаграмме состояний потока, см. рис. 8.1.
Рис. 8.1. Упрощенная диаграмма состояний потоков в ОС Windows
Наиболее важным вопросом планирования является выбор момента для принятия решения. В ОС Windows запуск процедуры планирования вызывается одним из следующих событий.
Это, во-первых, события, связанные с освобождением процессора.
(1) Завершение потока
(2) Переход потока в состояние готовности в связи с тем, что его квант времени истек
(3) Переход потока в состояние ожидания
Во-вторых, это события, в результате которых пополняется или может пополниться очередь потоков в состоянии готовности.
(4) Поток вышел из состояния ожидания
(5) Поток только что создан
(6) Деятельность текущего потока может иметь следствием вывод другого потока из состояния ожидания.
В последнем случае выведенный из состояния ожидания поток может сразу же начать выполняться, если имеет высокий приоритет.
Наконец, процедура планирования может быть запущена, если изменяется приоритет потока в результате вызова системного сервиса или самой Windows, а также если изменяется привязка (affinity) потока к процессору, из-за чего поток не может больше выполняться на текущем процессоре.
Заметим, что переключение из пользовательского режима в режим ядра (и обратно) не влияет на планирование потока, так как контекст в этом случае не меняется.
В результате операции планирования система может определить, какой поток выполнять следующим, и переключить контексты старого и нового потоков. В системе нет центрального потока планировщика. Программный код, отвечающий за планирование и диспетчеризацию, рассредоточен по ядру. В случаях 1-3 процедуры планирования работают в контексте текущего потока, который запускает программу планировщика для выбора преемника и потенциальной загрузки его контекста.
Перевод потока из состояния ожидания в состояние готовности (вариант 4) может быть следствием прерывания, свидетельствующим об окончании операции ввода-вывода. В этом случае процедура планирования может быть отложена (deffered procedure call) до окончания выполнения высокоприоритетного системного кода.
Иногда подобный переход происходит в результате деятельности другого потока, который, например, выполнил операцию up на семафоре (пример 6-го варианта). Хотя этот другой поток и может продолжить работу, он должен запустить процедуру планирования, поскольку в очереди готовности могут оказаться потоки с более высоким приоритетом. По тем же причинам планирование осуществляется в случае запуска нового потока.
Алгоритмы планирования
Приоритеты
В ОС Windows реализовано вытесняющее приоритетное планирование, когда каждому потоку присваивается определенное числовое значение – приоритет, в соответствии с которым ему выделяется процессор. Потоки с одинаковыми приоритетами планируются согласно алгоритму Round Robin (карусель). Важным достоинством системы является возможность вытеснения потоков, работающих в режиме ядра – код исполнительной системы полностью реентерабелен. Не вытесняются лишь потоки, удерживающие спин-блокировку Поэтому спин-блокировки используются с большой осторожностью и устанавливаются на минимальное время.
В системе предусмотрено 32 уровня приоритетов. Шестнадцать значений приоритетов (16-31) соответствуют группе приоритетов реального времени, пятнадцать значений (1-15) предназначены для обычных потоков, и значение 0 зарезервировано для системного потока обнуления страниц (см. рис. 8.2).
Рис. 8.2. Приоритеты потоков
Чтобы избавить пользователя от необходимости запоминать числовые значения приоритетов и иметь возможность модифицировать планировщик, разработчики ввели в систему слой абстрагирования приоритетов. Например, класс приоритета для всех потоков конкретного процесса можно задать с помощью набора констант-параметров функции SetPriorityClass, которые могут иметь следующие значения:
реального времени (REALTIME_PRIORITY_CLASS),
высокий (HIGH_PRIORITY_CLASS),
выше нормы (ABOVE_NORMAL_PRIORITY_CLASS),
нормальный (NORMAL_PRIORITY_CLASS),
ниже нормы (BELOW_NORMAL_PRIORITY_CLASS)
и неработающий (IDLE_PRIORITY_CLASS).
Относительный приоритет потока устанавливается аналогичными параметрами функции SetThreadPriority:
Совокупность из шести классов приоритетов процессов и семи классов приоритетов потоков образует 42 возможные комбинации и позволяет сформировать так называемый базовый приоритет потока (см. таб. 8.1).
Таблица 8.1. Формирование базового приоритета потока из класса приоритета процесса и относительного приоритета потока |
|||||||
|
Приоритеты потоков |
||||||
Классы приоритетов процессов |
Критичный ко времени |
Самый высокий |
Выше нормы |
Нормальный |
Ниже нормы |
Самый низкий |
Неработающий |
Неработающий |
15 |
6 |
5 |
4 |
3 |
2 |
1 |
Ниже нормы |
15 |
8 |
7 |
6 |
5 |
4 |
1 |
Нормальный |
15 |
10 |
9 |
8 |
7 |
6 |
1 |
Выше нормы |
15 |
12 |
11 |
10 |
9 |
8 |
1 |
Высокий |
15 |
15 |
14 |
13 |
12 |
11 |
1 |
Реального времени |
31 |
26 |
25 |
24 |
23 |
22 |
16 |
Базовый приоритет процесса и первичного потока по умолчанию равен значению из середины диапазонов приоритетов процессов (24, 13, 10, 8, 6 или 4). Смена приоритета процесса влечет за собой смену приоритетов всех его потоков, при этом их относительные приоритеты остаются без изменений.
Приоритеты с 16 по 31 в действительности приоритетами реального времени не являются, поскольку в рамках поддержки мягкого реального времени, которая реализована в ОС Windows, никаких гарантий относительно сроков выполнения потоков не дается. Это просто более высокие приоритеты, которые зарезервированы для системных потоков и тех потоков, которым такой приоритет дает пользователь с административными правами. Тем не менее, наличие приоритетов реального времени, а также вытесняемость кода ядра, локализация страниц памяти и ряд дополнительных возможностей – все это позволяет выполнять в среде ОС Windows приложения мягкого реального времени, например, мультимедийные. Системный поток с нулевым приоритетом занимается обнулением страниц памяти. Обычные пользовательские потоки могут иметь приоритеты от 1 до 15.