1. Философия QNX Neutrino



Целевые характеристики
Основным назначением операционной системы QNX Neutrino является реализация программного интерфейса POSIX в масштабируемой, отказоустойчивой форме, подходящей для широкого круга открытых систем, начиная от небольших встроенных систем с ограниченными ресурсами и заканчивая крупными распределенными вычислительными средами. Данная ОС поддерживает несколько семейств процессоров, в том числе x86, ARM, XScale, PowerPC, MIPS и SH-4.

Отказоустойчивая архитектура также крайне необходима для работы критически важных приложений (mission-critical applications), поэтому в ОС QNX Neutrino в полной мере используются возможности работы с MMU-оборудованием.

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

Встраиваемая операционная система стандарта POSIX

Некорректно считать, что UNIX-подобная POSIX-совместимая операционная система слишком громоздка и не подходит для встраиваемых систем.

Однако POSIX это не UNIX. Хотя стандарты POSIX берут свое начало из практики использования UNIX, рабочие группы по POSIX четко определили эти стандарты как "интерфейс, а не реализацию".

Благодаря принятой в этих стандартах точной спецификации, а также существующим комплектам тестирования POSIX, нетрадиционные архитектуры операционных систем могут реализовывать программный интерфейс (API) POSIX без применения традиционного UNIX-ядра. Если сравнить любые две POSIX-системы, то может показаться, что они очень похожи — у них много одинаковых функций, утилит и т. д. Однако когда речь идет о производительности и отказоустойчивости, они могут так же отличаться друг от друга, как день и ночь. Все дело в архитектуре.

Несмотря на то, что QNX Neutrino имеет архитектуру, которая абсолютно отличается от архитектуры UNIX, эта операционная система реализует программный интерфейс POSIX. Благодаря микроядерной архитектуре, компоновка программного интерфейса может быть легко масштабирована как "вниз", так и "вверх" по отдельным компонентам в соответствии с требованиями проектируемой встраиваемой системы реального времени.
Масштабирование операционной системы внутри семейства продуктов
Благодаря возможности легко масштабировать микроядерную ОС с помощью включения или выключения тех или иных процессов, обеспечивающих необходимую функциональность, возможно использовать одну микроядерную ОС для значительно более широкого круга приложений, чем исполняемый модуль реального времени (realtime executive).

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

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

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

Информацию о текущей документации по стандартам POSIX можно найти в отчете Комитета по стандартам переносимых приложений (Portable Applications Standards Committee) Компьютерного сообщества IEEE (IEEE Computer Society) по адресу http://pasc.opengroup.org/standing/sdll.html.

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

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

Даже при использовании кросс-платформенной модели разработки программный интерфейс (API) остается принципиально тем же самым. Какая бы платформа (QNX Neutrino, Solaris, Windows и т. д.) или целевой процессор (x86, ARM, MIPS, PowerPC и др.) не применялись, программисту не нужно беспокоиться, например, о проблемах следования байтов (endian), выравнивания (alignment) или ввода/вывода данных.
Преимущества ОС QNX Neutrino для встраиваемых систем
Основной задачей операционной системы является управление ресурсами компьютеров. Все процессы внутри системы — планирование прикладных программ, запись файлов на диск, пересылка данных по компьютерной сети и т. д. — должны осуществляться с максимальной степенью цельности (seamlessly) и прозрачности.

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

ОС QNX Neutrino идеально подходит для встраиваемых приложений реального времени. Она может быть масштабирована до самых компактных конфигураций и способна работать в многозадачном режиме, управлять потоками, осуществлять планирование процессов по приоритетам (priority-driven preemptive scheduling) и выполнять быстрое переключение контекстов (fast context-switching). Более того, операционная система предоставляет все эти возможности посредством программного интерфейса, основанного на стандартах POSIX. Таким образом, компактность системы достигается не в ущерб стандартам.

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

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

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

Поскольку механизм межзадачного взаимодействия (interprocess communication (IPC) services), действующий в микроядре, служит в качестве "связующего материала", который организует ОС как единое целое, от производительности и гибкости этого механизма зависит производительность всей ОС. Если не учитывать данный механизм, то микроядро можно сравнить, грубо говоря, с исполнительным модулем реального времени (как с точки зрения объема выполняемых им функций, так и с точки зрения скорости их выполнения).

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

Недостатком многих исполнительных модулей реального времени, реализующих стандарт POSIX 1003.1, является то, что их среда исполнения работает на основе однопроцессной многопоточной модели, в которой адресные пространства потоков не изолированы друг от друга (unprotected memory between threads). Такая среда является всего лишь частным случаем многопроцессной модели, определяемой в POSIX, и она не поддерживает функцию fork(). ОС QNX Neutrino, наоборот, использует возможности работы с MMU-оборудованием для обеспечения полнофункциональной POSIX-модели в защищенной среде.

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

Рис. 1.1. Обычные исполнительные модули реального времени не обеспечивают защиту памяти

Рис. 1.2. В монолитной ОС системные процессы не защищены

Рис. 1.3. Микроядро обеспечивает полную защиту памяти

Первая версия ОС QNX была выпущена в 1981 г. В каждой последующей воплощался тот опыт, который был получен при создании предыдущих версий, и поэтому ОС QNX Neutrino является на сегодняшний день самой мощной и масштабируемой операционной системой, которая способна обеспечить максимальную производительность, используя минимальные ресурсы.
Операционная система как организованный набор процессов
ОС QNX Neutrino строится на основе компактного микроядра, способного управлять группой взаимодействующих процессов. Как видно на рис. 1.4, структура операционной системы больше напоминает "слаженную команду", чем иерархию, так как несколько равноправных "игроков" взаимодействуют в ней между собой посредством координирующего ядра.

 

Рис. 1.4. Архитектура ОС QNX Neutrino

ОС QNX Neutrino действует как своего рода "программная шина", позволяющая динамически присоединять/отсоединять модули ОС по мере необходимости.
Истинное ядро
Ядро — это сердце любой операционной системы. В некоторых системах "ядро" несет столько функций, что оно уже само по себе является целой операционной системой!

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

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

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

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

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

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

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

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

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

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

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

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

Например, в критически важных средах приложения, предназначенные для управления устройствами ввода/вывода в реальном масштабе времени, могут потребовать от операционной системы повышенной производительности, в отличие от таких менее важных приложений, как, например, веб-браузер. Компьютерная сеть на основе ОС QNX Neutrino достаточно гибка, чтобы поддерживать оба типа приложений одновременно благодаря тому, что операционная система позволяет оптимально распределять вычислительные мощности между системными устройствами, не жертвуя при этом совместимостью с приложениями рабочего стола. Более того, функции обеспечения работы в реальном масштабе времени (как, например, наследование приоритетов (priority inheritance)) интегрированы во всю компьютерную сеть на основе QNX Neutrino и действуют на всех ее уровнях независимо от того, какая среда передачи используется (волоконно-оптическая связь, последовательное соединение и т. д.).
Гибкие сетевые возможности
Компьютерные сети на основе ОС QNX Neutrino могут быть объединены c помощью различного оборудования и стандартных протоколов. Благодаря их полной прозрачности для прикладных программ и пользователей, архитектура ОС может быть легко изменена в любой момент без нарушения ее работы.

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

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

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