Образовательный портал «Кафедра онлайн» НИЯУ «МИФИ», Обнинск"

Компьютерные сказки. Прерывание

Е.В. Крылов, доцент ИАТЭ НИЯУ «МИФИ», Обнинск

Сатанеев сказал: «Меня грубо прервали…».
Он не знал, что прерывание в жизни необходимо.

В старых компьютерных книгах, которые назывались книгами по цифровым машинам и  были написаны несравненно лучше современных, можно прочитать, что ЭВМ (читай компьютер) управляются машинной программой. Мой бог, тогда ведь это было правильно! Мы приносили программу на перфокартах, ставили на устройство считывания, нажимали ввод. Если перфокарты не заминало, получали кусочек счастья. После ввода в оперативной памяти возникала машинная программа, которую начинал выполнять центральный процессор. Принципиально всё было просто. Набор внешних устройств жёстко определял центральный процессор. Каждое устройство управлялось процессором, а действия процессора определялись командами, заданными программистом. Для окружающих программист был магом, хотя делал он очень простые вещи.

Однако ситуация быстро менялась. Стремительно расширялись технические возможности, возрастали требования. Новые устройства работали с принципиально разными скоростями, возникла задача совмещения независимо функционирующих устройств. В реальной жизни такие ситуации возникают постоянно, как пишет Николай Георгиевич в [2]. Вы сидите на кухне и читаете книгу. В это время одновременно вскипает молоко для каши и раздаётся звонок в дверь. Вы встаёте, выключаете газ под кастрюлей с молоком, идёте открывать дверь. Пришёл сосед, спрашивает счёт во вчерашней игре Зенита. Дав ответ, идёте к плите, включаете слабый огонёк, варите кашу и садитесь читать. Вас «прерывают», но все процессы Вы выполняете правильно.

Как считает профессор Воланд, нам только кажется, что мы управляем событиями, на самом деле события управляют нами. Я не знаю, к сожалению, какой компьютерный гений до этого додумался. Возможно, идея потихоньку проникала в «массы». Реализация прерывания на компьютере, совершила революцию с далеко идущими последствиями. Внедрение прерывания носило противоречивый, неоднозначный характер. Исторические наслоения весьма сложны. Если очистить ненужные и второстепенные детали, мы увидим простую и чёткую, как всё гениальное, идею. Но этот переход требует введения нескольких непростых понятий.

В физике есть термин «дуализм»,- неразрывность понятий. Здесь мы увидим нечто похожее. Можно пропустить философствование. Но тот, кто прорвётся, будет вознаграждён, ибо сможет без проблем понять любую систему прерывания. Признаюсь, что изложенная схема наиболее близка к IBM 360/370/. Эта схема снова возрождается в компьютерах z-серии. Заранее приношу извинения читателям за столь непростой подход. Всё таки компьютер штука сложная.

Процесс, событие, окружение – связные понятия. Их невозможно определить порознь.

  • Окружение: нечто физическое, без чего невозможен процесс. Сверкнула молния, но для её прохождения нужна атмосфера. Для выполнения программы нужна оперативная память и процессор, по меньшей мере. Это программное окружение.
  • Событие: изменение состояния окружения. В оперативной памяти появилась машинная программа; в процессоре появилась команда, в ячейке оперативной памяти установлено значение. На голову упал кирпич. Возникло событие: шишка на темени.
  • Процесс: последовательность событий. Выполняются команды программы, идёт процесс. Мы последовательно перемещаем ноги, идёт процесс, идём в магазин.

Уже примитивное описание прерывания показывает, что его возникновение и обработка разнесены во времени и пространстве. Необходимы средства связи. В компьютере этим средством может быть общая шина. Для передачи прерывания могут быть выделены одна или несколько линий, называемых линиями прерывания. Прерывается всегда некоторый процесс, в данном случае прерывается выполняемая программа. Поэтому выполнять прерывание должен центральный процессор. Выделим основные события, определяющие прерывание.

  • Прерывание возникло. В одном из регистров внешнего устройства появилось целое двоичное число без знака. Возможно появление сигнала на линии внешней связи.
  • Прерывание передано. На линии прерывания появился сигнал.
  • Прерывание пришло. В регистре прерывания (регистр процессора) появилась единица.
  • Прерывание произошло. Центральный процессор сменил слово состояния.

Теперь детально и не торопясь, проведём анализ отдельных событий. Прерывание возникает на внешнем устройстве. Например, в принтере закончилась бумага, нажата клавиша на клавиатуре и т.д. Внешнее устройство не имеет права принимать решения по возникшему прерыванию, это функция операционной системы. Оно передаёт единицу на линию прерывания. Сигнал приходит в регистр прерываний. В разряде регистра прерываний появляется единица. Произошло событие «прерывание пришло».

Далее начинается наиболее сложная часть, выполняемая процессором. Здесь процессор тесно взаимодействует с операционной системой, которая заранее должна подготовить нужные компоненты. Нам придётся ввести некоторые соглашения. В процессоре существует ряд регистров, отвечающих за его состояние. В процессоре Intel это адресные регистры, регистр флагов. В процессоре IBM 360/370 эти регистры были выполнены в виде единого регистра. С точки зрения логики функционирования это совершенно неважно, хотя инженеры электронщики смогут привести массу соображений в пользу того или другого варианта. Назовём этот обобщённый регистр «слово состояния» (Program status word< PSW).

Рис. 2 показывает компоненты, которые операционная система должна заранее разместить в оперативной памяти. Постоянно распределённая память – участок оперативной памяти, которая используется только системными компонентами. Обычно располагается в начальных адресах. Поля старое и новое PSW по формату точно соответствует регистру PSW. Поле «Новое PSW» должно содержать адрес обработчика прерываний, программы, выполняющей необходимые действия по прерыванию.

Теперь вернёмся к циклу процессора. Раньше я писал, что буду давать упрощенную схему и постепенно её уточнять. Вы должны помнить, уважаемый читатель, что, отослав результат по адресу, процессор выполняет выборку следующей команды. На самом деле после засылки результата, он проверяет регистр прерываний и, если в регистре прерываний есть единица (т.е. пришло прерывание), выполняет прерывание.

Следует различать физическое и логическое прерывание. Физически происходит смена PSW, как показано на рис. 3.

Перед прерыванием текущее PSW (обобщенный регистр процессора) содержит адрес (указывает на) следующей команды. Мы помним, что адрес следующей команды появляется в PSW уже на третьем шаге цикла процессора. Процессор выполняет прерывание в два шага:

  • Текущее PSW отправляется в поле «старое PSW»
  • Содержимое поля «Новое PSW» перемещается в текущее PSW

Блеск! Предельно просто, надёжно и быстро.

Теперь что получится в результате. В старом PSW адрес прерванной команды. Т.к. поле «нового PSW» содержит адрес обработчика прерываний, текущее PSW указывает на команду обработчика, то на следующем шаге цикла процессора будет выполняться эта команда. Произошёл практически мгновенный логический переход от выполняемой программы к обработчику прерываний. Между прочим, это категорический отход от принципов фон Неймана, поскольку выполняемая программа не знает, куда будет передаваться управление.

Обработчик выполняет предписанные ему функции. Когда он закончит, (в примитивных системах типа MS/DOS) старое PSW загружается в текущее. Это обеспечивает продолжение прерванной программы. Как выполняется возврат в развитых системах, мы узнаем, если сказки доберутся до операционных систем.

Теперь посыпались традиционные вопросы. И так же традиционно я не буду спешить с ответом. Уважаемый читатель должен поработать необходимым жизненным инструментом, т.е. головой.

  • Внешних устройств много, на одну линию прерываний могут выходить несколько устройств. Появление прерывания событие случайное и непредсказуемое. Что будет, если в регистр прерываний по одной линии одновременно придёт несколько прерываний? Уважаемый читатель скажет, что одновременные события невероятны, и будет прав. Но я резонно возражу, что можно считать одновремёнными события в пределах цикла процессора (правда, не всегда).
  • Что будет, если новое прерывание придёт во время работы обработчика прерываний? Легко сообразить, если новое прерывание разрешить, адрес возврата будет стёрт. Возврат в прерванную программу будет невозможен.

Первое, что приходит в голову, создать иерархию прерываний. Самое простое, разбить на классы. Каждый класс может иметь свои характеристики скорости и важности. Тогда на каждый класс нужно заводить свою линию прерываний и бит в регистре прерываний (рис.4).

Теперь классифицируем усройства в соответствии с их свойствами и подсоединяем к разным линиям прерывания. Количество устройств на одной линии прерывания уменьшилось, следовательно уменьшилась вероятность одновременного прихода прерываний. Но эта вероятность осталась конечной. Забегая вперёд, отметим, что можно бороться за снижение этой вероятности, но совсем её убрать нельзя! И всётаки, что же будет в случае одновременного прихода нескольких перываний? Ответ:

  • Первое прерывание пропадёт.
  • Второе пропадёт.
  • Пропадут оба.

Грамотная операционная система способна минимизировать вероятность потери прерывания, но в любой системе такая возможность остаётся. Отсюда следует, что сбои операционных систем не всегда являются следствием ошибок разработчика.

При наличии классов прерываний механизм усложняется (рис.5). На каждый класс памяти мы имеем свою пару «старое и новое PSW». В регистре прерываний пять разрядов, по одному на каждый класс (рис.4). Теперь, если пришло прерывание по линии 2, процессор выбирает вторую пару PSW. Таким образом выполняется всегда обработчик прерываний, соответствующего класса.

Разумеется, разобранная схема не даёт ответа на все вопросы. Скорее возникают новые: Что будет, если одновременно придёт несколько прерываний одного класса? Но я не собираюсь отвечать сразу на все вопросы. Скорее я бы хотел получить вопросы читателей. На один вопрос: что будет, если прерывание придёт во время выполнения обработчика, необходимо ответить сразу.

Усложним описание процессора (рис.6). Кроме регистра прерываний существует регистр масок. Каждому разряду регистра прерываний может соответствовать регистр масок. Если в разряде масок хранится едица, будем говорить, что прерывание соответствующего класса замаскировано. Завершив засылку результата, процессор проверяет по регистру прерываний пришедшие прерывания, на только те, которые незамаскированы. Замаскированное прерывание не обрабатывается и будет ждать. Обработчик прерываний начинает свою работу с закрытыми масками. Его первое действие – сохранить поле «старое PSW» в системных списках. Как только это произойдёт, маски открываются и ожидающее прерывание происходит. Теперь возврат будет осуществляться корректно.

Некоторым разрядам регистра прерываний не соответствуют разряды маскию Существуют «немаскируемые прерывания», как правило, прерывания от схем контроля. Если, например, обнаружена некорректная работа оперативной памяти, компьютер следует выключить и вызвать инженера по обслуживанию.

Список литературы

1. Гук М., Юров В. Процессоры Pentium4, Athlon и Duron. СПб.:Питер, 2001.

2. Крылов Е.В., Типикин Н.Г. Принципы функционирования ЭВМ. Учебное пособие по курсам «Технология программирования» и «Операционные системы» для заочного отделения. — Обнинск: ИАТЭ, 2002.- 134с.

Продолжение следует.

2 комментариев

Похожие публикации
 
 

2 комментариев

  1. gopher:

    Спасибо. Очень необычно, нетипично, нетривиально. Вроде всё уж знал по этой проблеме. Ан не тут-то было. Жду продолжения.

  2. kev1939:

    Что именно Вам показалось необычным, неизвестным?

 
 

Вы можете оставить комментарий

 





 
 

Выполните простое задание (антиспам). Картинки можно сибирать приблизительно, без точной подгонки фрагментов.


 
 
 

Наверх