Приоритеты потоков. Классы приоритетов процессов и относительные приоритеты потоков
В ОС Windows в любой момент времени могут выполняться потоки с разными приоритетами, каждому из которых может соответствовать один из уровней приоритета в диапазоне от 0..31.
Приоритеты потоков в системе учитываются следующим образом:
1. При распределении процессорного времени ищутся потоки с наивысшим уровнем 31. Если они присутствуют, то им последовательно предоставляется процессорное время.
2. После выполнения всех таких потоков, отыскиваются потоки с меньшими значениями приоритетов, и они начинают выполняться.
Во всех случаях, поток с более высоким уровнем приоритета, когда он запускается на выполнение, вытесняет из процессора поток с более низким уровнем приоритета, даже в том случае, когда еще не закончился квант процессорного времени, отведенный для низкоприоритетного потока. Это означает, что в системе реализуется дисциплина обслуживания потоков с абсолютными динамическими приоритетами.
В момент загрузки ОС создается особый поток, называемый потоком обнуления страниц. Ему присваивается нулевой уровень приоритета. Ни один другой поток, кроме этого, не может иметь такой уровень приоритета. Поток обнуления страниц подготавливает для использования свободные страницы в ОП при отсутствии в системе других потоков. Алгоритм, по которому потоки, с учетом их приоритетов, выполняются в системе, реализуется частью ядра ОС, которая называется планировщиком потоков. Внутренние особенности этого алгоритма скрыты от пользователей и разработчиков прикладных программ. Для них имеется возможность использовать средства WinAPI. На уровне этих средств, в системе реализованы две концепции, связанные с приоритетностью:
1. Концепция класса приоритета процесса;
2. Концепция относительных приоритетов потоков в рамках одного процесса.
Существует 6 классов приоритетов процессов:
1. Простаивающий. Потоки в таком процессе выполняются, когда система не занята другой работой. Этот класс обычно используется для вспомогательных программ, работающих в фоновом режиме, например, экранных заставок, программ сбора статистической информации и т.д.;
2. Ниже обычного. Этот класс используется в версиях начиная с Windows 2000 и является промежуточным. Он введен с целью расширения множества классов приоритетов;
3. Обычный. Это самый распространенный класс приоритета. Потоки в таких процессах не предъявляют особых требований к выделению им процессорного времени. В этом классе выполняется большая часть прикладных программ;
4. Выше обычного. Как и второй, является промежуточным;
5. Высокий. Потоки в таком процессе немедленно реагируют на различные события, и позволяют выполнять критические по времени исполнения программы. Например, в этом классе приоритета выполняется программа Internet Explorer. При её запуске, все потоки с более низкими приоритетами вытесняются из процессора. Это сделано для того, чтобы независимо от ситуации в системе, пользователь мог бы получить быструю ответную реакцию IE на команды пользователя;
6. Реального времени. Используется относительно редко, для обеспечения очень быстрой ответной реакции программы на какие-либо события. К примеру, необходимость с минимальной задержкой реагировать на события аппаратной части компьютера, либо когда требуется выполнить быстротечную операцию, которую нельзя прервать ни при каких обстоятельствах.
Выбор класса приоритета процесса осуществляется заданием соответствующего параметра функции создания процесса, в которой каждый класс указывается своим собственным идентификатором. После выбора класса приоритета процесса, для потоков процесса в данном классе может быть задан один из семи возможных уровней относительных приоритетов. Они имеют общепринятые названия:
1. Простаивающий. В этом случае, поток выполняется с уровнем относительного приоритета равным 16 в классе процессов реального времени, и с уровнем относительного приоритета, равным единице – в других классах;
2. Низший. Поток выполняется с уровнем относительного приоритета на два уровня ниже обычного для данного класса уровня;
3. Ниже обычного. Здесь поток выполняется с относительным уровнем приоритета на один уровень ниже обычного уровня для данного класса;
4. Обычный. Поток выполняется со следующими значениям уровнями приоритетов для всех классов: 4, 6, 8, 10, 13, 24;
5. Выше обычного. Поток выполняется с относительным уровнем приоритета на один уровень больше обычного уровня для данного класса;
6. Высший. Поток выполняется с относительным уровнем приоритета на два уровня выше обычного уровня для данного класса;
7. Критичный по времени. Поток выполняется с относительным уровнем 31 в классе процессов реального времени, и с относительным уровнем, равным 15, во всех других классах.
Примечания.
· Все приведенные числовые значения уровней приоритетов присваиваются в Windows 2000. В других версиях, они могут быть другими.
· Уровни приоритетов в диапазонах 17..21 и 27..30 для обычных прикладных программ не задаются. Они могут использоваться только для драйверов устройств, работающих в режиме ядра.
· Вновь созданный с помощью функции CreatThread поток по умолчанию получает относительный приоритет «обычный».
· Все относительные уровни приоритетов, помимо своих численных значений, имеют общепринятые в системе идентификаторы.
· С помощью функции GetThreadPriority () можно получить информацию об относительном приоритете потока по его дескриптору.
· С помощью функции SetThreadPriority () можно изменить приоритет процесса. Эта функция имеет два параметра, а именно – дескриптор потока, и идентификатор нового относительного приоритета, который присваивается потоку.
Из всего сказанного вытекает, что для любого потока в системе назначается уровень приоритета, зависящий от двух факторов:
1. Класс приоритета процесса;
2. Уровень относительного приоритета потока.
Присваиваемый системой уровень приоритета называется базовым уровнем приоритета потока.
В некоторых случаях, система может сама, динамически, изменять уровень приоритета потока. Обычно это происходит в ответ на какие-либо внешние события, связанные с вводом-выводом данных, например, нажатие клавиш на клавиатуре, чтение/запись диска.
В качестве примера можно привести следующие ситуации, в которых операционная система может динамически менять относительные приоритеты:
1. В системе имеется поток с относительным приоритетом «обычный» в процессе класса «высокий». Поток имеет значение базового уровня, равного 13. Если на клавиатуре нажимается какая-либо клавиша, то поток становится планируемым к исполнению, и управление получает драйвер клавиатуры. Он может инициировать временное увеличение уровня потока, например, с 13 до 15. Новое значение может быть иным, причем неизвестным заранее. После выполнения потока с новым приоритетом в течение кванта времени, система снизит его уровень приоритета до значения 14, и выделит потоку квант процессорного времени, в ходе которого он будет выполняться с новым приоритетом. По его окончании, система снова понизит уровень приоритета потока на единицу, до его исходного базового значения. Таким способом, в ОС осуществляется процесс динамического изменения уровней приоритетов потоков с целью повышения скорости ответной реакции системы на внешние события;
2. В системе имеется готовый к выполнению поток со значением базового уровня приоритета равным 4. Длительное время этот поток не может получить доступ к процессору из-за того, что его полностью занимают потоки с более высокими приоритетами. Обнаружив присутствие такого потока, система динамически может поднять его уровень приоритета до 15 и выделить дополнительный квант процессорного времени. По окончании кванта, потоку снова будет возвращено прежнее значение базового уровня приоритета.
Система обладает возможностью изменять динамические приоритеты, и в частности, повышать их, только для тех потоков, базовый уровень приоритета которых находится в диапазоне от 1 до 15. Этот диапазон называется областью динамического приоритета. Повышение динамического приоритета за пределы диапазона для потоков с прикладными задачами не допускается. Потоки с таким уровнем приоритета выполняются системными функциями. Подобное ограничение не позволяет прикладным программам нарушать работу ОС, и, по существу, является одной из мер защиты системных программ от пользовательских.
Существуют системные функции (начиная с Windows 2000), которые позволяют либо отключать возможность динамического изменения приоритетов потоков, либо напротив, включать её:
1. SetProcessPriorityBoost ();
2. SetThreadPriorityBoost ().