- •Лекция 7. Планирование потоков
- •Алгоритмы планирования
- •Вытесняющие/невытесняющие алгоритмы.
- •Алгоритмы с квантованием.
- •Алгоритмы с приоритетами.
- •Состояния потоков
- •Приоритеты
- •Переход выполняющегося потока в состояние ожидания.
- •Вытеснение потоком с большим приоритетом.
- •Завершение кванта времени
- •Динамическое повышение приоритета
- •Алгоритм планирования в Windows
- •Выбор потока на выполнение.
Приоритеты
В операционной системе Windows имеется 32 уровня приоритета – от 0 до 31 (рис. 3).
Рис. 3. Приоритеты в Windows
Приоритеты назначаются процессам и потокам. У процесса имеется единственный приоритет, который называется базовым. Значение этого приоритета хранится в поле BasePriority структуры KPROCESS (файл base\ntos\inc\ke.h, строка 1028). В WinAPI для работы с базовым приоритетом процесса используются классы приоритета (например, REALTIME, NORMAL и т. д.); соответствие классов приоритета числовым значениям показано на рис. 3. Например, при создании процесса можно указать класс приоритета в качестве параметра WinAPI-функции CreateProcess, иначе будет установлен приоритет по умолчанию (см. лекцию 6 «Процессы и потоки», раздел «Создание процесса»). В дальнейшем класс приоритета процесса можно изменить при помощи WinAPI-функции SetPriorityClass.
В WRK структура PROCESS_PRIORITY_CLASS и значения соответствующих констант (заметьте, что эти значения не совпадают с числовыми значениями приоритетов) определены в файле public\sdk\inc\ntpsapi.h (строка 399). Класс приоритета процесса хранится в поле PriorityClass структуры EPROCESS (см. лекцию 6 «Процессы и потоки», раздел «Структуры данных для процессов и потоков»). Таким образом, если, например, процессу назначен класс приоритета High, то в поле PriorityClass запишется число 3 (значение константы PROCESS_PRIORITY_CLASS_HIGH), в поле BasePriority – значение 13 (соответствующее числовое значение приоритета).
Поток имеет два значения приоритета – базовый и текущий. При создании потока базовый приоритет потока принимается равным базовому приоритету процесса-владельца. Можно изменить базовый приоритет потока при помощи WinAPI-функции SetThreadPriority. Параметрами этой функции являются дескриптор потока и относительный приоритет, который определяет смещение базового приоритета (таблица 1).
Таблица 1. Влияние относительных приоритетов
Относительный приоритет |
Смещение для динамических приоритетов |
Смещение для приоритетов реального времени |
Time Critical |
Базовый приоритет = 15 |
Базовый приоритет = 31 |
Highest |
+2 |
+2 |
Above Normal |
+1 |
+1 |
Normal |
0 |
0 |
Below Normal |
–1 |
–1 |
Lowest |
–2 |
–2 |
Idle |
Базовый приоритет = 1 |
Базовый приоритет = 16 |
Пример. Имеется процесс с базовым приоритетом Below Normal (6). Поток, принадлежащий этому процессу, имеет такой же базовый приоритет. Вызов функции SetThreadPriority с параметром Highest сделает базовый приоритет потока равным 8, а с параметром Time Critical – равным 15.
Текущий приоритет потока при создании потока равен базовому, но в дальнейшем может динамически повышаться и понижаться операционной системой (эта процедура будет рассмотрена далее). Заметим, что для потоков с базовым приоритетом Real Time текущий приоритет не изменяется и всегда равен базовому.
