Планирование потоков
Алгоритм планирования в Windows
В Windows отсутствует единый модуль, отвечающий за планирование потоков. Алгоритм планирования реализуется несколькими процедурами ядра, совокупность которых называется диспетчером ядра (kernel’s dispatcher).
Для хранения данных, необходимых для планирования, предназначена база данных диспетчера ядра, которая является частью структуры KPRCB (Kernel Processor Control Block), описанной в файле base\ntos\inc\i386.h (строка 1073). Эта структура создается для каждого процессора, присутствующего в системе. Структура KPRCB содержит следующие поля, требуемые для планирования:
- CurrentThread – указатель на текущий выполняющийся поток;
- NextThread – указатель на следующий поток для выполнения;
- IdleThread – указатель на поток простоя;
- DispatcherReadyListHead – массив списков, содержащих указатели на потоки, готовые к выполнению. Количество элементов массива совпадает с количеством уровней приоритета в системе (32), т. е. для каждого приоритета поддерживается своя очередь потоков в состоянии готовности;
- ReadySummary – 32 битное число, каждый из разрядов которого отвечает за один уровень приоритета. Единица в N-ом разряде означает, что очередь готовых к выполнению потоков с приоритетом N не пустая. Это поле используется для ускорения поиска при выборе потока для выполнения.
Выбор потока с максимальным приоритетом из массива DispatcherReadyListHead с использованием поля ReadySummary осуществляется функцией KiSelectReadyThread (файл base\ntos\ke\ki.h, строка 3550).
Рассмотрим основные ситуации, возникающие при планировании потоков.
1. Выбор потока на выполнение.
Просматривается очередь готовых к выполнению потоков (сначала поле ReadySummary, затем, когда определена непустая очередь с максимальным приоритетом, поле DispatcherReadyListHead) и выбирается первый поток в очереди с наибольшим приоритетом, которому для выполнения предоставляется квант времени (рис.9.4).
2. Переход выполняющегося потока в состояние ожидания.
Выполняющийся поток вызывает одну из функций ожидания (см. MSDN – Wait Functions [10]) и освобождает процессор. Его квант времени не истек и сохраняется за потоком, но при выходе из состояния ожидания уменьшается на единицу (см. параграф "Кванты" этой лекции).
Диспетчер ядра выбирает на выполнение первый поток из очереди с наибольшим приоритетом (рис.9.5).
3. Вытеснение потоком с большим приоритетом.
Во время выполнения поток может быть вытеснен при появлении потока с большим приоритетом. Такая ситуация может возникнуть по следующим причинам:
- поток с большим приоритетом завершил ожидание (рис.9.6);
- приоритет потока в очереди готовности динамически увеличился (см. далее в этой лекции);
- в системе создан поток с большим приоритетом.
В любом случае выполняющийся поток вытесняется, помещается в начало очереди готовности с соответствующим приоритетом; при этом неистраченная часть кванта остается за потоком.
4. Завершение кванта времени
Когда квант времени, предоставленный потоку, истекает, операционная система проверяет, есть ли в очереди готовности поток с таким же приоритетом или выше. Если есть, то поток помещается в конец соответствующей очереди готовности и новый поток выбирается на выполнение (рис.9.7). Если такие потоки отсутствуют, выполняющемуся потоку может быть предоставлен новый квант времени.
Динамическое повышение приоритета
Если бы операционная система осуществляла планирование потоков только на основе выше рассмотренных ситуаций, большинство потоков с низким приоритетом вообще никогда не выполнялись бы – диспетчер ядра все время выбирал бы потоки с наивысшим приоритетом.
Чтобы дать всем потокам шанс на выполнение операционная система применяет механизм динамического повышения приоритета (Priority Boosts), который работает в следующих случаях:
- возникает событие диспетчера ядра;
- завершается операции ввода/вывода;
- происходит событие пользовательского интерфейса;
- поток слишком долго ожидает ресурс;
- поток слишком долго ожидает своей очереди на выполнение.
Замечание. Никогда не повышаются приоритеты потоков реального времени (16–31).
Резюме
В этой лекции рассмотрены основные алгоритмы планирования потоков, в том числе, вытесняющие и невытесняющие, с квантованием и с приоритетами. Описаны состояния, в которых могут находиться потоки. Приведены особенности реализации квантования и приоритетов в Windows. Рассмотрен алгоритм планирования потоков, используемый в Windows.
В следующей лекции рассказывается, каким образом в Windows реализуется управление виртуальной и физической памятью.
Контрольные вопросы
- Перечислите виды алгоритмов планирования.
- Нарисуйте схему состояний потоков, переходов и условий переходов между состояниями.
- Какие кванты используются в Windows? Каким образом можно изменить величину кванта?
- Нарисуйте схему уровней приоритетов в Windows. Укажите соответствие уровней и классов приоритета.
- Рассмотрите основные ситуации, возникающие при планировании потоков и действия диспетчера ядра Windows в этих ситуациях.
- Возможна ли в Windows ситуация, когда какой-либо созданный поток вообще не получит процессорного времени?