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

Ядро служит мостом между прикладным программным и аппаратным обеспечением компьютера.

Ядро ( англ. Kernel ) - Базовая компонента операционной системы, реализующей интерфейс между прикладными процессами и оборудованием компьютера. Загружается в оперативную память компьютера и непосредственно взаимодействует с аппаратурой, обеспечивая управление аппаратными средствами (при этом используются драйверы (модули ядра) подключенного в систему оборудования), поддержку одновременной работы многих пользователей (многопользовательский режим), поддержку параллельного выполнения многих процессов в системе ( многозадачность). Обычно ядро ​​делает эти объекты доступными для прикладных процессов через механизмы мижпроцеснои взаимодействия и системных вызовов.

Каждая операционная система реализует эти задачи по-разному, в зависимости от своей реализации и дизайна. Например, монолитные ядра выполняют весь код операционной системы для увеличения производительности в одном адресном пространстве, микроядра запускают большинство служб операционной системы в пространстве пользователя в качестве серверов, направленных на повышение эксплуатационной надежности и модульности операционной системы.


1. Составные части ядра операционной системы

Основная задача ядра - управление ресурсами компьютера и управления их доступностью другим программам для запуска и использования. Как правило, основными ресурсами ядра являются:

  • ЦБ. Это - центральная часть компьютерной системы, отвечает за функционирование и выполнение программ. Ядро берет на себя ответственность за принятие решений о количество процессорного времени, выделяемого для запущенных программ.
  • Память компьютера. Память используется для хранения команд и данных программного обеспечения. Как правило, оба эти элементы должны быть в памяти для возможности выполнения программы. Часто несколько программ запрашивают доступ к памяти, иногда они требуют больше памяти, чем у компьютера. Само ядро ​​отвечает за решение о предоставлении соответствующего количества памяти каждому процессу и что делать, когда памяти не достаточно.
  • Любые устройства ввода / вывода (I / O), подключенные к компьютеру, такие как клавиатура, мышь, дисководы, принтеры, мониторы и тому подобное. Ядро выделяет возможность запроса от приложений для выполнения операций ввода / вывода соответствующего устройства и предоставляет пользователю удобные абстракции основных функций.

Ключевые аспекты, необходимые для управления ресурсами является определение домена выполнения (адресного пространства), а также механизма защиты, который используется для работы с доступом к ресурсам домена. Ядра также обычно предоставляют методы для синхронизации и взаимодействие между процессами (так механизм мижпроцеснои взаимодействия или IPC). Ядро может выполнять эти функции самостоятельно или полагаться на некоторые процессы, которые запускаются им обеспечения условий для других процессов, хотя в этом случае ядро ​​должно предоставить некоторые средства IPC, чтобы позволить этим специальным процессам доступ к внутренней структуры прикладных процессов. Наконец, ядро ​​должно обеспечить запущенные программы методами, которые позволяют делать запросы на доступ к этим объектам.


1.1. Управление процессами

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

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

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

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

Другие операционные системы (в частности на меньших, менее мощных компьютерах) могут использовать кооперативную многозадачность, где каждый процесс выполняется непрерывно до тех пор, пока этот процесс не пошлет специальный запрос к ядру, что дает разрешение на начало выполнения другого процесса. Старые версии Windows и Mac OS использовали кооперативную многозадачность, но в конце концов, с ростом мощности компьютеров, они перешли на вытесняющую многозадачность.

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


1.2. Управление памятью

Ядро имеет полный доступ к системной памяти и предоставляет процессам безопасный доступ к ней в случае необходимости. Чаще первым шагом для достижения этого является создание виртуальной памяти, обычно это достигается с помощью файла подкачки и сегментной адресации памяти. Виртуальная адресация позволяет ядру сделать определенную физическую адрес видимой под другим виртуальной адресу. Пространства виртуальных адресов могут быть разными для разных процессов; память, к которой имеет доступ один процесс под виртуальной адресу, может иметь совершенно другую виртуальный адрес в пространстве адрес другого процесса. Это позволяет абстрагировать различные процессы друг от друга, что предотвращает использование одного участка памяти различными процессами.

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

Виртуальное адресов также позволяет создание виртуальных разделов памяти двух разделенных областях, одна из которых зарезервирована для ядра, а вторая для приложений (пространство пользователя). Приложения не имеют возможности доступа к памяти пространства ядра, что достигается использованием специальных защитных механизмов в ЦБ.


1.3. Управление устройствами

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

Ядро должно хранить список всех имеющихся устройств. Этот список может быть известен заранее (например во встроенных системах, где ядро ​​переписывается каждый раз при изменении аппаратного обеспечения), настроенный пользователем (чаще всего на старых системах или системах, которые не предназначены для персонального пользования) или найден операционной системой при времени выполнения.

В системах plug and play менеджер устройств сначала сканирует различные порты, а затем пытается распознать подключенные устройства и найти для них нужный драйвер.

Реализация управления устройствами очень отличается в различных операционных системах, но, во всяком случае, ядро ​​должно предоставить интерфейс ввода / вывода, чтобы позволить драйверам иметь доступ напрямую к устройству через какой-либо порт или участок памяти.


1.4. Системные вызовы

Чтобы действительно выполнить нужную работу, процесс должен иметь доступ к службам, предоставленных ядром. Реализация этого интерфейса различна в каждом ядре, но большинство ядер содержит библиотеку на C и программный интерфейс к ней, которая в свою очередь обращается к функциям ядра. Метод, с помощью которого осуществляется обращение к ядру сильно варьируется в зависимости от реализации. Если применяется изоляция памяти, то пользовательский процесс не имеет прямого доступа к ядру, потому что это было бы нарушением правил доступа центрального процессора. Среди существующих методов выделяются:

  • Используя симулированной программно прерывания. Этот метод доступен на большинстве аппаратных платформ, а потому очень распространен.
  • Используя шлюз вызова. Шлюз вызова - специальный адрес в памяти ядра в месте, известном процессора. Когда процессор замечает вызов этой адреса, он вместо перенаправляет его в целевой места без нарушения правил доступа. Такой метод требует аппаратной поддержки, но аппаратное обеспечение для него достаточно распространено.
  • Используя специальную инструкцию системного вызова. Этот способ требует специфически аппаратной поддержки, которой может не быть в популярных архитектурах (в особенности x86). Инструкции системных вызовов все же были добавлены к современным моделям процессоров x86 и много операционных систем их активно используют.
  • Используя очередь в памяти. Программа, делает большое количество запросов, но не нуждается ждать результата каждого из них может добавлять эти запросы в специальный участок оперативной памяти, периодически сканируется ядром.

2. Подходы к проектированию ядра

2.1. Монолитное ядро

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


2.2. Ядро

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

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


2.3. Сравнение монолитных и микроядер

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

К началу 1990-х, вследствие недостатков монолитных ядер по сравнению с ядро, монолитные ядра считались устаревшими большинством исследователей. Именно поэтому разработка ядра Linux как монолитного ядра стала темой известной дискуссии между Линусом Торвальдсом и Эндрю Танембаумом. Суть этого спора представлена ​​в статье Дискуссия Танембаума-Торвальдса.


2.4. Гибридное ядро

Гибридные ядра является компромиссом между монолитными и ядро. Это предполагает запуск некоторых служб (например сетевого стека и файловой системы) в пространстве ядра для уменьшения накладных расходов традиционного микроядра, но большинство служб запускаются в пользовательском пространстве.

2.5. Наноядро

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

2.6. Екзоядро

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

3. История развития различных типов ядер

3.1. Ранние ядра операционных систем

Строго говоря, ОС или ядро ​​не является предпосылкой возможности запуска программы на компьютере. Программы можно выполнить на "голом металле" при условии, что автор программы готов пожертвовать слоем аппаратной абстракции и доступом к возможностям ОС. Большинство компьютеров в период 1950-1960 лет работали именно таким образом и их нужно было перезапускать при окончании выполнения каждой программы. Наконец были написаны небольшие вспомогательные программы, такие как программа-загрузчик и зневаджувач, которые оставались в памяти между запуском различных приложений. Это и стало началом зарождения развития ядер операционной системы.

В 1969 году была представлена ​​RC 4000 Multiprogramming System, включающей небольшое ядро ​​"на котором можно создать ядра операционных систем для различных целей в упорядоченный образ". Сегодня такой метод называется микроядерной подходом.


3.2. Операционные системы с разделением времени

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

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


3.3. Amiga

Amiga, платформа разработана компанией Commodore International и выпущенная в 1985 году была в числе первых (и самых успешных) домашних компьютеров на микроядерной операционной системе. AmigaOS имела небольшое, но мощное ядро, которое реализовывало вытесняющую многозадачность на аппаратной платформе, подобной Apple Macintosh (на которой использовалась кооперативная многозадачность) и имело развитую систему динамических библиотек, что позволяло легкое расширение.


3.4. Unix

Диаграмма связи между Unix-подобными операционными системами.

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

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

Через некоторое время эта концепция была несколько изменена, потому трактовка всего как файла или потока байтов было не так удобно применимо, как раньше. Хотя терминал и можно рассматривать как файл или поток байтов, это самое нельзя сделать для графического интерфейса пользователя. Еще одной проблемой было сетевое соединение. Даже если его можно сравнить с доступом к файлу на высоком уровне, то низкоуровневая пакетно-ориентированная архитектура должна быть предназначена для отдельных кусков данных, а не всего файла. С ростом возможностей компьютеров операционные системы Unix и построенные на ее базе стали перенасыщены кодом. Если ядра в 70-80-е годы имели не бильще 100 000 строк кода, то современные Unix-подобные ОС, такие как Linux имеют более 13 миллионов строк кода.

Современные ОС, производные от Unix, как правило базируются на монолитных ядрах с возможностью загрузки модулей. Это группа включает Linux и варианты BSD, такие как FreeBSD, DragonflyBSD, OpenBSD и NetBSD.


3.5. Mac OS

Mac OS впервые был представлен в 1984 году. Она была основной операционной системой персонального компьютера Macintosh от Apple Computer. Хотя первые выпуски Mac OS не имели таких основных возможностей как многозадачность и иерархическая файловая система, эти недостатки были устранены до версии Mac OS 9. Mac OS X имеет полностью отличное гибридное ядро от предыдущих версий, которое называется XNU и является частью проекта Darwin.

3.6. Microsoft Windows

Первая версия Microsoft Windows была представлена ​​в 1985 году как дополнение к MS-DOS. Из-за зависимости от другой ОС, первые версии Windows принято называть операционной средой (в отличие от понятия операционной системы). Полноценной ОС Windows стала с появлением серии Windows 9x, включавшая такие улучшения как 32-битное адресов и вытесняющую многозадачность. Параллельно с основной, Microsoft также разрабатывала серию Windows NT, которая была предназначена для очень опытных и бизнес пользователей.

Windows XP, выпущенная в октябре 2001 года, соединяла в себе эти две серии, объединяя стабильность ядра NT с удобством пользования Windows 9x. Windows NT архитектурно считается гибридным ядром, где служба графического интерфейса и некоторые другие вспомогательные программы встроенные в ядро, а остальные служб запускается в пользовательском пространстве.


См.. также

п ? в ? р Операционная система
Ядро
Гибридные ? Микро ? Модульное ? Монолитное ? Нано ? Экзо ? Драйвер ? Пространство пользователя ? Область пользователя
Управление
процессом
Режимы (супервизора ? реальный ? защищенный) ? Прерывания ? Кольца защиты ? Переключение контекста ? Многозадачность ( вытесняющая многозадачность ? кооперативная ? мультипрограммирования) ? Процесс ? управления процессом ? Планировщик заданий ? Багатонитевисть
Управление
памятью
Защита памяти ? Сегментация памяти ? Страничная память ? Менеджер виртуальной памяти ? Ошибка сегментации ? Общая ошибка защиты
Примеры
AmigaOS ? BeOS ? BSD ? GNU ? IBM OS / 2 ? Linux ? Mac OS X ? Mac OS ? Microsoft Windows ? MorphOS ? MS-DOS ? OpenSolaris ? OS / 2 ? ReactOS ? UNIX ? Windows
Другое
API ? CLI ? GUI ? Слой аппаратных абстракций (HAL) PXE ? TUI ? VFS ? VOI ? Virtual tape library ? Виртуальная файловая система ? Загрузчик ОС ? Компьютерная сеть ? История операционных систем ?