Операционные системы учебное пособие (1085734), страница 9
Текст из файла (страница 9)
Очереди готовых потоков (ready queues) диспетчера ядра включают потоки в состоянии Ready, ожидающие выделения им процессорного времени. Для каждого из 32 уровней приоритета существует по одной очереди. Для ускорения выбора потока, подлежащего выполнению или вытеснению, Windows поддерживает 32-битную маску, называемую сводкой готовности (ready summary). Каждый установленный в ней бит указывает на присутствие одного или более потоков в очереди готовых потоков для данного уровня приоритета (бит 0 соответствует приоритету 0, бит 1 — приоритету 1 и т. д.).
Квант
-
По умолчанию потоки в windows server выполняются 12 интервалов таймера
-
Длительность кванта зависит от аппаратной платформы и определяется в HAL (для х86 с одним процессором = 10 мс, для многопроцессорной 15 мс)
-
Учет квантов времени
-
Для каждого процесса хранится в блоке процесса ядра
-
-
Управление величиной кванта
-
Короткие кванты
-
Переменные кванты
-
Динамическое увеличение кванта
Параметры реестра для настройки кванта
-
HKLM\SYSTEM\CurrentControlSet\Control\PriorityControl\Win32PrioritySeparation
Как уже говорилось, квант — это интервал процессорного времени, отведенный потоку для выполнения. По его окончании Windows проверяет, ожидает ли выполнения другой поток с таким же уровнем приоритета. Если на момент истечения кванта других потоков с тем же уровнем приоритета нет, Windows выделяет текущему потоку еще один квант.
Учет квантов времени
Величина кванта для каждого процесса хранится в блоке процесса ядра. Это значение используется, когда потоку предоставляется новый квант. Когда поток выполняется, его квант уменьшается по истечении каждого интервала таймера, и в конечном счете срабатывает алгоритм обработки завершения кванта. Если имеется другой поток с тем же приоритетом, ожидающий выполнения, происходит переключение контекста на следующий поток в очереди готовых потоков. Заметьте: когда системный таймер прерывает DPC или процедуру обработки другого прерывания, квант выполнявшегося потока все равно уменьшается, даже если этот поток не успел отработать полный интервал таймера. Если бы это было не так и если бы аппаратное прерывание или DPC появилось непосредственно перед прерыванием таймера, квант потока мог бы вообще никогда не уменьшиться.
Внутренне величина кванта хранится как число тактов таймера, умноженное на 3- То есть в Windows 2000 и Windows XP потоки по умолчанию получают квант величиной 6 (2 • 3), в Windows Server — 36 (12 • 3). Всякий раз, когда возникает прерывание таймера, процедура его обработки вычитает из кванта потока постоянную величину (3).
Почему? Это сделано для того, чтобы можно было уменьшать значение кванта по завершении ожидания. Когда поток с текущим приоритетом ниже 16 и базовым приоритетом ниже 14 запускает функцию ожидания и его запрос на доступ удовлетворяется немедленно (например, он не переходит в состояние ожидания), его квант уменьшается на одну единицу. Благодаря этому кванты ожидающих потоков в конечном счете заканчиваются.
Динамическое увеличение кванта
До Windows NT 4.0, когда на рабочей станции или в клиентской системе какое-то окно становилось активным, приоритет всех потоков активного процесса (которому принадлежит поток, владеющий окном в фокусе ввода) динамически повышался на 2. Повышенный приоритет действовал до тех пор, пока любому потоку процесса принадлежало активное окно. Проблема с этим подходом была в том, что, если вы запустили длительный процесс, интенсивно использующий процессор (например, начали пересчет электронной таблицы), и переключились на другой процесс, требующий больших вычислительных ресурсов (скажем, на одну из программ CAD, графический редактор или какую-нибудь игру), то первый процесс, ставший теперь фоновым, получит лишь очень малую часть процессорного времени (или вообще не получит его). А все дело в том, что приоритет потоков активного процесса повышается на 2 (здесь предполагается, что базовый приоритет потоков обоих процессов был одинаковым).
Это поведение по умолчанию изменилось с появлением Windows NT 4.0 Workstation — кванты потоков активного процесса стали увеличиваться в 3 раза. Таким образом, по умолчанию на рабочих станциях их квант достигал 6 тактов таймера, а у потоков остальных процессов — 2 тактов. Благодаря этому, когда процесс, интенсивно использующий процессорные ресурсы, оказывается фоновым, новый активный процесс получает пропорционально большее процессорное время (и вновь предполагается, что приоритеты потоков одинаковы как в активном, так и в фоновом процессе).
Изменение квантов относится лишь к процессам с приоритетом выше Idle в системах с установленным параметром Programs (или Applications в Windows 2000) в диалоговом окне Performance Options (Параметры быстродействия). Кванты потоков активного процесса в системах с установленным параметром Background Services (настройка по умолчанию в системах Windows Server) не изменяются.
Сценарии планирования
Известно, что вопрос «Какому потоку отдать процессорное время?» Windows2000 решает, исходя из приоритетов.
Самостоятельное переключение
Во-первых, поток может самостоятельно освободить процессор, перейдя в состояние ожидания на каком-либо объекте (например, событии, мьютексе, семафоре, порте завершения ввода-вывода, процессе, потоке, оконном сообщении и др.) путем вызова одной из многочисленных Windows-функций ожидания.
Вытеснение
В этом сценарии поток с более низким приоритетом вытесняется готовым к выполнению потоком с более высоким приоритетом. Такая ситуация может быть следствием двух обстоятельств:
-
завершилось ожидание потока с более высоким приоритетом (т. е. произошло событие, которого он ждал);
-
приоритет потока увеличился или уменьшился.
В любом из этих случаев Windows решает, продолжить выполнение текущего потока или вытеснить его потоком с более высоким приоритетом.
Завершение кванта
Когда поток израсходует свой квант процессорного времени, Windows должна решить, следует ли понизить его приоритет и подключить к процессору другой поток.
Снизив приоритет потока, Windows ищет более подходящий для выполнения поток (таким потоком, например, будет любой из очереди готовых потоков с приоритетом выше нового приоритета текущего потока). Если Windows оставляет приоритет потока прежним и в очереди готовых потоков есть другие потоки с тем же приоритетом, она выбирает из очереди следующий поток с тем же приоритетом, а выполнявшийся до этого поток перемещает в хвост очереди (задавая ему новую величину кванта и переводя его из состояния Running в состояние Ready). Если ни один поток с тем же приоритетом не готов к выполнению, текущему потоку выделяется еще один квант процессорного времени.
Завершение потока
Завершаясь, поток переходит в состояние Terminated. Если в этот момент ни один описатель его объекта «поток» не открыт, поток удаляется из списка потоков процесса, и соответствующие структуры данных освобождаются.
Переключение контекста
Зависит от архитектуры процессора. Типичный случай сохранение и восстановление следующих данных:
-
Указателя команд
-
Указателей стека ядра и пользовательский стек
-
Указателя на адресное пространство, в котором выполняется поток
Ядро сохраняет эту информацию, заталкивая ее в текущий стек ядра, обновляя указатель стека и сохраняя его в блоке KTHREAD потока. Далее указатель стека ядра устанавливается на стек ядра нового потока и загружается контекст этого потока. Если новый поток принадлежит другому процессу, в специальный регистр процессора загружается адрес его каталога таблиц страниц, в результате чего адресное пространство этого процесса становится доступным.
При наличии отложенной АРС ядра запрашивается прерывание IRQL уровня 1. В ином случае управление передается загруженному для нового потока указателю команд, и выполнение этого потока возобновляется.
Поток простоя
Выполняет следующие действия:
-
Включает/выключает прерывания
-
Проверяет наличие незавершенных DPC
-
Проверяет наличие потока на данном процессоре
-
Вызывает из HAL процедуру обработки простоя процессора
Если нет ни одного потока, готового к выполнению на процессоре, Windows подключает к данному процессору поток простоя (процесса Idle). Для каждого процессора создается свой поток простоя.
Холостой цикл, работающий при IRQL уровня «DPC/dispatch», просто запрашивает задания, например на доставку отложенных DPC или на поиск потоков, подлежащих диспетчеризации. Хотя последовательность работы потока простоя зависит от архитектуры, он все равно выполняет следующие действия.
Включает и отключает прерывания (тем самым давая возможность доставить отложенные прерывания). Проверяет, нет ли у процессора незавершенных DPC. Если таковые есть, сбрасывает отложенное программное прерывание и доставляет эти DPC. Проверяет, выбран ли какой-нибудь поток для выполнения на данном процессоре, и, если да, организует его диспетчеризацию. Вызывает из HAL процедуру обработки процессора в простое (если нужно выполнить какие-либо функции управления электропитанием).
В Windows Server 2003 поток простоя также проверяет наличие потоков, ожидающих выполнения на других процессорах.
Динамическое повышение приоритета
Возможно:
-
После завершения операций в/в
-
По окончании ожидания на событие или семафоре исполнительной системы
-
По окончании операции ожидания потоками активного процесса
-
При пробуждении GUI-потоков
-
Если поток, готовый к выполнению, задерживается из-за нехватки процессорного времени
Динамическое повышение приоритета после завершения ввода-вывода
Windows временно повышает приоритет потоков по окончании определенных операций ввода-вывода, поэтому у потоков, ожидавших завершения таких операций, больше шансов немедленно возобновить выполнение и обработать полученные данные.
По окончании ожидания событий и семафоров
Когда ожидание потока на событии исполнительной системы или объекте «семафор» успешно завершается, его приоритет повышается на 1 уровень.
После выхода из состояния ожидания
Всякий раз, когда поток в активном процессе завершает ожидание на объекте ядра, функция ядра KiUnwaitThread динамически повышает его текущий (не базовый) приоритет на величину текущего значения PsPrioritySeparation.
После пробуждения GUI-потоков
Приоритет потоков, владеющих окнами, дополнительно повышается на 2 уровня после их пробуждения из-за активности подсистемы управления окнами, например при получении оконных сообщений. Подсистема управления окнами (Win32k.sys) повышает приоритет, вызывая KeSetEvent для установки события, пробуждающего GUI-поток. Приоритет повышается по той же причине, что и в предыдущем случае, —для создания преимуществ интерактивным приложениям.
При нехватке процессорного времени
Раз в секунду диспетчер настройки баланса (balance set manager), системный поток, предназначенный главным образом для выполнения функций управления памятью, сканирует 16 записей в очереди готовых потоков и ищет потоки, которые находятся в состоянии Ready в течение примерно 4 секунд. Обнаружив такой поток, диспетчер настройки баланса повышает его приоритет до 15.
Объекты задания
-
Именуемый, защищаемый и разделяемый объект ядра, обеспечивающий управление одним или несколькими процессами как группой
-
Процесс может входить только в одно задание
-
Применение заданий:
-
Максимальное число активных процессов
-
Общий лимит на процессорное время в пользовательском режиме
-
Индивидуальный лимит на процессорное время в пользовательском режиме для каждого процесса
-
Класс клонирования задания
-
Привязка задания к процессам
-
Класс приоритета для всех процессов задания
-
Минимальный и максимальный размеры рабочего набора по умолчанию
-
Лимит на виртуальную память, для процесса или задания
-
Объекты-задания
Объект «задание» (job object) — это именуемый, защищаемый и разделяемый объект ядра, обеспечивающий управление одним или несколькими процессами как группой. Процесс может входить только в одно задание. По умолчанию его связь с объектом «задание» нельзя разрушить, и все процессы, создаваемые данным процессом и его потомками, будут сопоставлены с тем же заданием. Объект «задание» также регистрирует базовую учетную информацию всех включенных в него процессов, в том числе уже завершившихся.
Утилита Process Control. Операционная система Windows
Возможности Process Control
-
Позволяет управлять ресурсами одного или более приложений
-
Динамическое назначение параметров процессам
Сфера применения
-
Сервера с большим число CPU
-
Консолидация серверов
-
Разделение ресурсов
Внутренняя структура процесса
Внутренняя структура процесса
Процесс состоит из:
-
Виртуального адресного пространства
-
Исполняемой программы, внутри которой определен код и данные отображаемые в виртуальное адресное пространство
-
Списка открытых handles to various system геэоигсеэ.таких как семафоры, порты взаимодействия и файлы, доступные всем потокам процесса
-
Контекста безопасности названного как access token, определяющего пользователя, группу безопасности и привилегии связанные с процессом
-
Номера процесса (process ID)
-
Как минимум одного исполняемого потока
Поток включает:
-
Значения регистров процессора
-
Два стека, один для потоков исполняемых в режиме ядра и один для потоков исполняемых в пользовательском режиме
-
Закрытую область памяти для использования подсистем, исполняемых библиотек и DLL
-
Номера потока (thread ID)
-
Потоки могут иметь свой контекст безопасности.
Объекты задания и Process Control
Объекты задания и Process Control