Ядро операционной системы

advertisement
Уровни рассмотрения ОС:
 Пользователь – пользуется интерфейсом готовых программ и операционной системы
 Администратор – устанавливает / настраивает программы и операционную систему
 Прикладной программист
 Системный программист
ОС – Лекция 1
1
Операцио́нная систе́ма, ОС (англ. operating system) — базовый комплекс компьютерных программ,
обеспечивающий управление аппаратными средствами компьютера, работу с файлами, ввод и вывод
данных, а также выполнение прикладных программ и утилит.
При включении компьютера операционная система загружается в память раньше остальных
программ и затем служит платформой и средой для их работы. Помимо вышеуказанных функций ОС
может осуществлять и другие, например, предоставление пользовательского интерфейса, сетевое
взаимодействие и т. п.
С 1990-х наиболее распространёнными операционными системами для персональных компьютеров
и серверов являются ОС семейства Microsoft Windows и Windows NT, Mac OS и Mac OS X, системы
класса UNIX, и Unix подобные (особенно GNU/Linux).
Основные функции (простейшие ОС):
 Загрузка приложений в оперативную память и их выполнение;
 Стандартизованный доступ к периферийным устройствам (устройства ввода-вывода);
 Управление оперативной памятью (распределение между процессами, виртуальная
память);
 Управление доступом к данным на энергонезависимых носителях (таких как Жёсткий
диск, Компакт-диск и т. д.), как правило, с помощью файловой системы;
 Пользовательский интерфейс;
 Сетевые операции, поддержка стека протоколов
Дополнительные функции:
 Параллельное или псевдопараллельное выполнение задач (многозадачность);
 Взаимодействие между процессами;
 Защита самой системы, а также пользовательских данных и программ от злонамеренных
действий пользователей или приложений;
 Разграничение прав доступа и многопользовательский режим работы (аутентификация,
авторизация).
Объекты ядра ОС








Процессы
Файлы
События
Потоки
Семафоры
Мюьтексы
Каналы
Файлы, проецируемые в память (для платформы Win32).
Понятие операционной системы
Существуют две группы определений ОС: «совокупность программ, управляющих
оборудованием» и «совокупность программ, управляющих другими программами». Обе они имеют
свой точный технический смысл, который, однако, становится ясен только при более детальном
рассмотрении вопроса о том, зачем вообще нужны операционные системы.
Есть приложения вычислительной техники, для которых ОС излишни. Напр., встроенные
микрокомпьютеры содержатся сегодня во многих бытовых приборах, автомобилях (иногда по десятку в
каждом), сотовых телефонах и т. п. Зачастую такой компьютер постоянно исполняет лишь одну
программу, запускающуюся по включении. И простые игровые приставки — также представляющие
собой специализированные микрокомпьютеры — могут обходиться без ОС, запуская при включении
программу, записанную на вставленном в устройство «картридже» или компакт-диске. (Многие
встроенные компьютеры и даже некоторые игровые приставки на самом деле работают под
управлением своих ОС).
Операционные системы, в свою очередь, нужны, если:
 вычислительная система используется для различных задач, причём программы,
исполняющие эти задачи, нуждаются в сохранении данных и обмене ими. Из этого следует
необходимость универсального механизма сохранения данных; в подавляющем большинстве
случаев ОС отвечает на неё реализацией файловой системы. Современные ОС, кроме того,
ОС – Лекция 1
2
предоставляют возможность непосредственно «связать» вывод одной программы с вводом
другой, минуя относительно медленные дисковые операции;
 различные программы нуждаются в выполнении одних и тех же рутинных действий.
Напр., простой ввод символа с клавиатуры и отображение его на экране может потребовать
исполнения сотен машинных команд, а дисковая операция — тысяч. Чтобы не программировать
их каждый раз заново, ОС предоставляют системные библиотеки часто используемых
подпрограмм (функций);
 между программами и пользователями системы необходимо распределять полномочия,
чтобы пользователи могли защищать свои данные от чужого взора, а возможная ошибка в
программе не вызывала тотальных неприятностей;
 необходима возможность имитации «одновременного» исполнения нескольких программ
на одном компьютере (даже содержащем лишь один процессор), осуществляемой с помощью
приёма, известного как «разделение времени». При этом специальный компонент, называемый
планировщиком, «нарезает» процессорное время на короткие отрезки и предоставляет их
поочередно различным исполняющимся программам (процессам);
 наконец, оператор должен иметь возможность, так или иначе, управлять процессами
выполнения отдельных программ. Для этого служат операционные среды, одна из которых —
оболочка и набор стандартных утилит — является частью ОС (прочие, такие, как графическая
операционная среда, образуют независимые от ОС прикладные платформы). Таким образом,
современные универсальные ОС можно охарактеризовать прежде всего как
1.
использующие файловые системы (с универсальным механизмом доступа к
данным),
2.
многопользовательские (с разделением полномочий),
3.
многозадачные (с разделением времени).
Многозадачность и распределение полномочий требуют определённой иерархии привилегий
компонентов самой ОС. В составе ОС различают три группы компонентов:
 ядро, содержащее планировщик; драйверы устройств, непосредственно управляющие
оборудованием; сетевую подсистему, файловую систему;
 системные библиотеки и
 оболочку с утилитами.
Большинство программ, как системных (входящих в ОС), так и прикладных, исполняются в
непривилегированном («пользовательском») режиме работы процессора и получают доступ к
оборудованию (и, при необходимости, к другим ядерным ресурсам, а также ресурсам иных программ)
только посредством системных вызовов. Ядро исполняется в привилегированном режиме: именно в
этом смысле говорят, что ОС (точнее, её ядро) управляет оборудованием.
Текущая редакция стандарта на ОС содержит определения около тысячи системных вызовов и
других библиотечных подпрограмм (часть из которых должна реализоваться только в определённых
классах систем; напр., в системах «реального времени») и около 200 команд оболочки и утилит ОС.
Стандарт определяет лишь функции вызовов и команд, и не содержит указаний относительно способов
их реализации.
Стандарт, кроме этого, определяет способ адресации файлов в системе, локализацию (установки,
касающиеся национально-специфических моментов, таких, как язык сообщений или формат даты и
времени), совместимый набор символов, синтаксис регулярных выражений, структуру каталогов в
файловой системе, формат командной строки и некоторые другие аспекты поведения ОС.
В определении состава ОС значение имеет критерий операциональной целостности (замкнутости):
система должна позволять полноценно использовать (включая модификацию) свои компоненты.
Поэтому в полный состав ОС включается и набор инструментальных средств (от текстовых редакторов
до компиляторов, отладчиков и компоновщиков). Операциональной замкнутостью обладают системы,
удовлетворяющие «разработческому» профилю в терминах стандарта.
Эволюция операционных систем и основные идеи
Предшественником ОС следует считать служебные программы (загрузчики и мониторы), а также
библиотеки часто используемых подпрограмм, начавшие разрабатываться с появлением универсальных
компьютеров 1-го поколения (конец 1940-х годов). Служебные программы минимизировали физические
манипуляции оператора с оборудованием, а библиотеки позволяли избежать многократного
ОС – Лекция 1
3
программирования одних и тех же действий (осуществления операций ввода-вывода, вычисления
математических функций и т. п.).
В 1950-60-х годах сформировались и были реализованы основные идеи, определяющие
функциональность ОС: пакетный режим, разделение времени и многозадачность, разделение
полномочий, реальный масштаб времени, файловые структуры и файловые системы.
Пакетный режим
Необходимость оптимального использования дорогостоящих вычислительных ресурсов привела к
появлению концепции «пакетного режима» исполнения программ. Пакетный режим предполагает
наличие очереди программ на исполнение, причём ОС может обеспечивать загрузку программы с
внешних носителей данных в оперативную память, не дожидаясь завершения исполнения предыдущей
программы, что позволяет избежать простоя процессора.
Разделение времени и многозадачность
Уже пакетный режим в своём развитом варианте требует разделения процессорного времени
между выполнением нескольких программ.
Необходимость в разделении времени (многозадачности, мультипрограммировании) проявилась
ещё сильнее при распространении в качестве устройств ввода-вывода телетайпов (а позднее,
терминалов с электронно-лучевыми дисплеями) (1960-е годы). Поскольку скорость клавиатурного ввода
(и даже чтения с экрана) данных оператором много ниже, чем скорость обработки этих данных
компьютером, использование компьютера в «монопольном» режиме (с одним оператором) могло
привести к простою дорогостоящих вычислительных ресурсов.
Разделение времени позволило создать «многопользовательские» системы, в которых один (как
правило) центральный процессор и блок оперативной памяти соединялся с многочисленными
терминалами. При этом часть задач (таких, как ввод или редактирование данных оператором) могла
исполняться в режиме диалога, а другие задачи (такие, как массивные вычисления) — в пакетном
режиме.
Разделение полномочий
Распространение многопользовательских систем потребовало решения задачи разделения
полномочий, позволяющей избежать возможности модификации исполняемой программы или данных
одной программы в памяти компьютера другой (содержащей ошибку или злонамеренно
подготовленной) программы, а также модификации самой ОС прикладной программой.
Реализация разделения полномочий в ОС была поддержана разработчиками процессоров,
предложивших архитектуры с двумя режимами работы процессора — «реальным» (в котором
исполняемой программе доступно всё адресное пространство компьютера) и «защищённым» (в котором
доступность адресного пространства ограничена диапазоном, выделенном при запуске программы на
исполнение).
Реальный масштаб времени
Применение универсальных компьютеров для управления производственными процессами
потребовало реализации «реального масштаба времени» («реального времени») — синхронизации
исполнения программ с внешними физическими процессами.
Включение функции реального масштаба времени в ОС позволило создавать системы,
одновременно обслуживающие производственные процессы и решающие другие задачи (в пакетном
режиме и (или) в режиме разделения времени).
Файловые системы и структуры
Постепенная замена носителей с последовательным доступом (перфолент, перфокарт и магнитных
лент) накопителями произвольного доступа (на магнитных диск)
«Unix», стандартизация ОС и POSIX
К концу 1960-х гг. отраслью и научно-образовательным сообществом был создан целый ряд ОС,
реализующих все или часть очерченных выше функций. К ним относятся «Atlas» (Манчестерский
университет), «CTTS» и «ITSS» (Массачусетский технологический институт (МТИ)), «THE»
(Эйндховенский технологический университет), «RS4000» (Университет Орхуса) и др. (всего
эксплуатировалось более сотни различных ОС).
Наиболее развитые ОС, такие как «OS/360» (компания «IBM»), «SCOPE» (компания «CDC») и
завершённый уже в 1970-х годах «MULTICS» (МТИ и компания «Bell Labs»), предусматривали
возможность исполнения на многопроцессорных компьютерах.
ОС – Лекция 1
4
Эклектичный характер разработки ОС привёл к нарастанию кризисных явлений, прежде всего,
связанных с чрезмерными сложностью и размерами создаваемых систем. ОС были плохо
масштабируемыми (более простые не могли использовать все возможности крупных вычислительных
систем; более развитые неоптимально исполнялись на малых или не могли исполняться на них вовсе) и
тотально несовместимыми между собой, их разработка и совершенствование затягивалась.
Задуманная и реализованная в 1969 году Кеном Томпсоном при участии нескольких коллег
(включая Денниса Ричи и Брайана Кернигана), ОС «Unix» («Unix»; первоначально «UNICS», что
обыгрывало название «MULTICS») вобрала в себя многие черты более ранних ОС, но обладала целым
рядом свойств, отличающих её от большинства предшественниц:
 простая метафорика (два ключевых понятия: вычислительный процесс и файл);
 компонентная архитектура: принцип «одна программа — одна функция» плюс мощные
средства связывания различных программ для решения возникающих задач («оболочка»);
 минимизация ядра (кода, выполняющегося в «реальном» («привилегированном») режиме
процессора) и количества системных вызовов;
 независимость от аппаратной архитектуры и реализация на машиннонезависимом языке
программирования (язык программирования «Си» стал «побочным продуктом» разработки
«Unix»);
 унификация файлов.
«Unix», благодаря своему удобству прежде всего в качестве инструментальной среды (среды
разработки), была тепло принята сначала в университетах, а затем и в отрасли, получившей прототип
единой ОС, которая могла использоваться на самых разных вычислительных системах и, более того,
могла быть быстро и с минимальными усилиями перенесена на любую вновь разработанную
аппаратную архитектуру.
В конце 70-х годов XX века сотрудники Калифорнийского университета в Беркли внесли ряд
усовершенствований в исходные коды UNIX, включая работу с протоколами TCP/IP. Их разработка
стала известна под именем BSD — «Berkeley Software Distribution».
Задачу разработать независимую (от авторских прав «Bell Labs») реализацию той же архитектуры
поставил и Ричард Столлмен, основатель проекта «GNU».
Благодаря конкурентности реализаций архитектура ОС «Unix» стала вначале фактическим
отраслевым стандартом, а затем обрела статус и стандарта юридического — ISO/IEC 9945[1].
ОС, следующие стандарту или опирающиеся на него, называют «POSIX-совместимыми» (чаще
встречается словоупотребление «Unix подобные» или «семейство Unix», но оно противоречит статусу
торгового знака «Unix», принадлежащего консорциуму «The Open Group» и зарезервированному для
обозначения ОС, строго следующих стандарту) благодаря названию стандарта — POSIX. Сертификация
на совместимость со стандартом стоит некоторых денег, из-за чего некотрые системы не проходили
этот процесс, однако считаются POSIX-совместимыми, просто потому что это так.
К Unix-подобным ОС относятся системы, базирующиеся на последней версии «Unix», выпущенной
«Bell Labs» («System V»), на разработках Университета Беркли («FreeBSD», «OpenBSD», «NetBSD»), а
также ОС «GNU/Linux», разработанная в части утилит и библиотек проектом «GNU» и в части ядра —
сообществом, возглавляемым Линусом Торвальдсом.
Стандартизация ОС гарантирует возможность безболезненной замены самой ОС и/или
оборудования при развитии вычислительной системы или сети и дешёвого переноса прикладного
программного обеспечения (строгое следование стандарту предполагает полную совместимость
программ на уровне исходного текста; из-за профилирования стандарта и его развития некоторые
изменения бывают всё же необходимы, но перенос программы между POSIX-совместимыми системами
обходится на порядки дешевле, чем между альтернативными), а также преемственность опыта
пользователей.
Самым заметным эффектом существования этого стандарта стало эффективное разворачивание
Интернета в 90-х годах.
«Post Unix» архитектуры ОС
Коллектив, создавший ОС «Юникс», попытался позднее повторить свой успех, обобщив и
дополнив исходную концепцию. Таким образом появились ОС «Plan9» и «Inferno», не получившие,
впрочем, широкого распространения..
Позднее на основе «Plan9» в Испании были разработаны ОС «Off++» и «Plan B», носящие
экспериментальный характер.
ОС – Лекция 1
5
К попыткам создать постюниксовскую архитектуру можно также отнести разработку системы
программирования и операционной среды «Оберон» в Швейцарском федеральном технологическом
институте (ETH Zurich) под руководством проф. Никлауса Вирта.
Примечания
1.↑ Свежая версия ISO/IEC 9945 принята Международной организацией стандартизации
(ИСО) в 2003 г.
См. также






Список операционных систем
Многозадачность
Хронология операционных систем
Операционное окружение
WebOS
Аппаратная платформа компьютера
Литература
 Вильям Столлингс «Операционные системы» = Operating Systems: Internals and Design
Principles. — М.: «Вильямс», 2004. — С. 848. — ISBN 0-13-031999-6
 Деннинг П.Дж., Браун Р. Л. «Операционные системы.» В сб.: «Современный компьютер».
— М.: 1986.
 Керниган Брайан и Пайк Роб. «UNIX — универсальная среда программирования». — М.,
1992 (классическое введение в открытые ОС, по большей части сохранившее актуальность).
 Отставнов Максим. «Свободные программы и системы в школе». — М., 2003.
 Э. Таненбаум, А. Вудхалл. «Операционные системы: Разработка и реализация.» — СПб.:
2006. — ISBN 5-469-00148-2
 Э. Таненбаум. «Современные операционные системы. 2-е изд.» — СПб.: Питер, 2005. —
1038 с.: ил. ISBN 5-318-00299-4
 Дмитрий Иртегов. «Введение в операционные системы 2-е. изд.» — BHV-СПб, 2007.
ISBN 978-5-94157-695-1
 А. Гордеев. «Операционные системы» — СПб.: Питер, 2007. ISBN 978-5-94723-632-3
(учебник для ВУЗов)
 Raymond Eric S. The Art of Unix Programming. — 2003.
 Sobell Mark G. Unix System V. A Practical Guide. 3rd ed. — 1995.
Ссылки
 Операционная система в DMOZ
Критическая секция (англ. critical section) — объект синхронизации потоков позволяющий
предотвратить одновременное выполнение некоторого набора операций (обычно связанных с доступом
к данным) несколькими потоками. Критическая секция выполняет те же задачи, что и мьютекс.
Между мьютексом и критической секцией есть терминологические различия, так процедура
аналогичная захвату мьютекса называется входом в критическую секцию (enter), снятия блокировки
мьютекса -выходом из критической секции (leave).
Процедура входа и выхода критических секций обычно занимает меньшее время, нежели
аналогичные операции мьютекса.
В операционных системах класса Microsoft Windows разница между мьютексом и критической
секцией в том, что мьютекс является объектом ядра и может быть использован несколькими процессами
одновременно, критическая секция же принадлежит процессу и служит для синхронизации только его
потоков.
Мью́текс (англ. mutex, от mutual exclusion — взаимное исключение) — одноместный семафор,
служащий в программировании для синхронизации одновременно выполняющихся потоков.
Мьютексы (mutex)это один из вариантов семафорных механизмов для организации взаимного
исключения. Они реализованы во многих ОС, их основное назначение – организация взаимного
исключения для потоков из одного и того же или из разных процессов.
Мьютексы – это простейшие двоичные семафоры, которые могут находиться в одном из двух
состояний – отмеченном или неотмеченном (открыт и закрыт соответственно). Когда какой-либо поток,
ОС – Лекция 1
6
принадлежащий любому процессу, становится владельцем объекта mutex, последний переводится в
неотмеченное состояние. Если задача освобождает мьютекс, его состояние становится отмеченным.
Организация последовательного доступа к ресурсам с использованием мьютексов становится
несложной, поскольку в каждый конкретный момент только один поток может владеть этим объектом.
Для того, чтобы объект mutex стал доступен потокам, принадлежащим разным процессам, при создании
ему необходимо присвоить имя. Потом это имя нужно передать «по наследству» задачам, которые
должны его использовать для взаимодействия. Для этого вводятся специальные системные вызовы
(CreateMutex), в которых указывается начальное значение мьютекса и его имя.
Для работы с мьютексом имеется несколько функций. Помимо уже упомянутой функции создания
такого объекта (CreateMutex), есть функции открытия (OpenMutex) и функция освобождения этого
объекта (ReleaseMutex). Конкретные обращения к этим функциям и перечни передаваемых и
получаемых параметров нужно смотреть в документации на соответствующую ОС.
Единственная задача мьютекса — защита объекта от доступа к нему других потоков отличных от
того, который завладел мьютексом). Если другому потоку будет нужен доступ к переменной,
защищённой мьютексом, то этот поток просто засыпает до тех пор, пока мьютекс не будет освобождён.
Цель использования мьютексов — защита данных от повреждения; однако им порождаются другие
проблемы, такие как взаимная блокировка (клинч) и «соревнование за ресурс».
Семафо́р — объект, позволяющий войти в заданный участок кода не более чем n потокам.
Определение введено Э. Дейкстрой.
Определение семафора
Семафор — это объект, с которым можно выполнить три операции.
init(n):
счётчик := n
enter():
ждать пока счётчик не примет значение больше 0; после этого уменьшить счётчик на
единицу.
leave():
увеличить счётчик на единицу.
Предположим, что есть такой участок кода:
semaphore.init(5);
.....
.....
semaphore.enter();
DoSomething();
semaphore.leave();
Тогда не более пяти потоков могут одновременно выполнять функцию DoSomething().
В более сложных семафорах может использоваться очередь; при этом потоки, ожидающие
освобождения семафора, будут проходить через семафор именно в том порядке, в котором они
вызывали enter().
Применение семафоров
Вот некоторые из проблем, которые могут решать семафоры.
 запрет одновременного выполнения заданных участков кода;
 поочерёдный доступ к критическому ресурсу (важному ресурсу, для которого невозможен
одновременный доступ).
Следующий пример показывает, как наладить поочерёдный доступ к консоли.
semaphore.init(1);
Поток 1:
semaphore.enter();
cout << "Состояние массива: ";
for (int i=0; i<n; i++)
cout << a[i] << ' ';
cout << '\n';
semaphore.leave();
Поток 2:
semaphore.enter();
cout << "Нажато Esc.\n";
semaphore.leave();
ОС – Лекция 1
7
Этот код поможет предотвратить появление листинга наподобие
Состояние массива: 1 2 3 Нажато Esc.
4 5 6
(см. также Состояние гонки)
Проблемы семафоров
Во-первых, пользователь может сделать «утечку семафора», вызвав enter() и забыв вызвать leave().
Реже встречаются ошибки, когда пользователь дважды вызывает leave().
Во-вторых, семафоры чреваты взаимной блокировкой потоков. В частности, опасен такой код:
Поток 1:
semaphore1.enter();
semaphore2.enter();
...
semaphore2.leave();
semaphore1.leave();
Поток 2:
semaphore2.enter();
semaphore1.enter();
...
semaphore1.leave();
semaphore2.leave();
В-третьих, остаётся проблема синхронизации процедур самого семафора. Например, возможна
следующая ситуация: два процесса ждут освобождения семафора. После того, как семафор
освободился, первый процесс «узнаёт» об этом, но не успевает увеличить счётчик, как управление
передаётся второму процессу. Второй процесс тоже узнаёт об освобождении семафора, увеличивает
счётчик и входит в защищённый участок кода. Тут управление передаётся первому процессу, тот ещё
раз увеличивает счётчик и тоже входит в защищённый участок кода. В итоге имеем превышение
разрешённого числа процессов.
Данная проблема не имеет алгоритмического решения. Она разрешается либо размещением
процедуры ожидания в критической секции, в которой не разрешается переключение с процесса на
процесс, либо программистскими приёмами наподобие осуществления проверки флага и его
увеличения с помощью одной машинной команды.
Фьютекс (англ. futex, сокращение от англ. fast userspace mutex) — в программировании способ
реализации семафоров и мютексов POSIX в Linux. Впервые введены в ядро с версии 2.5.7 (development);
выработана стабильная семантика с 2.5.40; включаются в стабильные версии серии 2.6.x (stable).
Разработаны Уберту Франке (Hubertus Franke) (из исследовательского центра IBM им. Томаса
Ватсона), сотрудниками технологического центра IBM по Linux Мэттью Кирквудом (Matthew
Kirkwood) и Расти Расселом, а также разработчиком в компании Red Hat Инго Молнаром (Ingo Molnar).
Фьютекс представляет собой выровненное целое в общей памяти (для нескольких процессоров).
Это целое может быть увеличено или уменьшено на единицу за одну ассемблерную инструкцию.
Процессы, «завязанные» на этот фьютекс, ждут, когда это значение станет положительным. Все
операции с фьютексами практически полностью проводятся в пользовательском пространстве,
соответствующие функции ядра задействуются лишь в ограниченном наборе спорных случаев. Это
позволяет повысить эффективность использования синхронизирующих примитивов, поскольку
большинство операций не используют арбитраж, а значит и избежать использование относительно
дорогостоящих системных вызовов (англ. system call).
Ядро операционной системы
Ядро́ — центральная часть операционной системы, обеспечивающая приложениям
координированный доступ к ресурсам компьютера, таким как процессорное время, оперативная память,
внешнее оборудование. Обычно предоставляет сервисы файловой системы.
Как основополагающий элемент ОС, ядро представляет собой наиболее низкий уровень
абстракции для доступа приложений к ресурсам системы, необходимым для его работы. Как правило,
ядро предоставляет такой доступ исполняемым процессам соответствующих приложений за счет
использования механизмов межпроцессного взаимодействия и обращения приложений к системным
вызовам ОС.
Описанная задача может различаться в зависимости от типа архитектуры ядра и способа ее
реализации.
ОС – Лекция 1
8
Типы архитектур ядер операционных систем
Монолитное ядро
Монолитное ядро предоставляет богатый набор абстракций оборудования. Все части монолитного
ядра работают в одном адресном пространстве.
Старые монолитные ядра требовали перекомпиляции при любом изменении состава оборудования.
Большинство современных ядер позволяют во время работы подгружать модули, выполняющие части
функции ядра.
Достоинства: Скорость работы, упрощённая разработка модулей, богатство предоставляемых
возможностей и функций, поддержка большого количества разнообразного оборудования. [источник?]
Недостатки: Поскольку всё ядро работает в одном адресном пространстве, сбой в одном из
компонентов может нарушить работоспособность всей системы.
В этом случае компоненты операционной системы являются не самостоятельными модулями, а
составными частями одной большой программы. Такая структура операционной системы называется
монолитным ядром (monolithic kernel). Монолитное ядро представляет собой набор процедур, каждая из
которых может вызвать каждую. Все процедуры работают в привилегированном режиме.
Таким образом, монолитное ядро — это такая схема операционной системы, при которой все ее
компоненты являются составными частями одной программы, используют общие структуры данных и
взаимодействуют друг с другом путем непосредственного вызова процедур. Для монолитной
операционной системы ядро совпадает со всей системой.
Во многих операционных системах с монолитным ядром сборка ядра, то есть его компиляция,
осуществляется отдельно для каждого компьютера, на который устанавливается операционная система.
При этом можно выбрать список оборудования и программных протоколов, поддержка которых будет
включена в ядро. Так как ядро является единой программой, перекомпиляция — это единственный
способ добавить в него новые компоненты или исключить неиспользуемые. Следует отметить, что
присутствие в ядре лишних компонентов крайне нежелательно, так как ядро всегда полностью
располагается в оперативной памяти. Кроме того, исключение ненужных компонентов повышает
надежность операционной системы в целом.
Монолитное ядро — старейший способ организации операционных систем. Примером систем с
монолитным ядром является большинство Unix-систем.
В монолитном ядре выделяются вкрапления сервисных процедур, соответствующих системным
вызовам. Сервисные процедуры выполняются в привилегированном режиме, тогда как
пользовательские программы — в непривилегированном. Для перехода с одного уровня привилегий на
другой иногда может использоваться главная сервисная программа, определяющая, какой именно
системный вызов был сделан, корректность входных данных для этого вызова и передающая
управление соответствующей сервисной процедуре с переходом в привилегированный режим работы.
Данный тип архитектуры ядер имеет преимущества. В частности, монолитное ядро более
производительно, чем микроядро, поскольку состоит не из множества разрозненных процессов,
«общающихся» между собой через механизм посылки сообщений, а работает в одном адресном
пространстве, кроме того нет необходимости осуществлять переключения между процессамисервисами.
Примером монолитного ядра является Linux, имеющее, кроме того, архитектуру модульного ядра.
Оно оптимизировано для более высокой производительности с минимальными контекстными
переключениями. Такая архитектура упрощает поддержку кода ядра для разработчиков, но требует
перекомпиляции ядра при добавлении новых устройств. Следует отметить, что описанные здесь
различия являются «классическими», на практике монолитные ядра могут поддерживать модульность
(что зачастую и происходит), а микроядра могут требовать перекомпиляции.
Примеры: Традиционные ядра UNIX(такие как BSD), Linux; ядро MS-DOS.
Модульное ядро
Модульное ядро — современная, усовершенствованная модификация архитектуры монолитных
ядер операционных систем компьютеров.
В отличие от «классических» монолитных ядер, считающихся ныне устаревшими, модульные ядра,
как правило, не требуют полной перекомпиляции ядра при изменении состава аппаратного обеспечения
ОС – Лекция 1
9
компьютера. Вместо этого модульные ядра предоставляют тот или иной механизм подгрузки модулей
ядра, поддерживающих то или иное аппаратное обеспечение (например, драйверов). При этом
подгрузка модулей может быть как динамической (выполняемой «на лету», без перезагрузки ОС, в
работающей системе), так и статической (выполняемой при перезагрузке ОС после
переконфигурирования системы на загрузку тех или иных модулей).
Все модули ядра работают в адресном пространстве ядра и могут пользоваться всеми функциями,
предоставляемыми ядром. Поэтому модульные ядра продолжают оставаться монолитными.
Модульные ядра удобнее для разработки, чем традиционные монолитные ядра, не
поддерживающие динамическую загрузку модулей, так как от разработчика не требуется многократная
полная перекомпиляция ядра при работе над какой-либо его подсистемой или драйвером. Выявление,
локализация, отладка и устранение ошибок при тестировании также облегчаются.
Модульные ядра предоставляют особый программный интерфейс (API) для связывания модулей с
ядром, для обеспечения динамической подгрузки и выгрузки модулей. В свою очередь, не любая
программа может быть сделана модулем ядра: на модули ядра накладываются определённые
ограничения в части используемых функций (например, они не могут пользоваться функциями
стандартной библиотеки С/С++ и должны использовать специальные аналоги, являющиеся функциями
API ядра). Кроме того, модули ядра обязаны экспортировать определённые функции, нужные ядру для
правильного подключения и распознавания модуля, для его корректной инициализации при загрузке и
корректного завершения при выгрузке, для регистрации модуля в таблице модулей ядра и для
обращения из ядра к сервисам, предоставляемым модулем.
Не все части ядра могут быть сделаны модулями. Некоторые части ядра всегда обязаны
присутствовать в оперативной памяти и должны быть жёстко «вшиты» в ядро. Также не все модули
допускают динамическую подгрузку (без перезагрузки ОС). Степень модульности ядер (количество и
разнообразие кода, которое может быть вынесено в отдельные модули ядра и допускает динамическую
подгрузку) различна в различных архитектурах модульных ядер. Ядро «Linux» в настоящее время имеет
более модульную архитектуру, чем ядра *BSD (FreeBSD, NetBSD, OpenBSD).
Общей тенденцией развития современных модульных архитектур является всё большая
модуларизация кода (повышение степени модульности ядер), улучшение механизмов динамической
подгрузки и выгрузки, уменьшение или устранение необходимости в ручной подгрузке модулей или в
переконфигурации ядра при изменениях аппаратуры путём введения тех или иных механизмов
автоматического определения оборудования и автоматической подгрузки нужных модулей,
универсализация кода ядра и введение в ядро абстрактных механизмов, предназначенных для
совместного использования многими модулями (примером может служить VFS — «виртуальная
файловая система», совместно используемая многими модулями файловых систем в ядре Linux).
Микроядро
Микроядро предоставляет только элементарные функции управления процессами и минимальный
набор абстракций для работы с оборудованием. Бо́льшая часть работы осуществляется с помощью
специальных пользовательских процессов, называемых сервисами.
Достоинства: Устойчивость к сбоям оборудования, ошибкам в компонентах системы.
Недостатки: Передача данных между процессами требует накладных расходов.
Современная тенденция в разработке операционных систем состоит в перенесении значительной
части системного кода на уровень пользователя и одновременной минимизации ядра. Речь идет о
подходе к построению ядра, называемом микроядерной архитектурой (microkernel architecture)
операционной системы, когда большинство ее составляющих являются самостоятельными
программами. В этом случае взаимодействие между ними обеспечивает специальный модуль ядра,
называемый микроядром. Микроядро работает в привилегированном режиме и обеспечивает
взаимодействие между программами, планирование использования процессора, первичную обработку
прерываний, операции ввода-вывода и базовое управление памятью.
Остальные компоненты системы взаимодействуют друг с другом путем передачи сообщений через
микроядро.
Основное достоинство микроядерной архитектуры — высокая степень модульности ядра
операционной системы. Это существенно упрощает добавление в него новых компонентов. В
микроядерной операционной системе можно, не прерывая ее работы, загружать и выгружать новые
драйверы, файловые системы и т. д. Существенно упрощается процесс отладки компонентов ядра, так
как новая версия драйвера может загружаться без перезапуска всей операционной системы.
ОС – Лекция 1
10
Компоненты ядра операционной системы ничем принципиально не отличаются от пользовательских
программ, поэтому для их отладки можно применять обычные средства. Микроядерная архитектура
повышает надежность системы, поскольку ошибка на уровне непривилегированной программы менее
опасна, чем отказ на уровне режима ядра.
И чтобы добавить в ОС с микроядром драйвер того или иного устройства, не надо
перекомпилировать всё ядро, а надо лишь отдельно откомпилировать этот драйвер и запустить его в
пользовательском пространстве.
В то же время микроядерная архитектура операционной системы вносит дополнительные
накладные расходы, связанные с передачей сообщений, что отрицательно влияет на
производительность. Для того чтобы микроядерная операционная система по скорости не уступала
операционным системам на базе монолитного ядра, требуется очень аккуратно проектировать
разбиение системы на компоненты, стараясь минимизировать взаимодействие между ними. Таким
образом, основная сложность при создании микроядерных операционных систем — необходимость
очень аккуратного проектирования.
Микроядра типа ядра ОС Minix и GNU Hurd развиваются медленно, гораздо медленнее, чем Linux
и ядро систем семейства BSD, но они обладают огромным потенциалом, то есть заделом на будущее, и,
возможно, в этом самом будущем, достигнут аналогичного функционала.
Клаcсическим пpимером микpоядерной cистемы являeтся Symbian OS. Этo пpимер
pаспространенной и oтработанной микpоядеpной (a нaчиная c вeрсии Symbian OS v8.1, и нaноядерной)
oперационной сиcтемы. B oтличии oт Windows NT, cоздателям Symbian OS удaлось cовмеcтить
эффeктивность и кoнцептуальную cтройность, нeсмотря нa тo чтo совремeнные вeрcии этoй сиcтемы
пpедостaвляют обширные возможности, в тoм чиcле cредства для pабoты c пoтоковыми дaнными,
cтеками пpотoколов, кpитичными к лaтентности ядpа, гpафикой и видеo выcокого pазрeшения). Будyчи
микpoядерной oпeрационной cистемой, Symbian «вынoсит» пpaктически вcе пpикладные (т.e.
выxoдящие зa прeделы кoмпетeнции ядpа) зaдачи в мoдули-сeрверы, фyнкциoнирующие в
пoльзовательском aдреcном пpoстранствe.
Примеры: Symbian OS; Mach, используемый в GNU/Hurd и MacOS X; QNX; AIX; Minix ;
ChorusOS ; AmigaOS; MorphOS.
Экзоядро
Экзоядро — ядро операционной системы компьютеров, предоставляющее лишь функции для
взаимодействия между процессами и безопасного выделения и освобождения ресурсов.
Экзо — приставка, обозначающая нечто внешнее, находящееся снаружи.
В традиционных операционных системах ядро предоставляет не только минимальный набор
сервисов, обеспечивающих выполнение программ, но и большое количество высокоуровневых
абстракций для использования разнородных ресурсов компьютера: оперативной памяти, жестких
дисков, сетевых подключений. В отличие от них, ОС на основе экзоядра предоставляет лишь набор
сервисов для взаимодействия между приложениями, а также необходимый минимум функций,
связанных с защитой: выделение и высвобождение ресурсов, контроль прав доступа, и т. д. Экзоядро не
занимается предоставлением абстракций для физических ресурсов — эти функции выносятся в
библиотеку пользовательского уровня (так называемую libOS).
Основная идея операционной системы на основе экзоядра состоит в том, что ядро должно
выполнять лишь функции координатора для небольших процессов, связанных только одним
ограничением — экзоядро должно иметь возможность гарантировать безопасное выделение и
освобождение ресурсов оборудования. В отличие от ОС на основе микроядра, ОС, базирующиеся на
ОС – Лекция 1
11
экзоядре, обеспечивают гораздо большую эффективность за счет отсутствия необходимости в
переключении между процессами при каждом обращении к оборудованию.
Архитектуры на основе экзоядер являются дальнейшим развитием и усовершенствованием
микроядерных архитектур и одновременно ужесточают требования к минималистичности и простоте
кода ядра.
libOS может обеспечивать произвольный набор абстракций, совместимый с той или иной уже
существующей операционной системой, например Linux или Windows.
Наноядро
Наноядро — архитектура ядра операционной системы компьютеров, в рамках которой крайне
упрощённое и минималистичное ядро выполняет лишь одну задачу — обработку аппаратных
прерываний, генерируемых устройствами компьютера. После обработки прерываний от аппаратуры
наноядро, в свою очередь, посылает информацию о результатах обработки (например, полученные с
клавиатуры символы) вышележащему программному обеспечению при помощи того же механизма
прерываний.
В некотором смысле концепция наноядра близка к концепции HAL — Hardware Abstraction Layer,
предоставляя вышележащему ПО удобные механизмы абстракции от конкретных устройств и способов
обработки их прерываний.
Наиболее часто в современных компьютерах наноядра используются для виртуализации
аппаратного обеспечения реальных компьютеров или для реализации механизма гипервизора, с целью
позволить нескольким или многим различным операционным системам работать одновременно и
параллельно на одном и том же компьютере. Например, VMware ESX Server реализует собственное
наноядро, не зависимое от ОС и устанавливаемое на «голое железо». Поверх этого наноядра работают
пользовательские и административные утилиты VMware и сами операционные системы,
виртуализируемые в ESX Server.
Наноядра также могут использоваться для обеспечения переносимости (портабельности)
операционных систем на разное аппаратное обеспечение или для обеспечения возможности запуска
«старой» операционной системы на новом, несовместимом аппаратном обеспечении без ее полного
переписывания и портирования. Например, фирма Apple Computer использовала наноядро в версии Mac
OS Classic для PowerPC для того, чтобы транслировать аппаратные прерывания, генерировавшиеся их
компьютерами на базе процессоров PowerPC в форму, которая могла «пониматься» и распознаваться
Mac OS для процессоров Motorola 680x0. Таким образом, наноядро эмулировало для Mac OS «старое»
680x0 железо. Альтернативой было бы полное переписывание и портирование кода Mac OS на PowerPC
при переходе с 680x0 на них. Позднее, в эпоху Mac OS 8.6, наноядро виртуализировало
предоставляемые PowerPC мультипроцессорные возможности и обеспечивало поддержку SMP в Mac
OS. Другие удачные примеры использования наноядерных архитектур включают наноядро Adeos,
работающее как модуль ядра для Linux и позволяюшее выполнять одновременно с Linux какую‐ либо
операционную систему реального времени.
Наноядро может быть настолько маленьким и примитивным, что даже важнейшие устройства,
находящиеся непосредственно на материнской плате или на плате контроллера встраиваемого
устройства, такие, как таймер или программируемый контроллер прерываний, обслуживаются
специальными драйверами устройств, а не непосредственно ядром. Такого рода сверхминималистичные
наноядра называют иногда пикоядрами.
Термин «наноядро» иногда неформально используется для описания очень маленьких,
упрощённых и лёгких микроядер, таких, как L4.
Гибридное ядро
Гибридные ядра это модифицированные микроядра, позволяющие для ускорения работы
запускать «несущественные» части в пространстве ядра.
Имеют «гибридные» достоинства и недостатки.
Все рассмотренные подходы к построению операционных систем имеют свои достоинства и
недостатки. В большинстве случаев современные операционные системы используют различные
комбинации этих подходов. Так, например, ядро «Linux» представляет собой монолитную систему с
элементами микроядерной архитектуры. При компиляции ядра можно разрешить динамическую
загрузку и выгрузку очень многих компонентов ядра — так называемых модулей. В момент загрузки
ОС – Лекция 1
12
модуля его код загружается на уровне системы и связывается с остальной частью ядра. Внутри модуля
могут использоваться любые экспортируемые ядром функции.
Существуют варианты ОС GNU, в которых вместо монолитного ядра применяется ядро Mach
(такое же, как в Hurd), а поверх него крутятся в пользовательском пространстве те же самые процессы,
которые при использовании Linux были бы частью ядра. Другим примером смешанного подхода может
служить возможность запуска операционной системы с монолитным ядром под управлением
микроядра. Так устроены 4.4BSD и MkLinux, основанные на микроядре Mach. Микроядро обеспечивает
управление виртуальной памятью и работу низкоуровневых драйверов. Все остальные функции, в том
числе взаимодействие с прикладными программами, осуществляется монолитным ядром. Данный
подход сформировался в результате попыток использовать преимущества микроядерной архитектуры,
сохраняя по возможности хорошо отлаженный код монолитного ядра.
Наиболее тесно элементы микроядерной архитектуры и элементы монолитного ядра переплетены в
ядре Windows NT. Хотя Windows NT часто называют микроядерной операционной системой, это не
совсем так. Микроядро NT слишком велико (более 1 Мбайт), чтобы носить приставку «микро».
Компоненты ядра Windows NT располагаются в вытесняемой памяти и взаимодействуют друг с другом
путем передачи сообщений, как и положено в микроядерных операционных системах. В то же время все
компоненты ядра работают в одном адресном пространстве и активно используют общие структуры
данных, что свойственно операционным системам с монолитным ядром. По мнению специалистов
Microsoft, причина проста: чисто микроядерный дизайн коммерчески невыгоден, поскольку
неэффективен.
Таким образом, Windows NT можно с полным правом назвать гибридной операционной системой.
Смешанное ядро, в принципе, должно объединять преимущества монолитного ядра и микроядра:
казалось бы, микроядро и монолитное ядро — крайности, а смешанное — золотая середина. В них
возможно добавлять драйвера устройств двумя способами: и внутрь ядра, и в пользовательское
пространство. Но на практике концепция смешанного ядра часто подчёркивает не только достоинства,
но и недостатки обоих типов ядер (тот же NT со смешанным ядром не может видеть НЖМД (жесткие
диски) большого объёма в обход BIOS, в то время как GNU/Linux с его монолитным ядром
обеспечивает такую возможность, поскольку возможность видеть НЖМД (жесткие диски) в обход BIOS
встроена в его ядро).
Примеры: Windows NT, DragonFlyBSD.
ОС – Лекция 1
13
Download