В процессе эволюции возникло несколько важных концепций, которые стали неотъемлемой частью теории и практики ОС. Рассмотрим и опишем некоторые из них.
Операционная система, это — совокупность программ, выполняющие ранее рассмотренные функции. Для того чтобы для задач отвести как можно больший объем памяти, операционная система строится таким образом, чтобы постоянно в оперативной памяти располагалась только самая нужная ее часть. Эту часть операционной системы стали называть ядром.
Функции ядра:
Обработка прерываний.
Создание/уничтожение процесса.
Переключение процесса из состояния в состояние.
Диспетчеризация (регулировка).
Приостановка и активизация.
Синхронизация процесса.
Организация взаимодействия между процессами.
Манипулирование БУП.
Поддержка операций ввода/вывода.
Поддержка распределения и перераспределения памяти.
Поддержка работы файловой системы.
Системные вызовы
В любой операционной системе поддерживается механизм, который позволяет пользовательским программам обращаться к услугам ядра ОС. В операционных системах наиболее известной советской вычислительной машины БЭСМ-6 соответствующие средства «общения» с ядром назывались экстракодами, в операционных системах IBM они назывались системными макрокомандами и т. д. В ОС Unix такие средства называют системными вызовами.
Системные вызовы (system calls) — это интерфейс между операционной системой и пользовательской программой. Они создают, удаляют и используют различные объекты, главные из которых — процессы и файлы. Пользовательская программа запрашивает сервис у операционной системы, осуществляя системный вызов. Имеются библиотеки процедур, которые загружают машинные регистры определенными параметрами и осуществляют прерывание процессора, после чего управление передается обработчику данного вызова, входящему в ядро операционной системы. Цель таких библиотек — сделать системный вызов похожим на обычный вызов подпрограммы.
Основное отличие состоит в том, что при системном вызове задача переходит в привилегированный режим или режим ядра (kernel mode). Поэтому системные вызовы иногда еще называют программными прерываниями, в отличие от аппаратных прерываний, которые чаще называют просто прерываниями.
В этом режиме работает код ядра операционной системы, причем исполняется он в адресном пространстве и в контексте вызвавшей его задачи. Таким образом, ядро операционной системы имеет полный доступ к памяти пользовательской программы, и при системном вызове достаточно передать адреса одной или нескольких областей памяти с параметрами вызова и адреса одной или нескольких областей памяти для результатов вызова.
В большинстве операционных систем системный вызов осуществляется командой программного прерывания (INT). Программное прерывание — это синхронное событие, которое может быть повторено при выполнении одного и того же программного кода.
Прерывания
Прерывание (hardware interrupt) — это событие, генерируемое внешним (по отношению к процессору) устройством. Посредством аппаратных прерываний аппаратура либо информирует центральный процессор о том, что произошло какое-либо событие, требующее немедленной реакции (например, пользователь нажал клавишу), либо сообщает о завершении асинхронной операции ввода-вывода (например, закончено чтение данных с диска в основную память). Прерывания представляют собой механизм, позволяющий координировать параллельное функционирование отдельных устройств вычислительной системы и реагировать на особые состояния, возникающие при работе процессора. Т.е. прерывание – это принудительная передача управления от выполняемой программы к системе (а через нее – к соответствующей программе обработки прерывания), происходящая при возникновении определенного события.
Основная цель введения прерываний – реализация асинхронного режима функционирования и распараллеливание работы отдельных устройств вычислительного комплекса. Механизм прерываний реализуется аппаратно-программными средствами. Структуры систем прерываний (в зависимости от аппаратной архитектуры) могут быть самыми разными, но все они имеют одну общую особенность — прерывание непременно влечет за собой изменение порядка выполнения команд процессором.
Механизм обработки прерываний подразумевает за собой независимо от архитектуры вычислительной системы выполнение некоторой последовательности шагов:
установление факта прерывания (прием сигнала запроса на прерывание) и идентификация прерывания;
запоминание состояния прерванного процесса вычислений;
управление аппаратно передается на подпрограмму обработку прерывания;
сохранение информации о прерванной программе, которую не удалось спасти на шаге 2 с помощью аппаратуры;
выполнение программы, связанной с обработкой прерывания. Эта работа может быть выполнена той же подпрограммой, на которую было передано управление на шаге 3, но в операционных системах достаточно часто она реализуется путем последующего вызова соответствующей подпрограммы;
восстановление информации, относящейся к прерванному процессу;
возврат на прерванную программу.
Шаги 1-3 реализуются аппаратно, шаги 4-7 – программно.
Прерывания, возникающие при работе вычислительной системы, можно разделить на два основных класса: внешние (их иногда называют асинхронными) и внутренние (синхронные). Внешние прерывания вызываются асинхронными событиями, которые происходят вне прерываемого процесса, например:
— прерывания от таймера;
— прерывания от внешних устройств;
— прерывания по нарушению питания;
— прерывания с пульта оператора вычислительной системы.
Внутренние прерывания вызываются событиями, которые связаны с работой процессора и являются синхронными с его операциями. Примерами являются следующие запросы на прерывание:
— при нарушении адресации (в адресной части выполняемой команды указан запрещенный или несуществующий адрес;
— при делении на ноль;
— от средств контроля (например, вследствие обнаружения ошибки четности, ошибок в работе различных устройств).
Таблица 1. Основные классы прерываний
Программное прерывание | Генерируется в некоторых ситуациях, возникающих в результате выполнения команд. Такими ситуациями могут быть арифметическое переполнение, деление на ноль, попытка выполнить некорректную команду и ссылка на область памяти, доступ к которой пользователю запрещен. |
Прерывание по таймеру | Генерируется таймером процессора. Это прерывание позволяет операционной системе выполнять некоторые свои функции периодически, через заданные промежутки времени. |
Прерывание ввода-вывода | Генерируется контроллером ввода-вывода. Сигнализирует о нормальном завершении операции или о наличии ошибок. |
Аппаратное прерывание | Генерируется при возникновении таких аварийных ситуаций, как, например, падение напряжения в сети иди ошибка контроля четности памяти. |
Важный тип аппаратных прерываний — прерывания таймера, которые генерируются периодически через фиксированный промежуток времени. Прерывания таймера используются операционной системой при планировании процессов. Каждый тип аппаратных прерываний имеет собственный номер, однозначно определяющий источник прерывания.
Аппаратное прерывание — это асинхронное событие, то есть оно возникает вне зависимости от того, какой код исполняется процессором в данный момент. Обработка аппаратного прерывания не должна учитывать, какой процесс является текущим.
Прерывания в основном предназначены для повышения эффективности работы компьютерной системы.
Цикл исполнения программы с прерываниями
В цикле прерывания процессор проверяет наличие сигналов прерываний, свидетельствующих о происшедших прерываниях. При поступлении прерывания процессор приостанавливает работу с текущей программой и выполняет обработчик прерывания. Обработчики прерываний обычно входят в состав операционной системы. Как правило, эти программы определяют природу прерывания и выполняют необходимые действия. Когда обработчик прерываний завершает свою работу, процессор возобновляет выполнение программы пользователя с того места, где она была прервана.