Архитектура операционных систем
Большинство современных операционных систем представляют собой хорошо структурированные программные модули системы, приспособленные к развитию, расширению и переносу на другие аппаратные платформы. Какой-либо единой архитектуры операционных систем не существует, но существуют универсальные подходы к структурированию ОС.
1.3.1. Архитектура операционной системы,
основанная на ядре
При реализации этой архитектуры все программные модули ОС делятся на модули ядра и вспомогательные модули.
Ядрооперационной системы образуют программные модули, решающие внутрисистемные задачи организации вычислительного процесса. Кроме этого именно ядро содержит функции, образующие интерфейс прикладного программирования – API, через который приложения обращаются к операционной системе посредством системных вызовов.
Функции, выполняемые модулями ядра, являются наиболее часто используемыми функциями ОС, поэтому скорость их выполнения определяет производительность всей системы в целом.
Для обеспечения высокой скорости работы операционной системы все модули ядра или большая их часть постоянно находятся в оперативной памяти, то есть являются резидентными.
Формат программного модуля ядра обычно отличается от формата приложений.
Остальные модули операционной системы, выполняющие вспомогательные функции ОС, оформляются в виде приложений или в виде библиотек процедур. Некоторые из них могут включаться в состав операционной системы даже пользователем, как в процессе ее инсталляции, так и в процессе эксплуатации ОС.
Вспомогательные модули для выполнения своих функций обращаются к функциям ядра, как и обычные приложения, посредством системных вызовов. Поэтому трудно провести четкую грань между операционной системой и приложениями (рис. 1.3).
Рис. 1.3. Нечеткость границы между операционной системой и приложениями
Вспомогательные модули операционной системы обычно загружаются в основную память только на время выполнения своих функций, то есть являются транзитными.
Разделение ОС на ядро и модули-приложения обеспечивает легкую расширяемость системы. Добавление новой функции в ОС заключается в разработки нового модуля-приложения без модификации ядра.
Важным свойством архитектуры операционной системы, основанной на ядре, является возможность защиты кодов и данных ОС за счет выполнения функций ядра в привилегированном режиме.
Для этого аппаратура компьютера (процессор) должна поддерживать как минимум два режима работы – пользовательский режим (user mode) и привилегированный режим, который также называют режимом ядра (kernel mode). Приложения ставятся в подчиненное положение за счет запрета выполнения в пользовательском режиме некоторых критичных команд, связанных с переключением процессора с задачи на задачу, управлением устройствами ввода-вывода, доступом к механизмам распределения и защиты памяти.
Очень важно, что механизмы защиты памяти используются ОС не только для защиты своих областей памяти от приложений, но и для защиты областей памяти, выделенных операционной системой какому-нибудь приложению, от остальных приложений. Каждое приложение работает в своем адресном пространстве, так что его ошибки не оказывают влияние на остальные приложения и операционную систему.
Однако во всех типах процессоров из-за дополнительной двукратной задержки на переключение из привилегированного режима в пользовательский и обратно переход на процедуру со сменой режима выполняется медленнее, чем вызов процедуры без смены режима.
Вычислительную систему, работающую под управлением операционной системы на основе ядра, можно рассматривать как систему, состоящую из трех иерархически расположенных слоев: нижний слой образует аппаратура, промежуточный – ядро, а вспомогательные модули и приложения составляют верхний слой системы (рис. 1.4).
Рис. 1.4. Трехслойная структура вычислительной системы
Многослойный подход является универсальным и эффективным способом декомпозиции сложных систем любого типа, в том числе и программных. Каждый слой обслуживает вышележащий слой, выполняя для него некоторый набор функций, которые образуют межслойный интерфейс. На основе функций нижележащего слоя следующий (вверх по иерархии) слой строит свои функции – более сложные и более мощные, которые в свою очередь оказываются примитивами для создания еще более мощных функций вышележащего слоя.
Строгие правила касаются только взаимодействия между слоями системы. А между модулями внутри слоя связи могут быть произвольными. Такая организация системы существенно упрощает ее разработку и модернизацию.
Многослойный подход обычно распространяется и на структуру ядра. Ядро может состоять из следующих слоев:
· Средства аппаратной поддержки ОС – аппаратные узлы процессора, которые прямо участвуют в организации вычислительных процессов.
· Машинно-зависимые компоненты ОС – программные модули, отражающие специфику аппаратной платформы компьютера, которые экранируют вышележащие слои от аппаратуры.
· Базовые механизмы ядра – модули, выполняющие примитивные операции ядра, которые не принимают решений о распределении ресурсов.
· Менеджеры (диспетчеры) ресурсов – модули, реализующие принятые в ОС стратегии управления основными ресурсами.
· Интерфейс системных вызовов взаимодействует с приложениями и вспомогательными модулями ОС, образует прикладной программный интерфейс ОС (API).
Выбор количества слоев ядра является ответственным и сложным делом: увеличение числа слоев ведет к некоторому замедлению работы ядра за счет дополнительных накладных расходов на межслойное взаимодействие, а уменьшение числа слоев ухудшает расширяемость и логичность системы.
Обычно операционные системы, прошедшие долгий путь эволюционного развития, например, многие версии UNIX, имеют неупорядоченное ядро с небольшим числом четко выделенных слоев, а у сравнительно «молодых» ОС, таких как семейство Windows на технологии NT, ядро разделено на большое число слоев и их взаимодействие формализовано в гораздо большей степени.
Почти все современные аппаратные платформы (процессоры) имеют типичный набор средств аппаратной поддержки ОС:
· средства поддержки привилегированного режима,обеспечивающие переключение процессора в привилегированные режимы из пользовательского и обратно;
· средства трансляции адресов, выполняющие преобразование виртуальных адресов, которые содержатся в кодах процессов, в адреса физической оперативной памяти; таблицы трансляции тоже находятся в оперативной памяти, а в процессоре только хранятся указатели на эти области памяти;
· средства переключения процессов, предназначенные для быстрого сохранения контекста приостанавливаемых процессов и восстановления контекстов активизируемых процессов;
· систему прерываний, которая позволяет компьютеру реагировать на внешние события, например завершения операции ввода-вывода внешним устройством и т. п.; сигнал прерывания заставляет процессор прервать выполнение последовательности команд, задаваемых выполняемым процессом, и вызывает переход на определенную процедуру, называемую процедурой обработки прерываний; после завершения обработки прерывания происходит возврат к исполняемому процессу;
· системный таймер, который реализуется как счетчик тактовых импульсов процессора (счетчик считает в обратную сторону до нуля) и обеспечивает системе выдержку необходимых интервалов времени; при достижения нуля возникает прерывание от системного таймера, которое можно использовать, например, для смены исполняемого процесса;
· средства защиты областей памяти,которые обеспечивают на аппаратном уровне проверку возможности программного кода осуществлять какие-либо операции с определенной областью памяти.
Одна и та же операционная система не может без каких-либо изменений устанавливаться на компьютерах, отличающихся типом процессора или способом организации всей аппаратуры. В модулях ОС не могут не отразиться такие особенности аппаратной платформы, как количество типов прерываний, состав регистров общего назначения и системных регистров, состояние которых нужно сохранять в контексте процесса, особенности подключения внешних устройств и многие другие.
Многослойное проектирование ядра позволяет выделить машинно-зависимые модули в отдельный слой, при этом остальные модули ядра не будут зависеть от особенностей аппаратной платформы.
Такая локализация машинно-зависимых модулей существенно упрощает перенос операционной системы на другую аппаратную платформу.
Для уменьшения количества машинно-зависимых модулей производители ОС обычно ограничивают их универсальность, то есть независимость распространяется только на несколько типов процессоров. Например, независимость Windows NT ограничена четырьмя типами процессоров, кроме этого поставляются различные варианты ядра для однопроцессорных и многопроцессорных компьютеров.
Для компьютеров на основе процессоров Intel x86/Pentium разработка экранирующего машинно-зависимого слоя ОС несколько упрощается за счет встроенной в ПЗУ компьютера базовой системы ввода-вывода – BIOS.
BIOS содержит драйверы для всех устройств, входящих в базовую конфигурацию компьютера: жестких и гибких дисков, клавиатуры, монитора и т. д. Эти драйверы выполняют самые примитивные операции с управляемыми устройствами, например, чтение группы секторов с определенной дорожки диска, но за счет этих операций экранируются различия аппаратных платформ компьютеров на процессорах Intel разных производителей.
Следовательно, BIOS предоставляет одинаковый интерфейс машинно-зависимой части для работы машинно-независимой части операционной системы.
Разработчики операционных систем могут пользоваться слоем драйверов BIOS как частью машинно-зависимого слоя ОС, а могут и заменить все или часть драйверов BIOS компонентами операционной системы.
Если код операционной системы может быть легко перенесен с процессора одного типа на процессор другого типа и с аппаратной платформы одного типа на аппаратную платформу другого типа, то такую ОС называют переносимой или мобильной.
Для реализации переносимости кроме локализации слоя машинно-зависимых модулей большая часть кода машинно-независимого слоя ядра должна быть написана на стандартизованном языке высокого уровня, трансляторы которого имеются на всех машинах, куда предполагается переносить систему. Обычно это язык С.
Модуль операционной системы, написанная на ассемблере, является переносимым только в тех случаях, когда перенос ОС планируется на компьютер, обладающий той же системой команд.