Современные концепции и технологии проектирования операционных систем
Операционная система является
сердцевиной сетевого программного
обеспечения, она создает среду для
выполнения приложений и во многом
определяет, какими полезными для
пользователя свойствами эти
приложения будут обладать. В связи
с этим рассмотрим требования,
которым должна удовлетворять
современная ОС.
Очевидно, что главным
требованием, предъявляемым к
операционной системе, является
способность выполнения основных
функций: эффективного управления
ресурсами и обеспечения удобного
интерфейса для пользователя и
прикладных программ. Современная
ОС, как правило, должна
реализовывать мультипрограммную
обработку, виртуальную память,
свопинг, поддерживать многооконный
интерфейс, а также выполнять многие
другие, совершенно необходимые
функции. Кроме этих функциональных
требований к операционным системам
предъявляются не менее важные
рыночные требования. К этим
требованиям относятся:
- Расширяемость. Код должен
быть написан таким образом,
чтобы можно было легко внести
дополнения и изменения, если
это потребуется, и не нарушить
целостность системы.
- Переносимость. Код должен
легко переноситься с
процессора одного типа на
процессор другого типа и с
аппаратной платформы (которая
включает наряду с типом
процессора и способ
организации всей аппаратуры
компьютера) одного типа на
аппаратную платформу другого
типа.
- Надежность и
отказоустойчивость. Система
должна быть защищена как от
внутренних, так и от внешних
ошибок, сбоев и отказов. Ее
действия должны быть всегда
предсказуемыми, а приложения
не должны быть в состоянии
наносить вред ОС.
- Совместимость. ОС должна
иметь средства для выполнения
прикладных программ,
написанных для других
операционных систем. Кроме
того, пользовательский
интерфейс должен быть
совместим с существующими
системами и стандартами.
- Безопасность. ОС должна
обладать средствами защиты
ресурсов одних пользователей
от других.
- Производительность.
Система должна обладать
настолько хорошим
быстродействием и временем
реакции, насколько это
позволяет аппаратная
платформа.
Рассмотрим более подробно
некоторые из этих требований.
В то время, как аппаратная часть
компьютера устаревает за несколько
лет, полезная жизнь операционных
систем может измеряться
десятилетиями. Примером может
служить ОС UNIX. Поэтому операционные
системы всегда эволюционно
изменяются со временем, и эти
изменения более значимы, чем
изменения аппаратных средств.
Изменения ОС обычно представляют
собой приобретение ею новых
свойств. Например, поддержка новых
устройств, таких как CD-ROM,
возможность связи с сетями нового
типа, поддержка многообещающих
технологий, таких как графический
интерфейс пользователя или
объектно-ориентированное
программное окружение,
использование более чем одного
процессора. Сохранение целостности
кода, какие бы изменения не
вносились в операционную систему,
является главной целью разработки.
Расширяемость может достигаться
за счет модульной структуры ОС, при
которой программы строятся из
набора отдельных модулей,
взаимодействующих только через
функциональный интерфейс. Новые
компоненты могут быть добавлены в
операционную систему модульным
путем, они выполняют свою работу,
используя интерфейсы,
поддерживаемые существующими
компонентами.
Использование объектов для
представления системных ресурсов
также улучшает расширяемость
системы. Объекты - это абстрактные
типы данных, над которыми можно
производить только те действия,
которые предусмотрены специальным
набором объектных функций. Объекты
позволяют единообразно управлять
системными ресурсами. Добавление
новых объектов не разрушает
существующие объекты и не требует
изменений существующего кода.
Прекрасные возможности для
расширения предоставляет подход к
структурированию ОС по типу
клиент-сервер с использованием
микроядерной технологии. В
соответствии с этим подходом ОС
строится как совокупность
привилегированной управляющей
программы и набора
непривилегированных
услуг-серверов. Основная часть ОС
может оставаться неизменной в то
время, как могут быть добавлены
новые серверы или улучшены старые.
Средства вызова удаленных
процедур (RPC) также дают возможность
расширить функциональные
возможности ОС. Новые программные
процедуры могут быть добавлены в
любую машину сети и немедленно
поступить в распоряжение
прикладных программ на других
машинах сети.
Некоторые ОС для улучшения
расширяемости поддерживают
загружаемые драйверы, которые
могут быть добавлены в систему во
время ее работы. Новые файловые
системы, устройства и сети могут
поддерживаться путем написания
драйвера устройства, драйвера
файловой системы или транспортного
драйвера и загрузки его в систему.
Требование переносимости кода
тесно связано с расширяемостью.
Расширяемость позволяет улучшать
операционную систему, в то время
как переносимость дает возможность
перемещать всю систему на машину,
базирующуюся на другом процессоре
или аппаратной платформе, делая при
этом по возможности небольшие
изменения в коде. Хотя ОС часто
описываются либо как переносимые,
либо как непереносимые,
переносимость - это не бинарное
состояние. Вопрос не в том, может ли
быть система перенесена, а в том,
насколько легко можно это сделать.
Написание переносимой ОС
аналогично написанию любого
переносимого кода - нужно следовать
некоторым правилам.
Во-первых, большая часть кода
должна быть написана на языке,
который имеется на всех машинах,
куда вы хотите переносить систему.
Обычно это означает, что код должен
быть написан на языке высокого
уровня, предпочтительно
стандартизованном, например, на
языке С. Программа, написанная на
ассемблере, не является
переносимой, если только вы не
собираетесь переносить ее на
машину, обладающую командной
совместимостью с вашей.
Во-вторых, следует учесть, в какое
физическое окружение программа
должна быть перенесена. Различная
аппаратура требует различных
решений при создании ОС. Например,
ОС, построенная на 32-битовых
адресах, не может быть перенесена
на машину с 16-битовыми адресами
(разве что с огромными трудностями).
В-третьих, важно минимизировать
или, если возможно, исключить те
части кода, которые
непосредственно взаимодействуют с
аппаратными средствами.
Зависимость от аппаратуры может
иметь много форм. Некоторые
очевидные формы зависимости
включают прямое манипулирование
регистрами и другими аппаратными
средствами.
В-четвертых, если аппаратно
зависимый код не может быть
полностью исключен, то он должен
быть изолирован в нескольких
хорошо локализуемых модулях.
Аппаратно-зависимый код не должен
быть распределен по всей системе.
Например, можно спрятать
аппаратно-зависимую структуру в
программно-задаваемые данные
абстрактного типа. Другие модули
системы будут работать с этими
данными, а не с аппаратурой,
используя набор некоторых функций.
Когда ОС переносится, то изменяются
только эти данные и функции,
которые ими манипулируют.
Для легкого переноса ОС при ее
разработке должны быть соблюдены
следующие требования:
- Переносимый язык высокого
уровня. Большинство
переносимых ОС написано на
языке С (стандарт ANSI X3.159-1989).
Разработчики выбирают С
потому, что он стандартизован,
и потому, что С-компиляторы
широко доступны. Ассемблер
используется только для тех
частей системы, которые должны
непосредственно
взаимодействовать с
аппаратурой (например,
обработчик прерываний) или для
частей, которые требуют
максимальной скорости
(например, целочисленная
арифметика повышенной
точности). Однако
непереносимый код должен быть
тщательно изолирован внутри
тех компонентов, где он
используется.
- Изоляция процессора.
Некоторые низкоуровневые
части ОС должны иметь доступ к
процессорно-зависимым
структурам данных и регистрам.
Однако код, который делает это,
должен содержаться в небольших
модулях, которые могут быть
заменены аналогичными
модулями для других
процессоров.
- Изоляция платформы.
Зависимость от платформы
заключается в различиях между
рабочими станциями разных
производителей, построенными
на одном и том же процессоре
(например, MIPS R4000). Должен быть
введен программный уровень,
абстрагирующий аппаратуру
(кэши, контроллеры прерываний
ввода-вывода и т. п.) вместе со
слоем низкоуровневых программ
таким образом, чтобы
высокоуровневый код не
нуждался в изменении при
переносе с одной платформы на
другую.
Одним из аспектов совместимости
является способность ОС выполнять
программы, написанные для других ОС
или для более ранних версий данной
операционной системы, а также для
другой аппаратной платформы.
Необходимо разделять вопросы
двоичной совместимости и
совместимости на уровне исходных
текстов приложений. Двоичная
совместимость достигается в том
случае, когда можно взять
исполняемую программу и запустить
ее на выполнение на другой ОС. Для
этого необходимы: совместимость на
уровне команд процессора,
совместимость на уровне системных
вызовов и даже на уровне
библиотечных вызовов, если они
являются динамически связываемыми.
Совместимость на уровне исходных
текстов требует наличия
соответствующего компилятора в
составе программного обеспечения,
а также совместимости на уровне
библиотек и системных вызовов. При
этом необходима перекомпиляция
имеющихся исходных текстов в новый
выполняемый модуль.
Совместимость на уровне исходных
текстов важна в основном для
разработчиков приложений, в
распоряжении которых эти исходные
тексты всегда имеются. Но для
конечных пользователей
практическое значение имеет только
двоичная совместимость, так как
только в этом случае они могут
использовать один и тот же
коммерческий продукт, поставляемый
в виде двоичного исполняемого кода,
в различных операционных средах и
на различных машинах.
Обладает ли новая ОС двоичной
совместимостью или совместимостью
исходных текстов с существующими
системами, зависит от многих
факторов. Самый главный из них -
архитектура процессора, на котором
работает новая ОС. Если процессор,
на который переносится ОС,
использует тот же набор команд
(возможно с некоторыми
добавлениями) и тот же диапазон
адресов, тогда двоичная
совместимость может быть
достигнута достаточно просто.
Гораздо сложнее достичь двоичной
совместимости между процессорами,
основанными на разных
архитектурах. Для того, чтобы один
компьютер выполнял программы
другого (например, DOS-программу на
Mac), этот компьютер должен работать
с машинными командами, которые ему
изначально непонятны. Например,
процессор типа 680x0 на Mac должен
исполнять двоичный код,
предназначенный для процессора 80x86
в PC. Процессор 80x86 имеет свои
собственные дешифратор команд,
регистры и внутреннюю архитектуру.
Процессор 680x0 не понимает двоичный
код 80x86, поэтому он должен выбрать
каждую команду, декодировать ее,
чтобы определить, для чего она
предназначена, а затем выполнить
эквивалентную подпрограмму,
написанную для 680x0. Так как к тому же
у 680x0 нет в точности таких же
регистров, флагов и внутреннего
арифметико-логического устройства,
как в 80x86, он должен имитировать все
эти элементы с использованием
своих регистров или памяти. И он
должен тщательно воспроизводить
результаты каждой команды, что
требует специально написанных
подпрограмм для 680x0, гарантирующих,
что состояние эмулируемых
регистров и флагов после
выполнения каждой команды будет в
точности таким же, как и на реальном
80x86.
Это простая, но очень медленная
работа, так как микрокод внутри
процессора 80x86 исполняется на
значительно более
быстродействующем уровне, чем
эмулирующие его внешние команды
680x0. За время выполнения одной
команды 80x86 на 680x0, реальный 80x86
может выполнить десятки команд.
Следовательно, если процессор,
производящий эмуляцию, не
настолько быстр, чтобы
компенсировать все потери при
эмуляции, то программы,
исполняющиеся под эмуляцией, будут
очень медленными.
Выходом в таких случаях является
использование так называемых
прикладных сред. Учитывая, что
основную часть программы, как
правило, составляют вызовы
библиотечных функций, прикладная
среда имитирует библиотечные
функции целиком, используя заранее
написанную библиотеку функций
аналогичного назначения, а
остальные команды эмулирует каждую
по отдельности.
Соответствие стандартам POSIX также
является средством обеспечения
совместимости программных и
пользовательских интерфейсов. Во
второй половине 80-х
правительственные агентства США
начали разрабатывать POSIX как
стандарты на поставляемое
оборудование при заключении
правительственных контрактов в
компьютерной области. POSIX - это
"интерфейс переносимой ОС,
базирующейся на UNIX". POSIX -
собрание международных стандартов
интерфейсов ОС в стиле UNIX.
Использование стандарта POSIX (IEEE
стандарт 1003.1 - 1988) позволяет
создавать программы стиле UNIX,
которые могут легко переноситься
из одной системы в другую.
В дополнение к стандарту POSIX
правительство США также определило
требования компьютерной
безопасности для приложений,
используемых правительством.
Многие из этих требований являются
желаемыми свойствами для любой
многопользовательской системы.
Правила безопасности определяют
такие свойства, как защита ресурсов
одного пользователя от других и
установление квот по ресурсам для
предотвращения захвата одним
пользователем всех системных
ресурсов ( таких как память).
Обеспечение защиты информации от
несанкционированного доступа
является обязательной функцией
сетевых операционных систем. В
большинстве популярных систем
гарантируется степень
безопасности данных,
соответствующая уровню С2 в системе
стандартов США.
Основы стандартов в области
безопасности были заложены "Критериями
оценки надежных компьютерных
систем". Этот документ,
изданный в США в 1983 году
национальным центром компьютерной
безопасности (NCSC - National Computer Security
Center), часто называют Оранжевой
Книгой.
В соответствии с требованиями
Оранжевой книги безопасной
считается такая система, которая
"посредством специальных
механизмов защиты контролирует
доступ к информации таким образом,
что только имеющие соответствующие
полномочия лица или процессы,
выполняющиеся от их имени, могут
получить доступ на чтение, запись,
создание или удаление
информации".
Иерархия уровней безопасности,
приведенная в Оранжевой Книге,
помечает низший уровень
безопасности как D, а высший - как А.
- В класс D попадают системы,
оценка которых выявила их
несоответствие требованиям
всех других классов.
- Основными свойствами,
характерными для С-систем,
являются: наличие подсистемы
учета событий, связанных с
безопасностью, и избирательный
контроль доступа. Уровень С
делится на 2 подуровня: уровень
С1, обеспечивающий защиту
данных от ошибок
пользователей, но не от
действий злоумышленников, и
более строгий уровень С2. На
уровне С2 должны
присутствовать средства
секретного входа,
обеспечивающие идентификацию
пользователей путем ввода
уникального имени и пароля
перед тем, как им будет
разрешен доступ к системе. Избирательный
контроль доступа, требуемый
на этом уровне позволяет
владельцу ресурса определить,
кто имеет доступ к ресурсу и
что он может с ним делать.
Владелец делает это путем
предоставляемых прав доступа
пользователю или группе
пользователей. Средства
учета и наблюдения (auditing)
- обеспечивают возможность
обнаружить и зафиксировать
важные события, связанные с
безопасностью, или любые
попытки создать, получить
доступ или удалить системные
ресурсы. Защита памяти -
заключается в том, что память
инициализируется перед тем,
как повторно используется. На
этом уровне система не
защищена от ошибок
пользователя, но поведение его
может быть проконтролировано
по записям в журнале,
оставленным средствами
наблюдения и аудитинга.
- Системы уровня В основаны на
помеченных данных и
распределении пользователей
по категориям, то есть
реализуют мандатный контроль
доступа. Каждому
пользователю присваивается
рейтинг защиты, и он может
получать доступ к данным
только в соответствии с этим
рейтингом. Этот уровень в
отличие от уровня С защищает
систему от ошибочного
поведения пользователя.
- Уровень А является самым
высоким уровнем безопасности,
он требует в дополнение ко всем
требованиям уровня В
выполнения формального,
математически обоснованного
доказательства соответствия
системы требованиям
безопасности.
Различные коммерческие структуры
(например, банки) особо выделяют
необходимость учетной службы,
аналогичной той, что предлагают
государственные рекомендации С2.
Любая деятельность, связанная с
безопасностью, может быть
отслежена и тем самым учтена. Это
как раз то, что требует С2 и то, что
обычно нужно банкам. Однако,
коммерческие пользователи, как
правило, не хотят расплачиваться
производительностью за повышенный
уровень безопасности. А-уровень
безопасности занимает своими
управляющими механизмами до 90%
процессорного времени. Более
безопасные системы не только
снижают эффективность, но и
существенно ограничивают число
доступных прикладных пакетов,
которые соответствующим образом
могут выполняться в подобной
системе. Например для ОС Solaris
(версия UNIX) есть несколько тысяч
приложений, а для ее аналога
В-уровня - только сотня.
Предыдущая
глава || Оглавление
|| Следующая глава
|