Обзор архитектуры операционной системы

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

Назначение и ключевые технологии
Масштабируемая архитектура и встраиваемые системы
Важность поддержки стандартов группы IEEE 1003.1
Микроядерная архитектура
Операционная система как кооперация процессов
Детализация сервисов ядра
Системные процессы операционной системы
Межпроцессное взаимодействие
Распределение вычислений по сети

Назначение и ключевые технологии

Одна из основных задач, сформулированных при разработке Защищенной операционной системы реального времени (ЗОСРВ) «Нейтрино» — предоставить потребителям POSIX-совместимый программный интерфейс (API) в надежной масштабируемой форме, подходящей для широкого спектра программно-аппаратных систем — от встраиваемых систем с ограниченными ресурсами до высокопроизводительных распределенных и параллельных вычислительных систем. Операционная система поддерживает обширный перечень отечественных и иностранных процессорных архитектур, включая: e2k (Эльбрус, МЦСТ), x86, Aarch64, ARM, PowerPC, MIPS.

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


Note: Термин система реального времени используется в классическом понимании институтов Berkeley и IEEE:
  • Системы реального времени — это вычислительные системы, которые должны реагировать на события окружающей среды с точностью заданных в временнЫх ограничений. Оригинальная формулировка: Real-time systems are computing systems that must react within precise time constraints to events in the environment. – [Giorgio C. Buttazzo (Fellow of the Institute of Electrical and Electronics Engineers, IEEE). Hard Real-Time Computing Systems: Predictable Scheduling Algorithms and Applications. - Springer, 1997].

  • Система реального времени своевременно и предсказуемо реагирует на непредсказуемые внешние события... Корректность вычислений реального времени зависит не только от правильности логического результата вычислений, но и от времени его получения результата (с учетом заданных временных ограничений). Оригинальная формулировка: A real-time system responds in a timely and predictable way to unpredictable external stimuli arrival... In real-time computing correctness depends not only on the correctness of the logical result of the computation but also on the result delivery time (timing constraints). [Marco Di Natale. An Introduction to Real-Time Operating Systems and Schedulability Analysis. - Berkeley, 2012].

Защищенная операционная система реального времени (ЗОСРВ) «Нейтрино» является продуктом компании «СВД Встраиваемые Системы» (обозначение согласно ЕСПД: КПДА.10964-01) и предназначена для отказоустойчивого и предсказуемого управления ресурсами вычислительных средств, управляющих физическим оборудованием или технологическими процессами. ЗОСРВ «Нейтрино» включена в Единый реестр российских программ для электронных вычислительных машин и баз данных и удовлетворяет требованиям нормативно-правовых актов (НПА) ФСТЭК России для операционных систем типа А и В второго класса защиты (НПА ОС: А2, В2). Общество с ограниченной ответственностью «СВД Встраиваемые Системы» является разработчиком и правообладателем данного программного обеспечения.

Масштабируемая архитектура и встраиваемые системы

Поскольку операционная система основана на микроядерной архитектуре, она может быть легко масштабирована посредством определения (запуска или исключения) интересующего набора сервисов, драйверного обеспечения и утилит, которое обеспечивает требуемую функциональность. Это позволяет использовать одну операционную систему как для встраиваемых систем, так и для гораздо более широкого круга приложений, даже вне контекста задач реального времени. При проектировании встраиваемых решений стоит обратить также внимание на минимальные системные требования ЗОСРВ «Нейтрино».

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

Масштабируемость операционной системы позволяет соразмерно отвечать на усложнение аппаратного обеспечения и появление новых алгоритмических задач в разрабатываемом продукте:

Важность поддержки стандартов группы IEEE 1003.1

Типичная проблема с выбором операционной системы реального времени (ОСРВ) заключается в том, что каждая из них, как правило, обладает собственным уникальным низкоуровневым API. При отсутствии единых отраслевых стандартов это обычное явление. Стандарты семейства POSIX.x (IEEE 1003.1) позволяют успешно решать данную проблему в системах общего назначения, но достаточно редко поддерживаются в операционных системах обсуждаемого класса.

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

Среди многих стандартов POSIX наибольший интерес для разработчиков представляют следующие:

Кроме стандартизации имеются и другие преимущества, следующие из совместимости со стандартами группы POSIX.x.

Переносимость исходного кода

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


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

Снижение требований к штату разработчиков

Для работы с ЗОСРВ «Нейтрино» требуется в первую очередь наличие навыков работы с унифицированным API, что позволяет привлекать программистов, имеющих опыт работы с другими POSIX-совместимыми операционными системами, относящихся к семействам Linux и UNIX, а поддержка обширного перечня процессорных архитектур и платформ позволяет абстрагироваться от низкоуровневых аппаратных отличий. На прикладном уровне этот эффект усиливается за счет поддержки таких технологий (ставших промышленными стандартами де-факто), как OpenGL, OpenCL и библиотека интерфейсов Qt, а также известных большинству разработчиков инструментов: GCC, Python и Qt Creator.

Микроядерная архитектура

«микроядерная» архитектура применялась Эндрю Таненбаумом в ОС Minix еще в 1987 году. Микроядерной называется ОС, имеющая функционально крошечное ядро с минимальным набором предоставляемых сервисов. В общем случае к ним относятся: обслуживание прерываний и таймера, менеджмент памяти, а также планирование задач (В ЗОСРВ «Нейтрино» единицей планирования является поток) и организация их взаимодействия. Вся высокоуровневая функциональность в таких системах вынесена в отдельные от ядра взаимодействующие процессы, которые по своей сути мало отделимы от прикладных.

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


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

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

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


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

Ряд ОСРВ реализуют лишь однопроцессную многопоточную модель с незащищенной памятью между потоками. Такая среда воплощает лишь часть стандарта POSIX и является подмножеством многопроцессорных сред исполнения. Такие системы, например, не поддерживают функцию fork(). ЗОСРВ «Нейтрино», напротив, полностью использует потенциал механизмов защиты адресных пространств на основе MMU. При переходе с более простых ОСРВ это может стать неожиданностью.

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


1_1.png
Рисунок 1. Традиционные ОСРВ без защиты памяти


1_2.png
Рисунок 2. В монолитных ОСРВ системные процессы не имеют защиты памяти


1_3.png
Рисунок 3. Микроядерные ОСРВ реализуют полную защиту памяти процессов

Операционная система как кооперация процессов

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

1_1.png
Рисунок 4. Архитектура ЗОСРВ «Нейтрино»

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

Детализация сервисов ядра

Ядро — это сердце любой операционной системы. В некоторых системах оно включает в себя так много функций, что фактически это целая операционная система. Как отмечалось ранее, микроядро ЗОСРВ «Нейтрино», как и ядро традиционных ОСРВ очень маленькое по размеру и включает лишь несколько основных сервисов:


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

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

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

Драйверы устройств

Драйвером устройства в ЗОСРВ «Нейтрино» может считаться любой код, непосредственно взаимодействующий с оборудованием периферии. В большинстве случаев он также предоставляет прикладным программам возможность обращаться к устройству стандартизованным образом (методы регламентированы стандартом POSIX).

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


Caution: В данном случае применимо отмеченное ранее замечание о появлении заведомо некорректного системного кода, который ставит своей целью создание условий для возникновения нештатных аппаратных ситуаций.

Межпроцессное взаимодействие

Если операционная система допускает одновременное выполнение нескольких потоков (действительная или псевдо-многозадачность за счет квантования времени), ядро должно предоставить механизмы, позволяющие им взаимодействовать друг с другом – IPC.

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


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

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


Передача сообщений

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

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

Распределение вычислений по сети

Типичный способ использования ресурсов ЛВС – организация совместного использования файлов и сетевых устройств несколькими взаимосвязанными компьютерами. ЗОСРВ «Нейтрино» рассматривает всю сеть в качестве единого однородного набор ресурсов, позволяя организовать прозрачный для прикладного процесса вычислительный кластер.

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

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




Предыдущий раздел: перейти