Многослойная структура ОС

Вычислительная система, работающая под управлением ОС на основе ядра, может быть изображена в виде трех иерархически расположенных слоев: нижний слой - аппаратура, промежуточный — ядро, а верхний - утилиты, обрабатывающие программы и приложения. Структуру вычислительной системы принято изображать в виде системы концентрических окружностей, иллюстрируя тот факт, что каждый слой может взаимодействовать только со смежными слоями. Действительно, при такой организации ОС приложения не могут непосредственно взаимодействовать с аппаратурой, а только через слой ядра. Каждый слой обслуживает вышележащий слой, выполняя для него некоторый набор функций, которые образуют межслойный интерфейс. На основе функций нижележащего слоя следующий (вверх по иерархии) слой строит свои функции — более сложные и более мощные. Строгие правила касаются только взаимодействия между слоями системы, а между модулями внутри слоя связи могут быть произвольными. Отдельный модуль может выполнить свою работу либо самостоятельно, либо обратиться к другому модулю своего слоя, либо обратиться за помощью к нижележащему слою через межслойный интерфейс.

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

Ядро операционной системы в классическом варианте может состоять из следующих слоев:

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

Практически все современные аппаратные платформы имеют следующий набор средств аппаратной поддержки ОС:

- средства поддержки привилегированного режима;

- средства трансляции адресов;

- системы переключения процессов;

- система прерываний;

- системный таймер;

- средства защиты областей памяти.

Средства поддержки привилегированного режима обычно основаны на системном регистре процессора, часто называемом «словом состояния» машины. Этот регистр содержит некоторые признаки, определяющие режимы работы процессора, в том числе и признак текущего режима привилегий. Смена режима привилегий выполняется за счет изменения слова состояния машины в результате прерывания или выполнения привилегированной команды. Количество уровней привилегированности может быть разным у разных типов процессоров, наиболее часто используются два уровня (ядро-пользователь) или четыре (например, ядро – супервизор – выполнение – пользователь) у платформы VAX или М-2-3, у процессоров Intel x86/Pentium. Средства поддержки привилегированного режима выполняют проверку допустимости выполнения активной программой инструкций процессора при текущем уровне привилегированности.

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

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

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

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

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

Машинно-зависимые компоненты ОС. В модулях ядра ОС естественным образом отражаются особенности используемой аппаратной платформы, такие как количество типов прерываний, формат таблицы ссылок на процедуры обработки прерываний, состав регистров общего назначения и системных регистров, особенности подключения внешних устройств и многие другие. Однако ядро ОС проектируется таким образом, чтобы только часть ее модулей была машинно-зависимыми, а остальные не зависили от особенностей аппаратной реализации компьютера. Объем машинно-зависимых компонентов ОС зависит от того, насколько велики отличия в аппаратных платформах, для которых разрабатывается ОС. Например, ОС, построенная на 32-битовых адресах, для переноса на машину с 16-битовыми адресами должна быть практически переписана заново. Одно из наиболее показательных отличий — несовпадение системы команд процессоров — преодолевается достаточно просто - операционная система программируется на языке высокого уровня, а затем соответствующим компилятором вырабатывается код для конкретного типа процессора. Однако во многих случаях различия в организации аппаратуры компьютера лежат гораздо глубже и преодолеть их таким образом не удается.

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

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

Для компьютеров на основе процессоров Intel x86/Pentium разработка машинно-зависимого слоя ОС упрощается за счет встроенной в постоянную память компьютера базовой системы ввода-вывода — BIOS. BIOS содержит драйверы для всех устройств, входящих в базовую конфигурацию компьютера. Эти драйверы выполняют примитивные операции с управляемыми устройствами, например чтение группы секторов данных с определенной дорожки диска, но за счет этих операций экранируются различия аппаратных платформ персональных компьютеров и серверов на процессорах Intel разных производителей. Разработчики операционной системы могут пользоваться слоем драйверов BIOS как частью машинно-зависимого слоя ОС, а могут и заменить все или часть драйверов BIOS компонентами ОС.

Базовые механизмы ядра. Этот слой выполняет наиболее примитивные операции ядра, такие как программное переключение контекстов процессов, диспетчеризацию прерываний, перемещение страниц из памяти на диск и обратно и т. п. Модули данного слоя отрабатывают команды управляющих модулей, из–за чего их называют исполнительными механизмами для модулей верхних слоев.

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

Интерфейс системных вызовов. Этот слой является самым верхним слоем ядра и взаимодействует непосредственно с приложениями и системными утилитами, образуя прикладной программный интерфейс операционной системы. Функции API, обслуживающие системные вызовы, предоставляют доступ к ресурсам системы в удобной и компактной форме, без указания деталей их физического расположения.

Приведенное разбиение ядра ОС на слои является условным. В реальной ОС количество слоев и распределение функций между ними может быть другим.

Если код операционной системы может быть легко перенесен с одной аппаратной платформы на другую, то такую ОС называют переносимой (portable) или мобильной. Для достижения мобильности необходимо, чтобы ОС соответствовала некоторым требованиям. Так, большая часть кода, на котором написана система, должна быть создана с помощью языков высокого уровня (трансляторы таких языков имеются на всех машинах). Объем машинно-зависимых компонентов ОС должен быть по возможности минимизирован. Аппаратно-зависимый код должен быть максимально изолированным и представлен в виде компактных модулей, которые при необходимости можно было легко заменить.