Системные вызовы и прерывания. Многозадачность

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

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

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

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

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

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

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

3. Программные прерывания – это прерывания, которые возникают при выполнении особой команды процессора (например: INT в процессорах Intel Pentium; trap в процессорах Motorola; syscall в процессорах MIPS; Ticc в процессорах SPARC), выполнение которой имитирует прерывание, то есть переход на новую последовательность инструкций. При выполнении команды программного прерывания процессор отрабатывает туже последовательность действий, что и при возникновении внешнего или внутреннего прерывания. Практически все современные процессоры имеют в системе команд инструкции программных прерываний, которые предоставляют возможность смены пользовательского режима на привилегированный. Программные прерывания используются для выполнения системных вызовов и имеют приоритет, с помощью которого они ранжируются по степени важности и срочности. Все источники прерываний делятся на классы, каждому из которых присваивается свой приоритет.

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

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

Особенности аппаратной реализации прерываний оказывают влияние на средства программной поддержки прерываний в операционной системе.

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

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

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

Обобщенная последовательность действий аппаратных и программных средств по обработке прерываний следующая.

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

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

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

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

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

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

С классом устройств ввода-вывода связана область памяти – вектор прерываний, содержащая адрес процедуры обработки прерываний. Например, в момент прерывания диска работал пользовательский процесс. Содержимое счетчика команд процесса, слово состояния программы и регистры записываются в текущий стек аппаратными средствами прерывания. Затем происходит переход по адресу, указанному в векторе прерывания диска. Вся остальная обработка прерывания производится программным обеспечением, например процедурой обработки прерываний.

Таблица 3.3.

Схема обработки прерывания

Обработка прерывания нижним уровнем операционной системы
1. Аппаратное обеспечение сохраняет в стеке счетчик команд и т. п. 2. Аппаратное обеспечение загружает новый счетчик команд из вектора прерываний. 3. Процедура на ассемблере сохраняет регистры. 4. Процедура на ассемблере устанавливает новый стек. 5. Запускается программа обработки прерываний на С, которая считывает и буферизирует входные данные. 6. Планировщик выбирает следующий процесс. 7. Программа на С передает управление процедуре на ассемблере. 8.Процедура на ассемблере запускает новый процесс.

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

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

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: