0

Обработка прерываний

Прерывание вызывает ряд событий, которые происходят как в аппаратном, так и в программном обеспечении.

После завершения работы устройства ввода-вывода происходит следующее:

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

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

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

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

Множественные прерывания

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

В такой ситуации возможны два подхода. Первый — это запретить новые прерывания до тех пор, пока обрабатывается предыдущее. Запрет прерываний означает, что процессор может и должен игнорировать любой новый сигнал прерывания. Если в это время происходит прерывание, оно обычно остается в состоянии ожидания, и до него дойдет очередь, когда процессору вновь будет можно обрабатывать прерывания. Таким образом, если во время работы программы пользователя происходит прерывание, на другие прерывания тут же накладывается запрет. После завершения работы программы обработки прерывания запрет снимается, перед возвратом к исполнению прерванной программы процессор проверяет наличие других прерываний. Это удачный и простой подход, при котором прерывания обрабатываются в строго последовательном порядке. Однако недостатком такого подхода является то, что он не учитывает приоритет прерываний и те ситуации, в которых время является критическим параметром. Например, когда по коммуникационной линии приходит какая-то информация, может понадобиться быстро ее принять, чтобы освободить место для других входных данных. Если не обработать первый пакет входных данных перед получением второго пакета, данные могут потеряться вследствие загруженности и переполнения буфера устройства ввода-вывода.

При втором подходе учитывается приоритет прерывания, что позволяет приостановить обработку прерывания с более низким приоритетом в пользу прерывания с более высоким приоритетом.

Исключительные ситуации

Исключительная ситуация (exception) — событие, возникающее в результате попытки выполнения программой команды, которая по каким- то причинам не может быть выполнена до конца. Примерами таких команд могут быть попытки доступа к ресурсу при отсутствии достаточных привилегий или обращения к отсутствующей странице памяти. Исключительные ситуации, как и системные вызовы, являются синхронными событиями, возникающими в контексте текущей задачи. Исключительные ситуации можно разделить на исправимые и неисправимые. К исправимым ситуациям относятся такие исключительные ситуации, как отсутствие нужной информации в оперативной памяти. После устранения причины исправимой исключительной ситуации программа может выполняться дальше. Возникновение в процессе работы операционной системы исправимых исключительных ситуаций считается нормальным явлением. Неисправимые исключительные ситуации чаще всего возникают в результате ошибок в программах (например, деление на ноль). Обычно в таких случаях операционная система реагирует завершением программы, вызвавшей исключительную ситуацию.

Файлы

Файлы предназначены для хранения информации на внешних носителях, то есть принято, что информация, записанная, например, на диске, должна находиться внутри файла. Обычно под файлом понимают именованную часть пространства на носителе информации. Главная задача файловой системы (file system) — скрыть особенности ввода-вывода и дать программисту простую абстрактную модель файлов, независимых от устройств. Для чтения, создания, удаления, записи, открытия и закрытия файлов также имеется обширная категория системных вызовов (создание, удаление, открытие, закрытие, чтение и т. д.). Пользователям хорошо знакомы такие связанные с организацией файловой системы понятия, как каталог, текущий каталог, корневой каталог, путь. Для манипулирования этими объектами в операционной системе имеются системные/вызовы.

Одна из наиболее фундаментальных концепций — концепция процесса в ОС.

 


0

Основные понятия, концепции ОС

В процессе эволюции возникло несколько важных концепций, кото­рые стали неотъемлемой частью теории и практики ОС. Рассмотрим и опишем некоторые из них.

Операционная система,  это — совокупность программ, выполняющие ранее рассмотренные функции. Для того чтобы для задач отвести как можно больший объем памяти, операционная система строится таким образом, чтобы постоянно в оперативной памяти располагалась только самая нужная ее часть. Эту часть операционной системы стали называть ядром.

Функции ядра:

­   Обработка прерываний.

­   Создание/уничтожение процесса.

­   Переключение процесса из состояния в состояние.

­   Диспетчеризация (регулировка).

­   Приостановка и активизация.

­   Синхронизация процесса.

­   Организация взаимодействия между процессами.

­   Манипулирование БУП.

­   Поддержка операций ввода/вывода.

­   Поддержка распределения и перераспределения памяти.

­   Поддержка работы файловой системы.

Системные вызовы

В любой операционной системе поддерживается механизм, который позволяет пользовательским программам обращаться к услугам ядра ОС. В операционных системах наиболее известной советской вычислительной машины БЭСМ-6 соответствующие средства «общения» с ядром назывались экстракодами, в операционных системах IBM они назывались сис­темными макрокомандами и т. д. В ОС Unix такие средства называют си­стемными вызовами.

Системные вызовы (system calls) — это интерфейс между операционной системой и пользовательской программой. Они создают, удаляют и используют различные объекты, главные из которых — процессы и файлы. Пользовательская программа запрашивает сервис у операционной систе­мы, осуществляя системный вызов. Имеются библиотеки процедур, ко­торые загружают машинные регистры определенными параметрами и осуществляют прерывание процессора, после чего управление передается обработчику данного вызова, входящему в ядро операционной системы. Цель таких библиотек — сделать системный вызов похожим на обычный вызов подпрограммы.

Основное отличие состоит в том, что при системном вызове задача переходит в привилегированный режим или режим ядра (kernel mode). По­этому системные вызовы иногда еще называют программными прерыва­ниями, в отличие от аппаратных прерываний, которые чаще называют просто прерываниями.

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

В большинстве операционных систем системный вызов осуществля­ется командой программного прерывания (INT). Программное прерыва­ние — это синхронное событие, которое может быть повторено при выпол­нении одного и того же программного кода.

Прерывания

Прерывание (hardware interrupt) — это событие, генерируемое внеш­ним (по отношению к процессору) устройством. Посредством аппарат­ных прерываний аппаратура либо информирует центральный процессор о том, что произошло какое-либо событие, требующее немедленной ре­акции (например, пользователь нажал клавишу), либо сообщает о завер­шении асинхронной операции ввода-вывода (например, закончено чте­ние данных с диска в основную память). Прерывания  представляют собой механизм, позволяющий координировать параллельное функционирование отдельных устройств  вычислительной системы и реагировать на особые состояния, возникающие при работе процессора. Т.е. прерывание – это принудительная передача управления от выполняемой программы к системе (а через нее – к соответствующей программе обработки прерывания), происходящая при возникновении определенного события.

Основная цель введения прерываний – реализация асинхронного режима функционирования и распараллеливание работы отдельных устройств вычислительного комплекса. Механизм прерываний реализуется аппаратно-программными средствами. Структуры систем прерываний (в зависимости от аппаратной архитектуры) могут быть самыми разными, но все они имеют одну общую особенность  — прерывание непременно влечет за собой изменение порядка выполнения команд процессором.

Механизм обработки прерываний подразумевает за собой независимо от архитектуры вычислительной системы выполнение некоторой последовательности шагов:

­   установление факта прерывания (прием сигнала запроса на прерывание) и идентификация прерывания;

­   запоминание состояния прерванного процесса вычислений;

­   управление аппаратно передается на подпрограмму обработку прерывания;

­   сохранение информации о прерванной программе, которую не удалось спасти на шаге 2 с помощью аппаратуры;

­   выполнение программы, связанной с обработкой прерывания. Эта работа может быть выполнена той же подпрограммой, на которую было передано управление на шаге 3, но в операционных системах достаточно часто она реализуется путем последующего вызова соответствующей подпрограммы;

­   восстановление информации, относящейся к прерванному процессу;

­   возврат на прерванную программу.

Шаги 1-3 реализуются аппаратно, шаги 4-7 – программно.

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

—          прерывания от таймера;

—          прерывания от внешних устройств;

—          прерывания по нарушению питания;

—          прерывания с пульта оператора вычислительной системы.

Внутренние прерывания вызываются событиями, которые связаны с работой процессора и являются синхронными с его операциями. Примерами являются следующие запросы на прерывание:

—          при нарушении адресации (в адресной части выполняемой команды указан запрещенный или несуществующий адрес;

—          при делении на ноль;

—          от средств контроля (например, вследствие обнаружения ошибки четности, ошибок в работе различных устройств).

Таблица  1. Основные классы прерываний

Программное прерывание Генерируется в некоторых ситуациях, возникающих в результате выполнения команд. Такими ситуациями могут быть арифметическое переполнение, деление на ноль, попытка выполнить некорректную команду и ссылка на область памяти, доступ к которой пользователю запрещен.
Прерывание по таймеру Генерируется таймером процессора. Это прерывание позволяет операционной системе выполнять некоторые свои функции периодически, через заданные промежутки времени.
Прерывание ввода-вывода Генерируется контроллером ввода-вывода. Сигнализирует о нормальном завершении операции или о наличии ошибок.
Аппаратное прерывание Генерируется при возникновении таких аварийных ситуаций, как, например, падение напряжения в сети иди ошибка контроля четности памяти.

 

Важный тип аппаратных преры­ваний — прерывания таймера, которые генерируются периодически через фиксированный промежуток времени. Прерывания таймера используют­ся операционной системой при планировании процессов. Каждый тип аппаратных прерываний имеет собственный номер, однозначно опреде­ляющий источник прерывания.

Аппаратное прерывание — это асинхрон­ное событие, то есть оно возникает вне зависимости от того, какой код ис­полняется процессором в данный момент. Обработка аппаратного преры­вания не должна учитывать, какой процесс является текущим.

Прерывания в основном предназначены для повышения эффективности работы компьютерной системы.

Цикл исполнения программы с прерываниями

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