Помощь в написании студенческих работ
Антистрессовый сервис

Проект Neutrino. 
Операционные системы реального времени и Windows

РефератПомощь в написанииУзнать стоимостьмоей работы

Следует отметить, что богатый набор функций, реализованный в соответствии со стандартами POSIX, уже сейчас делает Neutrino весьма привлекательной альтернативой существующим решениям. Исследования рынка систем реального времени показали, что для систем с жесткими ограничениями ресурсов все еще широко используются различные исполняющие системы (realtime executive) c нестандартизированным API… Читать ещё >

Проект Neutrino. Операционные системы реального времени и Windows (реферат, курсовая, диплом, контрольная)

Еще до появления Windows 95, стартовал проект создания совершенно новой ОС, которая не наследуя устаревшую кодовую базу, могла бы воплотить в себе лучшие идеи, разработанные в теории операционных систем. Этот проект получил кодовое название «Neutrino», довольно удачно отражающее его суть — очень маленькая и неуловимо быстрая ОС.

Все проблемы QNX можно коротко выразить тремя пунктами:

  • — недостаточная согласованность с требованиями POSIX к системам реального времени;
  • — невозможность применения на встроенных системах с ресурсами 64 Kбайт — 512 Kбайт;
  • — невозможность применения на системах высшего уровня (SMP-серверах).

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

При этом была еще одна цель: добиться независимости кода приложений от характера целевой системы. То есть код для «тостера» должен быть бинарно совместим с кодом для SMP-сервера. Такого рода система должна быть гибкой, эффективной и универсальной.

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

  • 1. Переносимость кода приложений и возможность использования широкой существующей кодовой базы. POSIX представляет собой идеальный стандарт для этой цели, поскольку он очень строго определяет интерфейсы, не накладывая ограничений на реализацию и предоставляя исчерпывающий набор тестов на совместимость.
  • 2. Независимость приложений от используемого процессора и операционной системы. Уже сейчас перенос приложений, например с платформы SPARC/Solaris на x86/QNX, не представляет значительного труда. Neutrino должна сделать этот процесс практически безболезненным.
  • 3. Переносимость средств разработки и наличие достаточного количества квалифицированных разработчиков для POSIX API.
  • 4. Близость POSIX и Unix дает возможность совмещения системы разработки и runtime-системы, что позволяет разрабатывать и тестировать приложения еще до появления прототипа устройства, для которого оно предназначено.
  • 5. Правительственные органы некоторых стран (например CША) считают совместимость с POSIX очень важной. Даже более важной, чем сертификацию по классу С2, поскольку POSIX-сертифицированная система неявно обладает достаточными средствами защиты.

Впрочем, POSIX — это большая группа стандартов, а термин «Neutrino», если говорить конкретно, применяется на данном этапе не ко всей ОС, а лишь к ее микроядру. Это микроядро будет совместимо, в частности, со следующими стандартами POSIX:

  • — 1003.1, 1003.1a,
  • — 1003.1b Realtime,
  • — 1003.1c Threads,
  • — 1003.1d Realtime Extensions,
  • — 1003.13 Realtime Profile Support.

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

Архитектура микроядра Neutrino. Указанные цели продекларировать гораздо легче, чем их достичь. Например, идея реализации ОС для систем реального времени с интерфейсом POSIX существует давно, но никому этого пока не удавалось сделать. POSIX-системы имеют репутацию «раздутых», поскольку они ассоциируются в первую очередь с Unix. В некотором смысле, Neutrino является доказательством возможности существования компактной POSIX-системы. операционный windows синхронизация neutrino.

Для достижения этих целей недостаточно было просто косметической модернизации микроядра QNX. Neutrino представляет собой значительно более совершенную модель, выполняющую гораздо больше функций, чем микроядро QNX, имея при этом лучшую производительность и временные характеристики. Улучшенное микроядро позволило также вчетверо уменьшить размер менеджера процессов (с 80 до 20 Кбайт), уменьшив таким образом их суммарный размер почти вдвое.

Микроядро и наноядро. Очевидно, расширение функций привело к увеличению размера микроядра с 10 до 28 Кбайт. Однако его содержимое теперь лучше структурировано. Фактически, в нем выделилось «наноядро», обеспечивающее поддержку фундаментальных объектов микроядра, которое в свою очередь поддерживает базовый сервис для пользовательских нитей и дополнительных системных модулей.

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

По этой причине Neutrino остается достаточно маленьким и простым и по-прежнему оправдывает название «микроядра». Например, Neutrino поддерживает понятие нити, работающей в контексте процесса, но не может создавать процессы. В микроядре вообще нет кода, предназначенного для управления виртуальной памятью, необходимой для реализации защиты процессов. Такое решение объясняется тем, что некоторые системы реального времени предъявляют более жесткие требования к размеру и скорости исполнения кода, чем к защите, поскольку имеют контролируемую среду исполнения. Кроме того, некоторые процессоры вообще не поддерживают механизм виртуальной памяти. А на процессорах с архитектурой, отличной от x86, все вообще выглядит иначе. Так что такой подход повышает модульность и эффективность системы, а также упрощает ее перенос на другие платформы.

Все системные вызовы Neutrino могут вытесняться при необходимости, чтобы обработать вызов от нити с более высоким приоритетом, причем даже в процессе передачи сообщений. Это качество микроядра, а также его сравнительная простота и малый размер, позволяют минимизировать невытесняемые последовательности кода в системе. В свою очередь, за счет этого улучшаются временные характеристики системы. Скромные требования к памяти упрощают разработку встроенных систем низшего уровня. Кроме того, это уменьшает количество блокировок в коде (spin-locks), необходимых для поддержки мультипроцессорных архитектур, что упрощает реализацию SMP и повышает эффективность использования дополнительных процессоров. Улучшаются также характеристики ОС, необходимые для построения систем высокого уровня.

По заявлениям QSSL, бета-тестирование SMP Neutrino продемонстрировало близкий к линейному рост производительности при добавлении дополнительных процессоров (до 8), при автоматической балансировке нагрузки. Многое в QNX и Neutrino «недостижимо». Кроме того, реализация SMP Neutrino допускает ручное распределение процессов между процессорами, что позволит добиться еще большей эффективности в контролируемой среде исполнения. Эта система уже вызвала большой интерес со стороны телекоммуникационных компаний, нуждающихся в сверхпроизводительных системах для реализации мощных коммутационных систем.

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

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

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

А что, если для реализации системы ProcNto не подходит? Neutrino предоставляет разработчикам целый спектр решений на этот случай.

Альтернативная реализация дополнительного сервиса. Менеджер процессов ProcNto представляет собой набор нитей, исполняющихся в адресном пространстве микроядра, и отвечает за управление памятью, поддержку пространства имен и создание новых процессов. Не всегда эти функции бывают нужны одновременно. Например, встроенной системе, использующей фиксированный набор процессов, «зашитых» в ядро, вряд ли понадобятся функции создания новых процессов, с поддержкой различных форматов. Поэтому, несмотря на свой малый размер, ProcNto может оказаться нецелесообразно велик. В таких случаях разработчик системы может реализовать самостоятельно альтернативный вариант, в котором вместо ProcNto используется его собственный код, связанный с опреденной библиотекой, содержащей упрощенные заменители для минимально необходимого набора функций. Так, например, можно переопределить реализацию функций open (), read () и write () — если это все, что необходимо для системы.

Расширения ядра и добавление новых системных вызовов. Еще одно новшество микроядра Neutrino заключается в поддержке расширений (еxtensions). Код Neutrino содержит различные таблицы переходов, которые могут быть переопределены в момент исполнения любой нитью, работающей в адресном пространстве микроядра. Эти таблицы могут указывать на адреса функций в любой другой нити. Например, ProcNto использует этот механизм для замены примитивных функций управления памятью, содержащихся в Neutrino, на более сложные, позволяющие выполнять операции с множественными виртуальными адресными пространствами, соответствующими различным процессам. Само микроядро не содержит кода, способного работать с виртуальной памятью, чтобы не обременять системы, которые этот механизм не поддерживают или не используют.

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

Neutrino также содержит специальную точку входа, через которую нити, исполняющиеся в адресном пространстве микроядра, могут передавать ему адреса функций. Затем микроядро вызывает эти функции со своим контекстом. Этот механизм используется менеджерами сети для того, чтобы выполнять манипуляции объектами микроядер на различных узлах от их собственного имени. Это и позволяет добиться полной прозрачности сетевого взаимодействия в QNX/Neutrino, поскольку исчезает разница между локальным и удаленным исполнением программы. Сеть Neutrino превращается в «виртуальный компьютер», позволяя создавать высокопроизводительные кластерные SMP-системы.

Наконец, привилегированные нити могут определять и регистрировать в микроядре новые системные вызовы, расширяя его функциональные возможности.

Управление процессами и памятью. Как уже отмечалось, управление процессами и памятью не является, строго говоря, функцией Neutrino — это функция менеджера процессов ProcNto, который, кроме этого, занимается поддержкой пространства имен ввода/вывода и еще рядом «мелочей». Однако обзор был бы неполным без рассмотрения данного вопроса.

Прежде чем управлять процессами, необходимо иметь возможность загружать их с какого-либо носителя. С этой целью в состав ProcNto также входят «нить заргузчика» и «нить терминатора». Нить загрузчика обеспечивает загрузку исполняемых модулей в формате ELF, QNX4 и shell-скриптов. Формат ELF (известный также как Evil Linkage Format J) является для Neutrino стандартным, поскольку он обеспечивает ряд преимуществ, таких как поддержка динамического связывания, и, что очень важно для встроенных систем, совместим со спецификацией XIP (eXecute-In-Place), предусматривающей исполнение кода прямо из ROM, без загрузки в RAM. Нить терминатора обеспечивает «уборку мусора» после завершения процессов, на тот случай, если они не смогли сделать это сами.

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

И все же самое интересное — это управление памятью. Данный вопрос является достаточно болезненным, поскольку от его решения зависит очень многое. Решение, примененное в QNX, не было достаточно гибким. QNX всегда использует виртуальную память, что не позволяет делать этого на некоторых типах Intel-совместимых процессоров, довольно широко применяемых во встроенных сиcтемах, например производства National Semiconductor или AMD, поскольку они не содержат Paged-MMU (устройство управления виртуальной памятью). Кроме того, зависимость микроядра от специфичной для x86 аппаратуры MMU затрудняет перенос системы на другие платформы.

В результате Neutrino принимает соломоново решение — предоставить выбор модели защиты памяти разработчикам. Код Neutrino не использует MMU или виртуальную память в явном виде. Это достигается за счет выноса функции инициализации MMU во внешний модуль (mmuon) и выноса функций управления виртуальной памятью в расширения микроядра, обеспечиваемые ProcNto. Для поддержки MMU модуль mmuon нужно включить в ядро, после чего менеджер процессов сможет поддерживать виртуальную память. Этот модуль не является «сервером», он выполняет инициализацию процессора и немедленно завершает свою работу. Сам менеджер процессов также существует в нескольких вариантах, соответствующих типу защиты памяти. Таким образом, Neutrino/ProcNto поддерживает 4 варианта управления памятью, от полного отсутствия защиты до предоставления каждому процессу собственного виртуального адресного пространства в 4 Гбайт. В будущем появится также версия ProcNto, поддерживающая своппинг виртуальной памяти на диск, что может оказаться желательным для некоторых систем верхнего уровня.

Вариант 1. Физическая память. Все нити перемещаются при построении системы в адреса, расположенные в адресном пространстве Neutrino. Менеджер процессов обычно отсутствует. Это типичная конфигурация, которую предоставляют различные realtime executive, но отличие Neutrino в том, что она пытается даже в этой модели памяти выполнять (насколько это возможно) функцию mmap (), что позволяет обходиться без изменения исходного кода системы при смене модели памяти.

Вариант 2. Защита «системных» нитей от пользовательских. В этой модели нити, работающие в адресном пространстве Neutrino (это обычно ProcNto, менеджер сети или определенная разработчиком нить), защищены от остальных нитей, но последние не защищены друг от друга. Защита обеспечивается аппаратно MMU, путем маркировки страниц как «системных» и «пользовательских» .

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

Вариант 4. Виртуальная память. В этой модели каждый процесс имеет собственное адресное пространство, начинающееся с адреса 0 и защищенное от остальных процессов. Нити процесса делят с ним одно адресное пространство. Системное адресное пространство Neutrino также защищено от остальных процессов. Защита поддерживается аппаратурой Paged-MMU и реализуется соответствующей версией ProcNto.

Объекты и сервис микроядра. Neutrino поддерживает 48 системных вызовов (QNX — 14), обеспечивающих нити, передачу сообщений, сигналы, системные часы и таймеры, обработку прерываний и механизмы синхронизации нитей.

Процессы и нити: диспетчеризация и синхронизация. Neutrino поддерживает модель нитей POSIX 1003.1с, в соответствии с которой процесс может динамически создавать и уничтожать одну или более нитей. Разработчики могут по своему выбору использовать для работы с нитями либо API Neutrino, либо стандартную библиотеку pthreads.

Этот же стандарт определяет, что нити должны иметь собственные уровни приоритетов. Neutrino к моменту выхода окончательной версии будет поддерживать 256 уровней, причем каждая нить может также иметь собственный алгоритм диспетчеризации, список которых традиционен для QNX (и определен POSIX) — round-robin, FIFO и адаптивный.

Разумеется, поддержка нитей подразумевает также, что они могут делить общие данные. Для обеспечения синхронизации Neutrino поддерживает два механизма: условные переменные (condvars) и блоки взаимного исключения (mutexes). Для этих объектов микроядро поддерживает механизм наследования приоритетов.

Реализация mutexes отличается высокой эффективностью. Получение или освобождение несвязанного объекта типа mutex требует выполнения всего одного кода. Для сравнения, в Windows NT эта операция может занимать время до 700 мс.

Модель событий и средства обмена сообщениями. Модель событий Neutrino представляет собой еще одно значительное достижение этой системы. Учитывая сложность и многообразие форм событий и способов уведомления о них, реализация такой системы в каждой паре «клиент-сервер» может занять значительный объем кода и затруднить разработку надежной модели взаимодействия. Поэтому Neutrino использует другой подход, называемый event steering, при котором сервер может передать микроядру форму уведомления клиента, которую он у него запросил.

Практически нити получают уведомления от одного из трех типов источников: сообщение от другой нити, прерывание или таймер. События существуют в форме синхронных сообщений, асинхронных пульсов, Unix или POSIX-сигналов, прерываний, а также специального особытия ForceReady, вызывающего безусловный переход нити в состояние Ready без доставки какого-либо события. Механизм event steering работает следующим образом:

  • 1. Клиент посылает серверу сообщение, содержащее структуру с описанием желаемого механизма уведомления;
  • 2. Сервер регистрирует эту форму в микроядре и отвечает клиенту, выводя его из блокировки.
  • 3. Когда возникает необходимость в уведомлении клиента, сервер посылает ему сообщение, а микроядро транслирует его в заказанную форму.

Сигналы в Neutrino поддерживаются в двух разновидностях: классические сигналы Unix и real-time сигналы POSIX, c которыми можно передавать короткую порцию данных (4 байт). Еще одно различие между ними заключается в том, что сигналы POSIX при поступлении к процессу буферизуются, пока какая-либо из нитей процесса не проявит к ним интерес. Neutrino расширяет семантику POSIX тем, что такое поведение можно заказать выборочно для любого сигнала, в том числе для стандартных сигналов Unix. Кроме того, Neutrino позволяет адресовать сигнал к конкретной нити внутри процесса, а не просто к процессу.

Сообщения являются классическим механизмом QNX, который сохранился и в Neutrino, но несколько расширился и усложнился. Помимо синхронных сообщений Neutrino поддерживает короткие асинхронные сообщения, называемые «пульсами» (Pulses), позволяющие передать 4 байт данных и реализованные на той же основе, что и сигналы POSIX. Пульсы представляют собой заменитель недостаточно гибкого механизма Proxy, применяемого в QNX.

Введение

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

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

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

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

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

Обработка прерываний. Этот пункт является одним из самых сложных при разработке ОС для системы реального времени, поскольку необходимо выполнить множество плохо согласующихся требований. API обработки прерываний в достаточной степени соответствует предварительному стандарту POSIX 1003.1d. Модель обработки выглядит следующим образом.

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

К одному прерыванию можно присоединить несколько ISR, при этом они все будут вызваны. ISR должна вернуть управление по возможности быстро, отложив длительные операции для выполнения соответствующей нитью драйвера и информировав его об этом, например, с помощью пульса. Если возвращенное любой ISR значение указывает на то, что возникло некоторое событие, оно будет буферизовано. После вызова всех ISR микроядро завершает работу с программируемым контроллером прерываний и возвращает управление из прерывания. Однако возврат не обязательно происходит в то место, где оно произошло. Если одно из буферизованных событий вызвало переход более приоритетной нити в состояние READY, то управление будет возвращено в контекст этой нити. Основное отличие этой схемы от механизма ISR/DPC, используемого в Windows NT, заключается в том, что все DPC диспетчеризуются с одним и тем же уровнем приоритета, а это означает невозможность вытеснения одного DPC другим и приводит к непредсказуемой задержке обработки более приоритетных прерываний.

Описанная модель обеспечивает очень хорошие временные характеристики (interrupt latency и sheduling latency), поскольку Neutrino запрещает прерывания лишь на очень короткие промежутки времени, не зависящие от данных. Максимальное время задержки обработки прерывания можно вычислить на основании задержки, вносимой микроядром, и суммы времен исполнения всех ISR, назначенных для прерываний с более высоким аппаратным приоритетом.

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

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

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

Пригодность также не означает целесообразность, которая всегда зависит от конкретных факторов, играющих роль в том или ином проекте. Например для реализации Internet-сервера на базе QNX/Neutrino.

Графическая подсистема Photon. Существует несколько довольно известных операционных систем, пригодных для создания систем реального времени. Однако большинство из них неспособны решить проблему реализации графического интерфейса пользователя (GUI) для встраиваемых систем, поскольку представляют собой очень ограниченные по возможностям realtime executives. Те, что способны поддержать полноценный GUI, например RtLinux, не позволяют извлечь из этого практическую пользу, поскольку реализация традиционных GUI, типа X11, связана с очень высокими затратами ресурсов, особенно памяти.

Приступая к проекту Neutrino, его разработчики продумали и это. Для реализации GUI, пригодного к использованию во встраиваемых системах реального времени, был начат еще один параллельный проект — Photon. В результате появилась графическая подсистема, по внешнему виду и структуре пользовательского интерфейса очень похожая на X11/Motif, но весьма скромная по затратам ресурсов. Это стало возможным благодаря применению при ее разработке принципа модульности и ряда новых фундаментальных идей. Вот лишь наиболее существенные из них:

  • — расширенный набор оптимизированных драйверов, которые имеют теперь новую архитектуру, повышенное быстродействие (не используется int10) и обеспечивают поддержку режимов High Color и True Color для всех адаптеров. Список поддерживаемых адаптеров пополнился такими моделями, как Matrox Millenium, ATI Rage 3D/3DII, IBM XGA, Trident 9470;
  • — поддержка мобильных масштабируемых шрифтов формата Bitstream TrueDOC через фонт-сервер, обеспечивающий единую систему именования и отображения имен в шрифтовые файлы с учетом кодировки Unicode (UTF-8), а также низкоуровневый доступ к шрифтам из приложений;
  • — документация и средства разработки для файлов отображения клавиатуры, обеспечивающих поддержку клавиатуры любого национального языка, в том числе русского;
  • — новые виджеты, например PtHTML, PtTree, PtDivider, PtMenuBar, PtGrid, PtFontSel, RtProgress и ряд других, которые значительно перекрывают набор виджетов Motif 2.0;
  • — примеры исходного кода и документация для создания собственных виджетов и включения их в генератор приложений PhAB, который таким образом стал наконец расширяемым;
  • — набор новых приложений, включающий в себя File Manager, CD Player, Audio Player, Calculator, Personal Information Manager;
  • — графическая программа конфигурирования видеорежима;
  • — система XinPh, которая обеспечивает запуск системы X Window в окне системы Photon;
  • — фронт-процессор клавиатуры для поддержки азиатских языков (японский, китайский, корейский).

Бета-версия Photon 1.12 содержит ряд новых средств, включая:

  • — поддержку печати на принтерах PostScript, Epson и Hewlett-Packard, Canon;
  • — поддержку протокола Drag’n’Drop на уровне виджетов;
  • — новые виджеты (PtNumber, PtPrintSel, PtFileSelector и другие);
  • — универсальный драйвер видеоадаптеров класса VESA 2.0 (любые современные адаптеры, которые можно перевести в режим flat-memory);
  • — графический редактор текстов, поддерживающий кодировку Unicode;
  • — расширения API для поддержки новых возможностей Neutrino.

Сетевой сервис и файловая система. Сетевой сервис в Neutrino представлен только протоколом TCP/IP. Разработчики Neutrino хотели предоставить пользователям полный набор функциональных возможностей классического стека TCP/IP, но были вынуждены учитывать потребности рынка встроенных систем, для которых классическая реализация слишком велика и содержит много ненужных элементов. В результате они создали специальную версию стека для встроенных систем — Micro TCP/IP, который занимает всего около 40 Кбайт кода за счет ряда ограничений. Для тех же, кому нужны все возможности TCP/IP, например динамическая маршрутизация, будет предоставлен другой вариант, совместимый на 100% с BSD-sockets.

Neutrino также поддерживает сетевой протокол FLEET, используемый сейчас в QNX, с некоторыми усовершенствованиями, касающимися автоконфигурирования.

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

Собственно говоря, файловых систем в Neutrino много. Поддерживаются все файловые системы, имеющиеся в QNX, а также виртуальная файловая система Proc. Для обеспечения обмена данными с другими операционными системами Neutrino также поддерживает файловую систему CIFS (Common Internet File System), которая представляет собой обобщенный вариант SMB, способный использовать любой сервис имен (например DNS) вместо Netbios NS. Разумеется, все файловые системы реализованы с учетом возможности работы в ограниченных ресурсах, то есть очень компактно. Например, код для поддержки файловой системы Tiny QNX (POSIX) занимает всего 12 Кбайт, конечно за счет некоторых ограничений. Эта система способна читать разделы, созданные QNX4, но не может создавать жесткие ссылки и файлы с именами длиннее 16 символов (иначе говоря, не может писать в файл. inodes).

Средства разработки и совместимость. Для успеха любой операционной системы необходимо наличие высококачественных средств разработки приложений. В отличие от большинства систем Neutrino имеет свои собственные средства разработки вместо обычного компилятора GCC и связанных с ним программ. Однако эти средства ничуть не хуже, и они вполне стандартны — это компилятор Watcom C/C++ 10.6. Среда разработки включает все стандартные средства Watcom. Существует версия системы кросс-разработки приложений QNX/Neutrino под Windows NT, с использованием системы разработки Watcom. Таким образом, разработчики, привыкшие использовать Windows, могут больше не пересаживаться за QNX и пользоваться «кровавыми» командными строками.

Более того, система Willows предоставит возможность компиляции приложений, написанных с использованием API Win32 под QNX/Neutrino/Photon. При этом обеспечивается поддержка бинарных объектов (DLL от третьих фирм) и непосредственное исполнение приложений Windows через эмуляцию. Однако перекомпилированные приложения будут иметь преимущество в скорости (вероятно, они будут работать быстрее, чем в Windows) и смогут использовать одновременно API системы QNX/Neutrino для выполнения задач реального времени и обмена сообщениями.

Между тем компилятор GCC 2.7.2 был перенесен в QNX и в Neutrino. А также переносена стандартная библиотека C из Unix (libc). Эти программы предоставляются бесплатно и являются неплохим дополнением к системе разработки Watcom. Данный факт может сыграть ключевую роль в ускорении переноса приложений из Unix и включении QNX/Neutrino в список платформ, поддерживаемых разработчиками приложений для Unix.

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

Средства работы с Internet и разработка Internet-приложений. Ни одна современная ОС не может сегодня игнорировать «фактор Internet». В поддержке Internet нет ничего необычного, за исключением того, что и здесь нужно было учитывать основное требование встроенных систем — низкие затраты ресурсов. Сочетание QNX/Neutrino и графической системы Photon открывает совершенно новые возможности для рынка встроенных клиентских систем для Internet-устройств «карманного» размера (handheld devices). Фирма QSSL лицензировала WEB-browser фирмы Spyglass (на котором также основан MS Internet Explorer) и разработала комплект клиентских приложений для работы с Internet (Voyager Pro), включающий в себя Web-браузер, mail/news-клиент и графическую программу установления соединения с ISP.

Этот комплект доступен почти полностью с исходным кодом, под названием Internet Applliance Toolkit (IAT). Разработчики могут использовать этот код для создания модифицированных версий клиентских программ (browser, mail, news), оптимизированных под конкретные нужды. В результате разработчики получают уникальную возможность создавать встроенные системы с комплектом Internet-приложений за очень короткое время, поскольку все, что им потребуется — это модифицировать пользовательский интерфейс с помощью визуального средства разработки (Photon Application Builder).

Заключение

Neutrino — не единственная новая разработка в области операционных систем. Существует ряд других интересных проектов, некоторые из них построены на принципах, сходных с QNX (микроядро и обмен сообщениями), и пригодны для применения в системах реального времени. Такие системы, как L3/L4 и MkLinux, имеют также некоторые преимущества перед существующей версией Neutrino, например поддержку алгоритма диспетчеризации EDF и возможность исполнять приложения Linux (которых достаточно много). Тем не менее ни одна из этих систем не пригодна для применения во встраиваемых системах с ограниченными ресурсами, представляющими наибольший интерес для рынка систем реального времени.

Чем Neutrino отличается от QNX? Те, кто хорошо знаком с QNX, могут сделать вывод, что Neutrino имеет множество преимуществ, как-то:

  • — большая степень масштабируемости, как вниз, так и вверх;
  • — более высокая производительность, за счет улучшения архитектуры (нити);
  • — большее количество уровней приоритетов (256);
  • — новые средства синхронизации (condvars и mutexes) с поддержкой наследования приоритетов;
  • — отсутствие необходимости в BIOS;
  • — улучшенные средства асинхронного обмена (рulses);
  • — поддержка SMP;
  • — поддержка файлов, отображаемых в память;
  • — поддержка Unix-domain sockets и 100% совместимость с BSD-sockets;
  • — современный формат исполняемых модулей (ELF, с расширениями для сжатия);
  • — поддержка динамически связываемых библиотек (DLL);
  • — повышенный уровень безопасности (шифрование сообщений);
  • — усовершенствованная файловая система;
  • — поддержка виртуальной файловой системы Proc;
  • — мультиплатформенность (потенциальная);
  • — поддержка Java;
  • — расширяемость системы за счет подстановки системных вызовов;
  • — более гибкая цена, за счет более модульной структуры.

Обратная сторона медали? Перечисленные нововведения настолько глобальны, что они неизбежно должны привести к некоторой несовместимости с QNX 4.x.

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

На данный момент API двух платформ имеют значительные непересекающиеся части, однако представители QSSL утверждают, что эта ситуация будет улажена. Вероятно, тогда проблема несколько упростится. Уже сейчас в системе Photon, которая поддерживается для обеих платформ, появились функции, маскирующие различия между QNX и Neutrino (например proxy/pulses). Впрочем, это не решит всех проблем. Neutrino предлагает совершенно иную парадигму программирования, с сильным акцентом на использование многопоточности, поэтому для ее эффективного использования особую актуальность приобретет переобучение специалистов, привыкших к QNX4.

Следует отметить, что богатый набор функций, реализованный в соответствии со стандартами POSIX, уже сейчас делает Neutrino весьма привлекательной альтернативой существующим решениям. Исследования рынка систем реального времени показали, что для систем с жесткими ограничениями ресурсов все еще широко используются различные исполняющие системы (realtime executive) c нестандартизированным API и часто довольно бедными функциональными возможностями. Именно поэтому разработчики Neutrino приняли решение выпустить предварительную версию системы, не имеющую пока возможностей для масштабирования вверх, но уже пригодную для применения во встроенных системах. Не случайно фирма Intel с некоторых пор поддерживает очень хорошие отношения с QSSL и покупает лицензии на Neutrino в огромных количествах. Несмотря на наличие собственной ОС реального времени, Intel также официально объявила о том, что QNX/Neutrino является для нее «Realtime OS of preference» .

Показать весь текст
Заполнить форму текущей работой