Мультипрограммирование на основе прерываний
Прерывание происходит в произвольной точке потока команд программы, которую программист не может прогнозировать.
Прерывания имеют некоторое сходство с процедурой в том, что в обоих случаях выполняется некоторая подпрограмма, обрабатывающая специальную ситуацию, а затем продолжается выполнение основной ветви программы.
В зависимости от источника, прерывания делятся на три больших класса:
· внешние;
· внутренние;
· программные;
Внешниепрерывания возникают в результате действий пользователя или в результате поступления сигналов от аппаратных устройств. Данный класс прерываний является ассинхроннымпо отношению к потоку инструкций прерываемой программы.
Аппаратура процессора работает так, что асинхронные прерывания возникают между выполнением двух соседних инструкций, при этом система после обработки прерывания продолжает выполнение процесса, уже начиная со следующей инструкции.
Внутренниепрерывания, происходят синхронновыполнению программы при появлении аварийной ситуации в ходе исполнения некоторой инструкции программы. Примерами являются деление на нуль, ошибки защиты памяти, обращения по несуществующему адресу. Прерывания возникают внутри выполнения команды.
Программныепрерывания отличаются от предыдущих двух классов тем, что они по своей сути не являются «истинными» прерываниями. Программное прерывание возникает при выполнении особой команды процессора, выполнение которой имитирует прерывание, то есть переход на новую последовательность инструкций.
Прерываниям приписывается приоритет, с помощью которого они ранжируются по степени важности и срочности. О прерываниях, имеющих одинаковое значение приоритета, говорят, что они относятся к одному уровню приоритетапрерываний.
Процедуры, вызываемые по прерываниям, обычно называют обработчиками прерываний,или процедурами обслуживания прерываний.
Аппаратные прерывания обрабатываются драйверами соответствующих внешних устройств, внутренние прерывания — специальными модулями ядра, а программные прерывания — процедурами ОС, обслуживающими системные вызовы.
Кроме этих модулей в ОС может находиться так называемый диспетчер прерываний, который координирует работу отдельных обработчиков прерываний.
Обобщенно последовательность действий аппаратных и программных средств по обработке прерывания можно описать следующим образом:
1.При возникновении сигнала (для аппаратных прерываний) или условия (для внутренних прерываний) прерывания происходит первичное аппаратное распознавание типа прерывания. Если прерывания данного типа в настоящий момент запрещены (приоритетной схемой или механизмом маскирования), то процессор продолжает поддерживать естественный ход выполнения команд.
В противном случае в зависимости от поступившей в процессор информации происходит автоматический вызов процедуры обработки прерывания, адрес которой находится в специальной таблице ОС, размещаемой либо в регистрах процессора, либо в определенном месте оперативной памяти.
2. Автоматически сохраняется некоторая часть контекста прерванного потока, которая позволит ядру возобновить исполнение потока процесса после обработки прерывания. В это подмножество включаются значения счетчика команд, слова состояния машины, хранящего признаки основных режимов работы процессора (пример слова — регистр EFLAGS в Intel Pentium), а также нескольких регистров общего назначения, которые требуются программе обработки прерывания. Может быть сохранен и полный контекст процесса, если ОС обслуживает данное прерывание со сменой процесса.
3. Одновременно с загрузкой адреса процедуры обработки прерываний в счетчик команд может автоматически выполняться загрузка нового значения слова состояния машины, которое определяет режимы работы процессора при обработке прерывания, в том числе работу в привилегированном режиме.
4. Временно запрещаются прерывания данного типа, чтобы не образовалась очередь вложенных друг в друга потоков одной и той же процедуры. Детали выполнения этой операции зависят от особенностей аппаратной платформы, например может использоваться механизм маскирования прерываний..
5. После того как прерывание обработано ядром ОС, прерванный контекст восстанавливается, и работа потока возобновляется с прерванного места.
Часть контекста восстанавливается аппаратно по команде возврата из прерываний (например, адрес следующей команды и слово состояния машины), а часть — программным способом, с помощью явных команд извлечения данных из стека. При возврате из прерывания блокировка повторных прерываний данного типа снимается.