Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
59
Добавлен:
20.03.2015
Размер:
273.92 Кб
Скачать

7.2.6. Прерывания в операционных системах

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

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

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

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

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

На рис. 7.10 приведены программы, необходимые для реализации важнейших функций многозадачного окружения. Во время запуска операционной системы выполняется инициализационная подпрограмма, обозначенная на рисунке как OSINIT. Кроме всего прочего эта подпрограмма загружает векторы прерываний, расположенные по отведенным для них фиксированным адресам, В них она запи­сывает начальные адреса программ обработки прерываний. В частности, OSINIT загружает начальный адрес программы-планировщика SHEDULER по адресу, соответствующему вектору прерывания таймера. Таким образом, в конце каждо­го кванта времени прерывание таймера приводит к выполнению этой программы.

Программа вместе с информацией, описывающей ее текущее состояние, опре­деляется ОС как процесс. Процесс может находиться в одном из трех состояний:

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

Предположим, что в течение заданного кванта времени программа А находится в состоянии выполнения. В конце этого кванта времени таймер прерывает работу этой программы и запускает планировщик SHEDULER. Основная задача програм­мы состоит в определении того, какая из пользовательских программ должна вы­полняться в течение следующего кванта времени. Она начинает свою работу с со­хранения всей информации, которая потребуется позднее, при возобновлении работы программы А, Эта информация, называемая состоянием программы, включает содержимое регистров, счетчик команд и слово состояния процессора. Регистры должны быть сохранены потому, что они могут содержать промежуточ­ные результаты вычислений, выполняющихся в момент окончания кванта време­ни. Счетчик команд указывает, с какой команды должно быть возобновлено вы­полнение программы. Слово состояния процессора содержит флаги условий и другую важную информацию, в том числе коды приоритетов.

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

OSINIT Установка векторов прерываний:

таймер квантования (SCHEDULER)

программное прерывание (OSSERVICES)

прерывания от клавиатуры (IOData)

OSSERVICES Анализ стека для определения запрошенной операции

Вызов соответствующей программы

SCHEDULER Сохранение состояния программы

Выбор готового к выполнению процесса

Восстановление сохраненного контекста нового процесса Проталкивание в стек новых значений FX и PC

Возврат из прерывания

а

IOINIT Перевод процесса в состояние блокировки

Инициализация указателя на буфер в памяти и счетчика

Вызов драйвера устройства для его инициализации и разрешения прерываний

Возврат из подпрограммы

IODATA Опрос устройств для определения инициатора прерывания

Вызов соответствующего драйвера

Перевод процесса в состояние готовности, если END-1

Возврат из прерывания

б

KBDINIT Разрешение прерываний

Возврат из подпрограммы

KBDDATA Проверка состояния устройства

Если устройство готово к работе, пересылка символа

Если значение символа равно CR, то флаг END устанавливается в 1, что соответствует запрету на прерывания; в противном случае END устанавливается в 0

Возврат из подпрограммы

в

Рис. 7.10. Некоторые из программ операционной системы:

программы инициализации ОС, сервисов и планировщика (а);

программы ввода-вывода (б); драйвер клавиатуры (а)

Предположим, что программе А требуется прочитать вводимую с клавиатуры строку. Вместо того чтобы выполнять эту операцию самостоятельно, програм­ма запрашивает у операционной системы функцию ввода-вывода. Для передачи операционной системе информации о требуемой операции (в том числе об уст­ройстве ввода-вывода и адресе буфера в области данных программы, в который следует поместить прочитанную строку) она использует стек или регистры про­цессора. Затем программа выполняет команду программного прерывания. Вектор прерывания этой команды указывает на подпрограмму OSSERVICES, представ­ленную на рис. 7.10, а. Эта подпрограмма анализирует информацию в стеке и инициирует запрошенную операцию с помощью вызова соответствующей под­программы ОС. В нашем примере она вызывает подпрограмму IOINIT, отвечаю­щую за инициирование операций ввода-вывода (рис. 7.10, б).

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

Как правило, операционные системы строятся так, чтобы все программное обес­печение, связанное с конкретным устройством, заключалось в отдельный модуль, называемый драйверам устройства. Такой модуль легко добавить в операцион­ную систему и легко из нее удалить. Мы предположили, что драйвер клавиатуры состоит из двух подпрограмм, KBDINIT и KBDDATA (рис. 7.10, в). Подпрограм­ма IOINIT вызывает KBDINIT, выполняющую инициализацию устройства и его интерфейсной схемы. Кроме того, подпрограмма KBDINIT разрешает прерыва­ния от данного устройства, установив соответствующий бит в управляющем ре­гистре его интерфейсной схемы, а затем возвращает управление подпрограмме IOINIT, которая, в свою очередь, возвращает управление подпрограмме OSSER­VICES. После этого клавиатура готова к операциям пересылки данных. После ка­ждого нажатия клавиши она будет генерировать запрос прерывания.

После возврата управления подпрограмме OSSERVICES планировщик SHEDULER выбирает для выполнения другую пользовательскую программу. Он не сможет выбрать программу А, поскольку она пока находится в заблокированном состоянии. Команда возврата из прерывания, после которой начинается выполне­ние выбранной пользовательской программы, разрешает прерывания в процессо­ре, загрузив в его регистр состояния новое содержимое. Таким образом, сгенери­рованный клавиатурой запрос прерывания будет принят процессором. Вектор этого прерывания указывает на программу ОС, названную IODATA. Поскольку к одной линии запроса прерывания может быть подсоединено несколько уст­ройств, программа IODATA начинает опрашивать эти устройства, чтобы узнать, кому из них потребовалось обслуживание. Затем она вызывает соответствующий драйвер устройства для обслуживания запроса. В нашем случае будет вызван драйвер KBDDATA, который перешлет в процессор один символ. Если это сим­вол возврата каретки, драйвер установит значение флага END в 1, чтобы проин­формировать IODATA о завершении операции ввода-вывода. После этого про­грамма IODATA изменит состояние процесса А — теперь он будет не блокиро­ванным, а готовым к выполнению, и когда подойдет его очередь, планировщик сможет выбрать его для выполнения в течение очередного кванта времени.

Соседние файлы в папке Архитектура компьютеров