- •Глава 6.Мультипрограммирование на основе прерываний .
- •Назначение и типы прерываний .
- •Механизм прерываний
- •Программные прерывания .
- •Диспетчеризация и приоритезация прерываний в ос .
- •Функции централизованного диспетчера прерываний на примере Windows nt. Прерывания на аппаратном уровне.
- •Процедуры обработки прерываний и текущий процесс .
- •Системные вызовы .
- •Принципы обработки прерываний в ос Unix .
Функции централизованного диспетчера прерываний на примере Windows nt. Прерывания на аппаратном уровне.
Некоторые процессоры или контроллеры прерываний компьютера на аппаратном уровне поддерживают приоритезацию запросов на прерывание . Например в процессорах MIPS имеется несколько уровней программных запросов . В процессоре имеется внутренняя переменная , называемая уровнем прерываний процессора . Прерывание происходит только в том случае , когда уровень запроса на прерывание выше текущего уровня прерываний процессора . Имеется также привилегированная инструкция , с помощью которой код ядра ОС может изменить уровень прерываний процессора .Необработанные запросы на прерывания должны хранится в контроллерах устройств ,чтобы не потеряться и дождаться обслуживания при снижении уровня прерывания процессора , когда он закончит выполнение более срочных работ .
Для исключения зависимости от аппаратной платформы в некоторых ОС вводится собственная программная система приоритетов прерываний . Примером такой ОС может служить Windows NT .
Диспетчер прерываний Windows NT ( Trap Handler ) работает с программной моделью прерываний , единой для всех аппаратных платформ , поддерживаемых Windows NT . Все источники прерываний делятся на несколько классов , и каждому классу присваивается уровень запроса прерываний – Interrupt Request Level , IRQL . Этот уровень и представляет приоритет данного класса . ОС программным способом поддерживает внутреннюю переменную , называемую IRQL выполняемого процессором кода , которая по назначению соответствует уровню прерывания процессора .
Общая схема планирования обработки прерываний выглядит в Windows NT следующим образом . При поступлении в процессор сигнала запроса на прерывание /исключение вызывается диспетчером прерываний , который запоминает информацию об источнике прерывания и анализирует его приоритет . Если приоритет ниже или равен IRQL прерванного кода , то обслуживание этого запроса откладываются и данные о запросе помещаются в соответствующую очередь запросов , после чего происходит быстрый возврат к прерванному обработчику прерываний . По завершении обработки высокоприоритетного прерывания управление возвращается диспетчеру прерываний , который просматривает очереди отложенных прерываний и выбирает из них наиболее приоритетные . При этом уровень IRQL снижается до уровня выбранного прерывания .
Если же запрос имеет более высокий приоритет , чем IRQL текущего кода , то текущий обработчик прерываний вытесняется и ставится в очередь , соответствующую его значению IRQL , а управление передается новому обработчику в соответствии с IRQL запроса . После этого уровень IRQL процессора делается равным уровню IRQL принятого на выполнение запроса .
Таким образом , запрос на прерывание принимается диспетчером прерываний всегда независимо от текущего уровня IRQL выполняемого кода , но диспетчер прерываний не передает его на обработку соответствующей процедуре обработки прерываний , а помещает в программную очередь запросов , если в данный момент выполняется более приоритетная процедура обработки прерываний . ОС имеет полный контроль над ситуацией ,не позволяя котроллерам устройств ввода-вывода принимать решения о ходе вычислительного процесса .
В Windows NT низший уровень IRQL соответствует обычным потокам ,назначаемым на выполнение диспетчером потоков ( рис 6.1) . Это является некоторым допущением , так как код потоков начинает выполняться процессором не р результате запроса на прерывание , но это допущение хорошо работает , поскольку позволяет любому «настоящему» запросу прерывать код обычного потока .
Уровни IRQL
-
Высший (ошибки шины …)
Питание
Межпроцессорное прерывание
Таймер
Заблокированные уровни запросов прерываний
Устройство N.
Устройство …
Устройство 1
Диспетчерский/DPC
APC
Низший (обычный код)
Рис.6.1. Диспетчерезация прерываний в Windows NT
Высший уровень в иерархии IRQL отводиться таким важным событиям , как исключение по ошибке шины и другим тяжелым аппаратным сбоям , далее располагаются запрос на прерывание по сбою питания и запрос на межпроцессорное прерывание .
Прерывания от внешних устройств занимают промежуточные уровни IRQL . Конкретное соотношение между приоритетами внешних устройств определяется приоритетами , задаваемые аппаратной платформой , например уровнем IRQL шины PCI , назначенным устройству .
Особую роль в работе вычислительной системе играет системный таймер : на основании его прерываний обновляются системный часы , определяющие очередной момент вызова планировщика потоков , момент выдачи управляющего воздействия потоком реального времени и многое другое . Ввиду важности немедленной обработки прерываний от таймера , ему в Windows NT дан весьма высокий уровень приоритета – более высокий ,чем уровень любого устройства ввода-вывода .
В системе очередей диспетчера прерываний несколько очередей отведено для обслуживания отложенных программных прерываний .
Программные прерывания , обслуживающие системные вызовы от приложений , выполняются с низшим уровнем приоритета , что соответствует концепции продолжения одного и того же процесса , но только в системной фазе , при выполнении системного вызова . А для программных прерываний , исходящих из модулей ядра ОС, отводится более высокий уровень запросов , имеющий двойное название “диспетчерский /DPC ” .
Этот уровень приоритета называется диспетчерским , потому что именно в эту очередь помещаются программные запросы, вызывающие диспетчер потоков . Часто при обработке высокоприоритетных прерываний возникает ситуация , требующая перепланирования потоков . Во всех таких ситуациях в Windows NT планировщик/диспетчер вызывается высокоуровневыми процедурами ядра не прямо посредством вызова процедуры , а косвенно , с помощью программного прерывания . Это дает возможность отделить короткую , но требующую быстрой реакции системы процедуру обслуживания высокоприоритетного прерывания от менее критичной операции перепланирования пользовательских потоков .
Второе название диспетчерского уровня , DPC , говорит о том , что на этом уровне ожидают своей очереди отложенные вызовы и других процедур ОС , а не только планировщика/диспетчера. Примером процедур ОС , работающих на высоком приоритетном уровне , являются те части драйверов устройств ввода – вывода , которые выполняют короткие , но критичные ко времени реакции действия . Существуют также части драйверов , которые выполняют менее срочную , но более объемную работу . В Windows NT такие части драйверов оформляют как процедуры , вызываемые с помощью программных прерываний уровня «диспетчерский/DPC» , а само программное прерывание выполняет критичная часть драйвера .
Отрицательным следствием такого централизованного подхода является некоторое замедление обработки прерываний , так как вместо непосредственной передачи управления драйверу устройства или обработчику исключений выполняется вызов некоего посредника – диспетчера прерываний . В ОС системах UNIX принят похожий , но менее централизованный подход к ведению и обработке очередей прерываний . Тем не менее , общий подход к упорядочиванию обработки прерываний за счет их многоуровневой приоритезации и ведения системы очередей присутствует практически во всех современных операционных системах .
