Мультипрограммирование на основе прерываний
Система прерываний переводит процессор на выполнение потока команд, отличного от того, который выполнялся до сих пор, с последующим возвратом к исходному потоку.
В зависимости от источника прерывания делятся на три класса:
· внутренние;
· внешние;
· программные.
Внутренние прерывания (исключения) происходят при появлении аварийной ситуации в ходе исполнения некоторой инструкции программы – ошибки программирования.
Внешние (аппаратные) прерывания возникают в результате поступления сигналов от аппаратных устройств, в том числе от системного таймера, клавиатуры и других контроллеров внешних устройств компьютера. У процессора имеется специальный вход прерывания.
Программные прерывания возникают при выполнении особой команды процессора, исполнение которой имитирует прерывание, т. е. переход на новую последовательность инструкций.
Прерываниям приписывается приоритет, с помощью которого они ранжируются по степени важности и срочности. Процедуры, вызываемые по прерываниям, обычно называют обработчиками прерываний, или процедурами обслуживания прерываний.
Диспетчеризация прерываний является важной функцией операционной системы, и эта функция реализована практически во всех мультипрограммных ОС.
Можно заметить, что в общем случае в операционной системе реализуется двухуровневый механизм планирования работ. Верхний уровень планирования выполняется диспетчером прерываний, который распределяет процессорное время между потоками поступающих запросов на прерывание различных типов – внешних, внутренних и программных. Оставшееся процессорное время распределяется другим диспетчером – диспетчером потоков, на основании дисциплин планирования потоков.
На рис. 2.1 представлены уровни приоритетов при диспетчеризации различных прерываний в операционных системах семейства Windows NT.
Рис. 2.1. Уровни приоритетов при диспетчеризации прерываний в операционных системах Windows NT
Необработанные запросы на прерывание должны храниться в контроллерах устройств, чтобы не потеряться и дожидаться обслуживания при снижении уровня приоритета прерывания процессора, когда он закончит выполнение более срочных работ.
Особая роль в работе вычислительной системы играет системный таймер: на основании его прерываний обновляются системные часы, определяющие очередной момент вызова планировщика потоков, момент выдачи управляющего воздействия потоком реального времени (такие имеются в Windows NT) и многое другое. В виду важности немедленной обработки прерываний от таймера, ему дан весьма высокий уровень приоритета –более высокий, чем уровень любого устройства ввода-вывода.
Программные прерывания, обслуживающие системные вызовы от приложений (АРС), выполняются с низшим приоритетом, что соответствует концепции продолжения одного и того же процесса, но только в системной фазе, при выполнении системного вызова.
А вот для программных прерываний, исходящих от модулей ядра ОС, отводится более высокий уровень запросов, имеющих название «диспетчерский /DPC». Этот уровень приоритета называется диспетчерским, потому что именно в эту очередь помещаются программные запросы, вызывающие диспетчер потоков.
Управление памятью
Особая роль памяти объясняется тем, что процессор может выполнять инструкции программы только в том случае, если они находятся в оперативной памяти компьютера. Память распределяется как между модулями прикладных программ, так и между модулями самой операционной системой. Функции распределения и защиты памяти в ОС выполняет подсистема управления памятью.
Адресация к памяти
Для идентификации переменных и команд на различных этапах жизненного цикла программы используются символьные имена, виртуальные адреса и физические адреса ячеек памяти.
Символьные имена присваиваются пользователем при написании программы на алгоритмическом языке.
Виртуальные адреса, называемые иногда математическими, или логическими адресами, вырабатывает транслятор, переводящий программу на машинный язык. Поскольку во время трансляции не известно, в какое место памяти будет загружена программа, то транслятор присваивает переменным и командам виртуальные (условные) адреса, обычно считая по умолчанию, что начальным адресом программы будет нулевой адрес.
Физические адреса соответствуют номерам ячеек оперативной памяти, где в действительности расположены или будут расположены переменные и команды программы.
Существует два принципиально разных подхода к преобразованию виртуальных адресов в физические: статический и динамический.
При статическомподходе замена виртуальных адресов на физические выполняется один раз для каждого процесса во время начальной загрузки программы при помощи специального модуля – перемещающего загрузчика. При этом внутри программы меняются все адресно-зависимые указатели.
При динамическом подходе программа загружается в память в неизменном виде в виртуальных адресах, а при выполнении программы при каждом обращении к оперативной памяти выполняется преобразование виртуального адреса в физический на основании смещения адресов для данного процесса, хранящегося в специальном регистре операционной системы.
Второй способ является более гибким, так как программа жестко не привязана к первоначально выделенному ей участку памяти. Но первый вариант более экономичен, так как преобразование адресов выполняется только один раз при загрузке программы.
Совокупность виртуальных адресов процесса называется виртуальным адресным пространством, который одинаков у всех процессов системы.
Например, при использовании 32-х разрядных виртуальных адресов этот диапазон 0000000016…FFFFFFFF16 (232 = 4 Гбайт при адресации к ячейкам памяти размером 1 байт). Совпадение виртуальных адресов переменных и команд различных процессов не приводит к конфликтам, так как операционная система отображает их на разные физические адреса. При этом ОС отображает либо все виртуальное адресное пространство, либо только определенную его часть.
Необходимо различать максимально возможное адресное пространство процесса (потенциальное, определяемое разрядностью схем адресации) и назначенное (выделенное) процессу виртуальное адресное пространство – действительно нужное процессу для работы. В ходе выполнения процессу при необходимости может быть увеличено выделенное виртуальное адресное пространство.
Сегодня типична ситуация, когда объем виртуального адресного пространства превышает доступный объем оперативной памяти. В этом случае для хранения данных виртуального адресного пространства процесса, не помещающихся в оперативную память, используется внешняя память на жестком диске. Именно на этом принципе основана виртуальная память – современный механизм, используемый в ОС для управления памятью.
Следует отметить, что виртуально адресное пространство и виртуальная память – различные механизмы и они не обязательно реализуются в операционной системе одновременно.
Содержимое назначенного процессу виртуального адресного пространства, то есть коды команд, исходные и промежуточные данные, а также результаты вычислений, представляют собой образ процесса.
Обычно виртуальное адресное пространство процесса делится на две непрерывные части: системную, необходимую операционной системе, и пользовательскую. Системная часть виртуального адресного пространства является идентичной для всех процессов. Поэтому при смене активного процесса заменяется только пользовательская часть. Причем системная часть виртуальной памяти в ОС любого типа включает область, подвергаемую вытеснению на диск, и область, на которое вытеснение не распространяется.