- •Глава 4. Процессы и потоки
- •Уровни irql
- •Высший (ошибка шины,...)
- •Питание
- •Межпроцессорное прерывание
- •Устройство 1
- •Диспетчерски й/d pc
- •Низший (обычный код)
- •152 Глава 4. Процессы и потоки
- •154 Глава 4. Процессы и потоки
- •Диспетчер системных вызовов
- •156 Глава 4. Процессы и потоки
- •158 Глава 4. Процессы и потоки
- •160 Глава 4. Процессы и потоки
- •162 Глава 4. Процессы и потоки
- •164 Глава 4. Процессы и потоки
- •166 Глава 4. Процессы и потоки
- •168 Глава 4. Процессы и потоки
- •V(f) — нарастить число занятых буферов
- •V(f) — нарастить число занятых буферов
- •170 Глава 4. Процессы и потоки
- •172 Глава 4. Процессы и потоки
- •174 Глава 4. Процессы и потоки
- •176 Глава 4. Процессы и потоки
- •178 Глава 4. Процессы и потоки
Общая
схема планирования обработки прерываний
выглядит в ОС семейства Windows
NT
следующим образом. При поступлении в
процессор сигнала запроса на
прерывание/исключение вызывается
диспетчер прерываний, который запоминает
информацию об источнике прерывания и
анализирует его приоритет. Если приоритет
запроса ниже или равен IRQL
прерванного кода, то обслуживание этого
запроса откладывается, и данные о
запросе помещаются в соответствующую
очередь запросов, после чего происходит
быстрый возврат к прерванному обработчику
прерываний. При завершении обработки
высокоприоритетного прерывания
управление возвращается диспетчеру
прерываний, который просматривает
очереди отложенных прерываний и выбирает
из них наиболее приоритетное. При этом
уровень IRQL
снижается до уровня выбранного
прерывания.
Если
же запрос имеет более высокий приоритет,
чем IRQL
текущего кода, то текущий обработчик
прерываний вытесняется и ставится в
очередь, соответствующую его значению
IRQL,
а управление передается новому
обработчику, в соответствии с IRQL
запроса. После этого уровень IRQL
процессора делается равным уровню IRQL
принятого на выполнение запроса.
Таким
образом, запрос на прерывание принимается
диспетчером прерываний всегда,
независимо от текущего уровня IRQL
выполняемого кода, но диспетчер
прерываний не передает его на обработку
соответствующей процедуре обслуживания
прерываний, а помещает в программную
очередь запросов, если в данный момент
выполняется более приоритетная процедура
обслуживания прерываний. Операционная
система имеет полный контроль над
ситуацией, не позволяя контроллерам
устройств ввода-вывода принимать
решения о ходе вычислительного
процесса.
Низший
уровень IRQL
соответствует обычным потокам,
назначаемым на выполнение диспетчером
потоков (рис. 4.13). Это является некоторым
допущением, так как код потоков
начинает выполняться процессором не
в результате запроса на прерывание, но
это допущение хорошо работает, поскольку
позволяет любому «настоящему»
запросу прерывать код обычного потока.
Заблокированные
уровни запросов прерываний
Таймер
Устройство
п
АРС
►IRQL
текущего
кода
Рис.
4.13. Диспетчеризация прерываний в ОС
семейства Windows
NT
Высший
уровень в иерархии IRQL
отводится таким важным событиям, как
исключение по ошибке шины и другим
тяжелым аппаратным сбоям, далее расГлава 4. Процессы и потоки
Уровни irql
Высший (ошибка шины,...)
Питание
Межпроцессорное прерывание
Устройство 1
Диспетчерски й/d pc
Низший (обычный код)
Мультипрограммирование
на основе прерываний 151
полагается
запрос на прерывание по сбою питания,
и запрос на межпроцессорное прерывание.
Прерывания
от внешних устройств занимают
промежуточные уровни IRQL.
Конкретное соотношение между приоритетами
внешних устройств определяется
приоритетами, задаваемыми аппаратной
платформой, например уровнем IRQ
шины PCI,
назначенным устройству.
Особую
роль в работе вычислительной системы
играет системный таймер: на основании
его прерываний обновляются системные
часы, определяющие очередной момент
вызова планировщика потоков, момент
выдачи управляющего воздействия
потоком реального времени и многое
другое. Ввиду важности немедленной
обработки прерываний от таймера ему в
ОС семейства Windows
NT
дан весьма высокий уровень приоритета
— более высокий, чем уровень любого
устройства ввода-вывода.
В
системе очередей диспетчера прерываний
несколько очередей отведено для
обслуживания отложенных программных
прерываний.
Программные
прерывания, обслуживающие системные
вызовы от приложений, выполняются
с низшим уровнем приоритета, что
соответствует концепции продолжения
одного и того же процесса при выполнении
системного вызова, но только в системной
фазе. А вот для программных прерываний,
исходящих от модулей ядра ОС, отводится
более высокий уровень запросов, имеющий
двойное название «диспетчерский/DPC». 1
Этот
уровень приоритета называется
диспетчерским,
потому что именно в эту очередь помещаются
программные запросы, вызывающие
диспетчер потоков. Часто при обработке
высокоприоритетных прерываний возникает
ситуация, требующая перепланирования
потоков. Например, при обработке
очередного прерывания от таймера нужно
проверить, не исчерпан ли квант,
выделенный текущему потоку. Другим
примером может служить обработка
прерывания от контроллера диска после
завершения дисковой операции, которую
Moiyr
ждать несколько потоков. Во всех таких
ситуациях в ОС семейства Windows
NT
планировщик/диспетчер вызывается
высокоуровневыми процедурами ядра не
прямо посредством вызова процедуры, а
косвенно с помощью программного
прерывания. Это дает возможность
отделить короткую, но требующую быстрой
реакции системы процедуру обслуживания
высокоприоритетного прерывания
(например, наращивание системных часов),
от менее критичной операции
перепланирования пользовательских
потоков. Прямой вызов;
планировщика/диспетчера потоков
такой возможности бы не дал, и критичные
запросы прерывания от контроллеров
устройств ввода-вывода вынуждены были
бы ждать, пока отработает планировщик.
При этом планировщик, возможно, выбрал
бы для выполнения другой поток, если
бы работал после процедур обслуживания
аппаратных прерываний, так как он
получил бы свежие сведения О завершении
некоторых операций ввода-вывода.
Помещение вызова планировщика потоков
в очередь позволяет выполнять его
только в тех ситуациях, когда в системе
отсутствуют ожидающие аппаратные
запросы прерываний.