ЗАНЯТИЕ 7. «Виды ядер ОС»

Как основной элемент ОС, ядро представляет собой наибо¬лее низкий уровень абстракции для доступа приложений к ресурсам системы, необходимым для их работы. Как правило, ядро предо¬ставляет такой доступ исполняемым процессам соответствующих приложений за счёт использования механизмов межпроцессного взаимодействия и обращения приложений к системным вызовам ОС. Описанная задача может различаться в зависимости от типа архитектуры ядра и способа её реализации.
Отличительной особенностью большинства операционных систем на сегодняшний день является большое монолитное ядро. Ядро операционной системы обеспечивает большинство ее воз¬можностей, включая планирование, работу с файловой системой, сетевые функции, работу драйверов различных устройств, управле¬ние памятью и многие другие. Обычно монолитное ядро реализу¬ется как единый процесс, все элементы которого используют одно и то же адресное пространство. Все части монолитного ядра рабо¬тают в одном адресном пространстве. Это такая схема операцион¬ной системы, при которой все компоненты её ядра являются со¬ставными частями одной программы, используют общие структуры данных и взаимодействуют друг с другом путём непосредственного вызова процедур. Монолитное ядро — старейший способ организа¬ции операционных систем. Примером систем с монолитным ядром является большинство UNIX-систем. Достоинства: скорость ра¬боты, упрощённая разработка модулей. Недостатки: поскольку всё ядро работает в одном адресном пространстве, сбой в одном из компонентов может нарушить работоспособность всей системы. Примеры: традиционные ядра UNIX (такие как BSD), Linux; ядро MS-DOS, ядро KolibriOS. Некоторые старые монолитные ядра, в особенности систем класса UNIX/Linux, требовали перекомпиля¬ции при любом изменении состава оборудования. Большинство со¬временных ядер позволяют во время работы подгружать модули, выполняющие часть функций ядра. В этом случае компоненты опе¬рационной системы являются не самостоятельными модулями, а составными частями одной большой программы, называемой моно¬литным ядром (monolithickernel), которое представляет собой набор процедур, каждая из которых может вызвать каждую. Все проце¬дуры работают в привилегированном режиме.
В архитектуре микроядра ядру отводится лишь несколько самых важных функций, в число которых входят работа с адрес¬ными пространствами, обеспечение взаимодействия между процес¬сами (interprocesscommunication) и основное планирование. Работу других сервисов операционной системы обеспечивают процессы, которые иногда называют серверами. Эти процессы запускаются в пользовательском режиме и микроядро работает с ними так же, как с другими приложениями. Такой подход позволяет разделить за¬дачу разработки операционной системы, на разработку ядра и раз¬работку сервера. Серверы можно настраивать для требований кон¬кретных приложений или среды. Выделение в структуре системы микроядра упрощает реализацию системы, обеспечивает ее гиб¬кость, а также хорошо вписывается в распределенную среду. Фак¬тически микроядро взаимодействует с локальным и удаленным сервером по одной той же схеме, что упрощает построение распре¬деленных систем. Достоинства: устойчивость к сбоям оборудова¬ния, ошибкам в компонентах системы. Основное достоинство мик¬роядерной архитектуры — высокая степень модульности ядра опе-рационной системы. Это существенно упрощает добавление в него новых компонентов. В микроядерной операционной системе можно, не прерывая её работы, загружать и выгружать новые драй¬веры, файловые системы и т. д. Существенно упрощается процесс отладки компонентов ядра, так как новая версия драйвера может загружаться без перезапуска всей операционной системы. Компо¬ненты ядра операционной системы ничем принципиально не отли¬чаются от пользовательских программ, поэтому для их отладки можно применять обычные средства. Микроядерная архитектура повышает надежность системы, поскольку ошибка на уровне не¬привилегированной программы менее опасна, чем отказ на уровне режима ядра. Недостатки: передача данных между процессами тре¬бует накладных расходов. Примеры: Symbian OS; Windows CE; OpenVMS; Mach, используемый в GNU/Hurd и Mac OS X; QNX; AIX; Minix; ChorusOS; AmigaOS; MorphOS.
Модульное ядро — современная, усовершенствованная мо¬дификация архитектуры монолитных ядер операционных систем компьютеров. В отличие от «классических» монолитных ядер, счи¬тающихся ныне устаревшими, модульные ядра, как правило, не требуют полной перекомпиляции ядра при изменении состава ап¬паратного обеспечения компьютера. Вместо этого модульные ядра предоставляют тот или иной механизм подгрузки модулей ядра, поддерживающих то или иное аппаратное обеспечение (например, драйверов). При этом подгрузка модулей может быть как динами¬ческой (выполняемой «на лету», без перезагрузки ОС, в работаю¬щей системе), так и статической (выполняемой при перезагрузке ОС после переконфигурирования системы на загрузку тех или иных модулей).Все модули ядра работают в адресном пространстве ядра и могут пользоваться всеми функциями, предоставляемыми ядром. Поэтому модульные ядра продолжают оставаться монолитными. Модульные ядра удобнее для разработки, чем традиционные моно¬литные ядра, не поддерживающие динамическую загрузку модулей, так как от разработчика не требуется многократная полная пере¬компиляция ядра при работе над какой-либо его подсистемой или драйвером. Выявление, локализация, отладка и устранение ошибок при тестировании также облегчаются. Модульные ядра предостав¬ляют особый программный интерфейс (API) для связывания моду¬лей с ядром, для обеспечения динамической подгрузки и выгрузки модулей. В свою очередь, не любая программа может быть сделана модулем ядра: на модули ядра накладываются определённые огра¬ничения в части используемых функций (например, они не могут пользоваться функциями стандартной библиотеки С/С++ и должны использовать специальные аналоги, являющиеся функциями API ядра). Кроме того, модули ядра обязаны экспортировать опреде¬лённые функции, нужные ядру для правильного подключения и распознавания модуля, для его корректной инициализации при за¬грузке и корректного завершения при выгрузке, для регистрации модуля в таблице модулей ядра и для обращения из ядра к серви¬сам, предоставляемым модулем. Не все части ядра могут быть сде-ланы модулями. Некоторые части ядра всегда обязаны присутство¬вать в оперативной памяти и должны быть жёстко «вшиты» в ядро. Также не все модули допускают динамическую подгрузку (без пе¬резагрузки ОС). Степень модульности ядер (количество и разнооб¬разие кода, которое может быть вынесено в отдельные модули ядра и допускает динамическую подгрузку) различна в различных архи¬тектурах модульных ядер. Ядро «Linux» в настоящее время имеет более модульную архитектуру, чем ядра *BSD (FreeBSD, NetBSD, OpenBSD).Общей тенденцией развития современных модульных архитектур является всё большая модуларизация кода (повышение степени модульности ядер), улучшение механизмов динамической подгрузки и выгрузки, уменьшение или устранение необходимости в ручной подгрузке модулей или в переконфигурации ядра при из¬менениях аппаратуры путём введения тех или иных механизмов автоматического определения оборудования и автоматической под¬грузки нужных модулей, универсализация кода ядра и введение в ядро абстрактных механизмов, предназначенных для совместного использования многими модулями (примером может служить VFS — «виртуальная файловая система», совместно используемая мно¬гими модулями файловых систем в ядре Linux).
Экзоядро — ядро операционной системы компьютеров, предоставляющее лишь функции для взаимодействия между про¬цессами и безопасного выделения и освобождения ресурсов. В тра¬диционных операционных системах ядро предоставляет не только минимальный набор сервисов, обеспечивающих выполнение про¬грамм, но и большое количество высокоуровневых абстракций для использования разнородных ресурсов компьютера: оперативной памяти, жестких дисков, сетевых подключений. В отличие от них, ОС на основе экзоядра предоставляет лишь набор сервисов для вза¬имодействия между приложениями, а также необходимый мини¬мум функций, связанных с защитой: выделение и высвобождение ресурсов, контроль прав доступа, и т. д. Экзоядро не занимается предоставлением абстракций для физических ресурсов — эти функ¬ции выносятся в библиотеку пользовательского уровня (так назы-ваемую libOS).Основная идея операционной системы на основе эк¬зоядра состоит в том, что ядро должно выполнять лишь функции координатора для небольших процессов, связанных только одним ограничением — экзоядро должно иметь возможность гарантировать безопасное выделение и освобождение ресурсов оборудования. В отличие от ОС на основе микроядра, ОС, базирующиеся на экзо¬ядре, обеспечивают большую эффективность за счет отсутствия необходимости в переключении между процессами при каждом обращении к оборудованию. Архитектуры на основе экзоядер яв¬ляются дальнейшим развитием и усовершенствованием микроядер¬ных архитектур и одновременно ужесточают требования к минима¬листичности и простоте кода ядра.«LibOS» может обеспечивать произвольный набор абстракций, совместимый с той или иной уже существующей операционной системой, например, Linux или Windows.
Наноядро — архитектура ядра операционной системы ком¬пьютеров, в рамках которой крайне упрощённое и минималистич¬ное ядро выполняет лишь одну задачу — обработку аппаратных пре¬рываний, генерируемых устройствами компьютера. После обра¬ботки прерываний от аппаратуры наноядро, в свою очередь, посы¬лает информацию о результатах обработки (например, полученные с клавиатуры символы) вышележащему программному обеспече¬нию при помощи того же механизма прерываний. Также часто реа¬лизуют минимальную поддержку потоков: создание и переключе¬ние. В некотором смысле концепция наноядра близка к концепции HAL – Hardware AbstractionLayer, предоставляя вышележащему ПО удобные механизмы абстракции от конкретных устройств и спосо¬бов обработки их прерываний. Наиболее часто в современных ком¬пьютерах наноядра используются для виртуализации аппаратного обеспечения реальных компьютеров или для реализации механизма гипервизора, с целью позволить нескольким или многим различ¬ным операционным системам работать одновременно и парал¬лельно на одном и том же компьютере. Например, VMware ESX Server реализует собственное наноядро, не зависимое от ОС и уста¬навливаемое на «голое железо». Поверх этого наноядра работают пользовательские и административные утилиты VMware и сами операционные системы, виртуализируемые в ESX Server. Наноядра также могут использоваться для обеспечения переносимости (пор¬табельности) операционных систем на разное аппаратное обеспече¬ние или для обеспечения возможности запуска «старой» операци¬онной системы на новом, несовместимом аппаратном обеспечении без её полного переписывания и портирования. Например, фирма Apple Computer использовала наноядро в версии Mac OS Classic для PowerPC для того, чтобы транслировать аппаратные прерывания, генерировавшиеся их компьютерами на базе процессоров Power PC в форму, которая могла «пониматься» и распознаваться Mac OS для процессоров Motorola 680×0. Таким образом, наноядро эмулиро¬вало для Mac OS «старое» 680×0 железо. Альтернативой было бы полное переписывание и портирование кода Mac OS на Power PC при переходе с 680×0 на них. Позднее, в эпоху Mac OS 8.6, нано¬ядро виртуализировало предоставляемые PowerPC мультипроцес¬сорные возможности и обеспечивало поддержку SMP в Mac OS. Другие удачные примеры использования наноядерных архитектур включают наноядро Adeos, работающее как модуль ядра для Linux и позволяющее выполнять одновременно с Linux какую-либо опе¬рационную систему реального времени. Наноядро может быть настолько маленьким и примитивным, что даже важнейшие устройства, находящиеся непосредственно на материнской плате или на плате контроллера встраиваемого устройства, такие, как таймер или программируемый контроллер прерываний, обслужи¬ваются специальными драйверами устройств, а не непосредственно ядром. Такого рода сверхминималистичные наноядра называют иногда пикоядрами. Термин «наноядро» иногда неформально ис¬пользуется для описания очень маленьких, упрощённых и лёгких микроядер, таких, как L4.
Гибридное ядро (англ. Hybridkernel) — модифицированные микроядра, позволяющие для ускорения работы запускать «несу-щественные» части в пространстве ядра. Пример: ядра ОС Windows семейства NT.
Все рассмотренные подходы к построению операционных систем имеют свои достоинства и недостатки. В большинстве слу¬чаев современные операционные системы используют различные комбинации этих подходов. Так, например сейчас, ядро «Linux» представляет собой монолитную систему с отдельными элементами модульного ядра. При компиляции ядра можно разрешить динами¬ческую загрузку и выгрузку очень многих компонентов ядра — так называемых модулей. В момент загрузки модуля его код загружа¬ется на уровне системы и связывается с остальной частью ядра. Внутри модуля могут использоваться любые экспортируемые яд¬ром функции. Существуют варианты ОС GNU (Debian GNU/Hurd), в которых вместо монолитного ядра применяется ядро Mach (такое же, как в Hurd), а поверх него в пользовательском пространстве ра-ботают те же самые процессы, которые при использовании Linux были бы частью ядра. Другим примером смешанного подхода мо¬жет служить возможность запуска операционной системы с моно¬литным ядром под управлением микроядра. Так устроены 4.4 BSD и MkLinux, основанные на микроядре Mach. Микроядро обеспечи¬вает управление виртуальной памятью и работу низкоуровневых драйверов. Все остальные функции, в том числе взаимодействие с прикладными программами, осуществляется монолитным ядром. Данный подход сформировался в результате попыток использовать преимущества микроядерной архитектуры, сохраняя по возможно¬сти хорошо отлаженный код монолитного ядра. Наиболее тесно элементы микроядерной архитектуры и элементы монолитного ядра переплетены в ядре Windows NT. Хотя Windows NT часто называют микроядерной операционной системой, это не совсем так. Микроядро NT слишком велико (более 1 Мбайт, кроме того, в ядре системы находится, например, ещё и модуль графического интерфейса), чтобы носить приставку «микро». Компоненты ядра Windows NT располагаются в вытесняемой памяти и взаимодей¬ствуют друг с другом путем передачи сообщений, как и положено в микроядерных операционных системах. В то же время все компо¬ненты ядра работают в одном адресном пространстве и активно используют общие структуры данных, что свойственно операцион¬ным системам с монолитным ядром. Причина проста: чисто микро¬ядерный дизайн коммерчески менее выгоден, поскольку менее эф-фективен (за счет накладных расходов на передачу сообщений там, где можно было обойтись вызовами функций). Таким образом, Windows NT можно с полным правом назвать гибридной операци¬онной системой. Смешанное ядро, в принципе, должно объединять преимущества монолитного ядра и микроядра: казалось бы, микро¬ядро и монолитное ядро — крайности, а смешанное — золотая сере¬дина. В них возможно добавлять драйвера устройств двумя спосо¬бами: и внутрь ядра, и в пользовательское пространство. Но на практике концепция смешанного ядра часто подчёркивает не только достоинства, но и недостатки обоих типов ядер. Примеры: Windows NT, DragonFly BSD

Оставить комментарий

avatar
  Подписаться  
Уведомление о