1.QNX и Unix - краткий обзор различий
2. Цели проекта Neutrino
3. Архитектура микроядра Neutrino
4. Объекты и сервис микроядра
5. Практические аспекты применения системы
Заключение
Литература

Прошло несколько лет со времени появления первых 32-битных операционных систем для процессоров Intel. Тогда было много спекуляций о том, какая из них станет "основной" и затмит все остальные. И что же? Windows 95 занимает первую строчку в рейтингах продавцов, но ее ограниченность общеизвестна. Windows NT увеличила свою популярность, и многие пытаются использовать ее как единую ОС для всех задач, но это далеко не всегда оправданно. OS/2 также сделала заметный рывок. Начал выделяться Linux - лидер в мире Unix. Тем не менее, ни одна из этих систем по-прежнему не способна справляться с задачами промышленной автоматизации, объем которых в последние годы растет очень стремительно. Причина, на мой взгляд, заключается в том, что большинство систем страдает (в разной степени) одним общим недостатком - неэффективный дизайн, из-за которого мощность новых процессоров расходуется в значительной степени на новую более "раздутую" ОС, большая часть функций которой не нужна в каждом конкретном случае.

Два года назад в статье о системе QNX [1] я писал, что она быстро развивалась, превращаясь из узкоспециализированной ОС для систем реального времени в более-менее универсальную систему. Однако ее разработчики отказались от попыток "добавить еще одну функцию" в QNX, поскольку этот путь ведет в тупик. Никому не нужна еще одна эклектичная система, отягощенная грузом устаревших решений. Еще до появления Windows 95, стартовал проект создания совершенно новой ОС, которая не наследуя устаревшую кодовую базу, могла бы воплотить в себе лучшие идеи, разработанные в теории операционных систем. Этот проект получил кодовое название "Neutrino", довольно удачно отражающее его суть - очень маленькая и неуловимо быстрая ОС. Данная статья является попыткой ответа на вопрос "Что такое Neutrino?", и, что более интересно, зачем она была создана и в чем ее отличие от QNX.

1.QNX и Unix - краткий обзор различий

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

1.1. Что такое QNX?

С точки зрения пользовательского интерфейса и API, эта ОС очень похожа на Unix. Если вы знакомы с Unix на уровне пользователя, то вероятно сможете работать с QNX без проблем - в ней присутствует практически весь набор стандартных утилит и сохраняется большая часть семантики. Конечно, есть и X Window, равно как и TCP/IP. Если вы программист, знающий Unix, то для вас не составит большого труда перенести собственные или GNU/Free-приложения в QNX. Например, Apache и Mosaic хорошо демонстрируют степень совместимости API.

Однако QNX - это не версия Unix. Она была разработана с нуля и построена на совершенно других архитектурных принципах, но с учетом группы стандартов POSIX, которые возникли в результате обобщения существующей практики в различных версиях системы Unix. Разработка ведется канадской фирмой QNX Software Systems Limited (далее - QSSL) [2].

1.2. Чем QNX отличается от Unix?

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

  • Предсказуемость, означающую ее применимость к задачам жесткого реального времени. Ни одна версия Unix не может достичь подобного качества, поскольку нереентрабельный код ядра слишком велик. Любой системный вызов в Unix может привести к непредсказуемой задержке. То же самое относится к Windows NT, где реальное время заканчивается между ISR (первичный обработчик прерывания) и DPC (вызов отложенной процедуры).
  • Масштабируемость и эффективность, достигаемую оптимальным использованием ресурсов и означающую ее применимость для встроенных (embedded) систем. В каталоге /dev нет огромной кучи файлов, соответствующих ненужным драйверам. Драйверы и менеджеры можно запускать просто из командной строки. И удалять (кроме файловой системы J) динамически. Можно иметь только тот сервис или те модули, которые реально нужны, причем это не требует серьезных усилий и не порождает проблемы.
  • Расширяемость и надежность одновременно, поскольку написанный вами драйвер не нужно компилировать в ядро, рискуя вызвать нестабильность системы. Менеджеры ресурсов (сервис логического уровня) работают в кольце 3, при этом можно добавлять свои, не опасаясь за систему. Драйверы работают в кольце 1 и могут вызвать проблемы, но не фатального характера. Кроме того, их достаточно просто писать и отлаживать. Например, постоянная головная боль разработчиков драйверов для Linux - получение физически непрерывного блока памяти для DMA-устройств - устраняется просто и элегантно, через функцию mmap().
  • Быстрый сетевой протокол FLEET, прозрачный для обмена сообщениями, автоматически обеспечивающий отказоустойчивость, балансирование нагрузки и маршрутизацию между альтернативными путями доступа. Он не так универсален, как TCP/IP, но гораздо проще в использовании и эффективнее.
  • Богатый выбор графических подсистем, включающий QNX Windows, X11R5 и Photon, что позволяет разработчикам выбирать ту, которая лучше подходит для их целей. Для типичных областей применения QNX традиционная система X11 слишком тяжеловесна, но система Photon, построенная на тех же принципах модульности, что и сама QNX, позволяет получить полнофункциональный GUI (типа Motif 2.0), работающий вместе с POSIX-совместимой ОС всего в 4 Мбайт памяти.

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

  • нет поддержки SMP;
  • нет своппинга виртуальной памяти на диск;
  • неэффективная и нестандартная поддержка нитей (threads);
  • нет поддержки Java (как следствие предыдущего пункта);
  • нет поддержки отображения файлов в память;
  • многочисленные ограничения файловой системы;
  • нет поддержки Unix-domain sockets;
  • слабые средства разграничения и контроля доступа пользователей;
  • отсутствие средств безопасности в рамках собственного сетевого протокола.

    Хотя этот список содержит достаточно важные пункты, не все они являются критичными для рынка QNX, поскольку она не проектировалась для конкуренции с Unix. Но, что гораздо более важно, некоторые пункты этого списка, а также другие ограничения QNX, являются серьезными недостатками с точки зрения теории систем реального времени. И это притом, что QNX является лидером этого рынка!

    1.3. QNX и системы реального времени

    Что же это за недостатки? Чтобы понять, нужно определить требования к ОС, предназначенной для реализации систем реального времени. Именно этот смысл я вкладываю в общеупотребительный термин "ОС реального времени" (Real Time OS). Использование какой-либо ОС еще не гарантирует получения результата. Можно взять любую ОС такого типа и создать на ее базе некую систему, предназначенную для работы в реальном времени (далее - "система реального времени"), но не способную на это фактически. Чем отличается система реального времени? Есть два основных требования.

  • Система должна реагировать на события, успевая обработать их за фиксированное время или к фиксированному моменту времени (далее - "временные рамки").

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

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

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

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

    1. ОС должна поддерживать вытесняющую многопоточность (preemptive multi-threading) и мультипроцессорные архитектуры.

    2. Аппаратная архитектура должна поддерживать несколько уровней прерываний (interrupt levels), а ОС должна обеспечивать вытеснение (preemption) обработчиков прерываний.

    3. Каждая нить управления (thread) должна иметь способ выражения собственной важности. В идеале планировщик должен предоставлять процессор той нити, у которой осталось меньше всего времени до исчерпания своих временных рамок (алгоритм, известный как EDF - Earliest Deadline First). Но учитывая сложность реализации такой схемы, можно ограничиться наличием приоритетов у нитей, при условии поддержки достаточно большого количества уровней приоритетов.

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

    5. Поведение самой ОС после системных вызовов и наступления событий должно быть предсказуемо и известно заранее. Это означает, что разработчики ОС должны специфицировать такие временные характеристики, как "задержка обработки прерывания" (interrupt latency), максимальное время маскировки прерываний, а также максимальное время исполнения всех системных вызовов.

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

    7. Стоимость системы при массовых тиражах должна быть достаточно низкой.

    8. ОС должна обеспечивать API и "нижележащий" сервис, соответствующий по структуре и реализации требованиям систем реального времени.

    Немногие ОС способны выполнить хотя бы часть этих требований, хотя не все из них одинаково важны. Например, Windows NT, несмотря на ее более совершенную по сравнению с Windows 95 архитектуру, абсолютно не соответствует критическим требованиям 2 и 4 и весьма слабо - условимя, изложенным в п.п. 3, 5, 6, 7 и 8. В свою очередь заметим, что QNX так же не вполне отвечает всем требованиям. В частности, она имеет следующие серьезные недостатки:

  • неадекватная поддержка нитей и отсутствие поддержки симметричных мультипроцессорных архитектур (SMP);
  • ограниченное количество уровней прерываний (32);
  • отсутствие поддержки "наследования приоритетов" для механизмов синхронизации (семафоров);
  • неспособность работать на системах с объемом памяти менее 512 Kбайт, а с графическими возможностями потребности еще больше;
  • относительно высокие цены, даже при больших объемах закупок.

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

    Тем не менее, в перспективе, такую ситуацию нельзя признать удовлетворительной. По этим причинам и были в свое время начаты проекты Neutrino и Photon, призванные в конечном итоге образовать тандем, решающий все нынешние проблемы.

    2. Цели проекта Neutrino

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

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

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

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

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

  • Переносимость кода приложений и возможность использования широкой существующей кодовой базы. POSIX представляет собой идеальный стандарт для этой цели, поскольку он очень строго определяет интерфейсы, не накладывая ограничений на реализацию и предоставляя исчерпывающий набор тестов на совместимость.
  • Независимость приложений от используемого процессора и операционной системы. Уже сейчас перенос приложений, например с платформы SPARC/Solaris на x86/QNX, не представляет значительного труда. Neutrino должна сделать этот процесс практически безболезненным.
  • Переносимость средств разработки и наличие достаточного количества квалифицированных разработчиков для POSIX API.
  • Близость POSIX и Unix дает возможность совмещения системы разработки и runtime-системы, что позволяет разрабатывать и тестировать приложения еще до появления прототипа устройства, для которого оно предназначено.
  • Правительственные органы некоторых стран (например 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.

    3. Архитектура микроядра Neutrino

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

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

    3.1. Микроядро и наноядро

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

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

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

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

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

    3.2. Микроядро и дополнительные модули

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

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

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

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

    3.3. Альтернативная реализация дополнительного сервиса

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

    3.4. Расширения ядра и добавление новых системных вызовов

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

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

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

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

    3.5. Управление процессами и памятью

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

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

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

    И все же самое интересное - это управление памятью. Данный вопрос является достаточно болезненным, поскольку от его решения зависит очень многое. Решение, примененное в QNX, не было достаточно гибким. QNX 4.23 всегда использует виртуальную память, что не позволяет делать этого на некоторых типах 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.

    4. Объекты и сервис микроядра

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

    4.1. Процессы и нити: диспетчеризация и синхронизация

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

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

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

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

    4.2. Модель событий и средства обмена сообщениями

    Модель событий 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).

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

    4.3. Системные часы и таймеры

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

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

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

    4.4. Обработка прерываний

    Этот пункт является одним из самых сложных при разработке ОС для системы реального времени, поскольку необходимо выполнить множество плохо согласующихся требований. 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). Заметим, что поскольку механизм системных вызовов основан на программных прерываниях, работающих так же, как и аппаратные, обработка системных вызовов происходит идентично обработке прерываний - вытеснение процессов при обработке прерываний и системных вызовов происходит одинаково быстро.

    5. Практические аспекты применения системы

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

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

    5.1. Графическая подсистема 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.

    Версия системы Photon для Neutrino существует в стадии бета-тестирования, и уже доступна для пользователей.

    Короче говоря, изначальная "сырость" системы в значительной степени ликвидирована. C выходом версии 1.12 она сможет конкурировать с системами типа Windows CE и другими, ориентированными на применение в миниатюрных устройствах.

    5.2. Сетевой сервис и файловая система

    Сетевой сервис в 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)

    5.3. Средства разработки и совместимость

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

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

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

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

    5.4. Средства работы с 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).

    Для демонстрации возможностей этой технологии на WEB-сервере QSSL появилась новая страничка - QNX Demo Disk. Любой желающий может скачать образ 1,44 Мбайт дискеты, содержащей демонстрационную версию системы. С этой дискеты нужно загрузиться; жесткий диск не используется, необходимо лишь 6 Мбайт оперативной памяти. Эта дискета содержит: многозадачную POSIX-совместимую 32-битную ОС, средства доступа к Internet (TCP/IP, графическая программа для соединения с ISP), графическую оболочку Photon, Web-броузер Voyager, Web-сервер, через который можно смотреть документацию, текстовый редактор (с поддержкой шрифтов и цвета), браузер файловой системы, программу векторной анимации. Запустив десяток копий программы анимации (одновременно с остальным), можно увидеть чем отличается эффективный дизайн от неэффективного. Следует заметить, что для создания этой дискеты использована пока система QNX, а не Neutrino, что не помешало разработчикам "уместить" все.

    Фирма Intel предустанавливает демонстрационную версию системы QNX с графической оболочкой Photon и комплектом Internet Appliance Toolkit на платформу EXPLR2, предназначенную для разработки и отладки встроенных систем. Желающие могут получить бесплатную документацию на платформу (Design Reference Kit, в том числе в электронном виде) от фирмы Intel, обратившись на ее WEB-сервер.

    Заключение

    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. Однако разработчики заявляют, что будет обеспечена 100% переносимость приложений из QNX в Neutrino. На данный момент это еще не осуществлено, но в принципе возможно, включая и бинарную совместимость. Кроме того, система еще не полностью закончена, ориентировочный срок выхода полной версии Neutrino - середина 1998 года.

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

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

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

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

Тем не менее "классическая" ветвь QNX4 в какой-то мере пока продолжает развиваться, совершенствуя свои качества. По заявлениям представителей QSSL, в дальнейшем будет происходить "миграция" технологий между двумя ветвями (QNX4 и Neutrino), с тем чтобы в конце концов обеспечить плавное и безболезненное слияние к тому моменту, когда Neutrino будет готова заменить QNX в системах высокого уровня. Неясно пока, сможет ли Neutrino конкурировать с традиционными Unix-системами или Windows NT на рынке высокопроизводительных серверов и станет ли она "Святым Граалем" для широкого круга пользователей, но на рынке встроенных систем реального времени ее ждет несомненный успех.

Всем, кого интересует эта тема, я рекомендую посетить Web-сервер фирмы QSSL [2], где можно прочитать также о практическом применении системы QNX в самых разнообразных проектах. Дополнительная информация, в том числе и другие мои статьи, доступна на сервере [3], а также на сервере [4]. 

АО "ИнфоМаркет", С.-Петербург infoh@mail.wplus.net


 

Литература

[1] И. Коваленко "QNX - Золушка в семье UNIX", Открытые системы, # 2, 95, с. 58-65.

[2] http://www.qnx.com

[3] http://www.infomarket.ru

[4] http://www.swd.ru