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

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

Системы реального времени: от Linux к Java

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

Потребность в системах реального времени существует уже давно, но, как правило, эти системы создавались для решения частных задач конкретных заказчиков, а потому требовали специализированного аппаратного обеспечения и операционных систем. Такие решения нельзя назвать гибкими, а расходы на их создание и поддержание всегда были очень высокими. Обычные операционные системы (например, Unix и Linux) для решения задач реального времени традиционно не использовались – их технические характеристики не позволяли гарантировать отклик за заданное время:

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

Для разработки систем реального времени обычно использовались языки ассемблера, Cи, C++, Ада, что предполагало наличие высококвалифицированных специалистов. Приложения реального времени довольно сложно использовать повторно и переносить на другие платформы.

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

Открытый код для реального времени

Современные системы реального времени вроде QNX и VxWorks обладают значительной универсальностью, однако сегодня все больше решений строится на основе открытых стандартов и открытого программного обеспечения. Корпорация IBM уже более пяти лет интегрирует свои разработки и инновации в продукты категории Open Source. Операционная система Linux поддерживается множеством компаний и разработчиками по всему миру, и, используя ее, можно не бояться попасть в зависимость от отдельного поставщика аппаратного или программного обеспечения.

Операционная система Linux изначально не проектировалась как система реального времени, и для ее применения в этом качестве требуется провести серьезные исследования, тем не менее уже существует несколько дистрибутивов Linux, поддерживающих расширения реального времени: дистрибутивы компаний IBM,  RT Linux от Novell и Red Hat.

В RT Linux реализованы таймеры высокой точности: для представления системного времени теперь используется 64-битная величина, позволяющая хранить время с наносекундной точностью. Код управления таймерами и системным временем полностью переписан, и теперь не допускается возникновение задержек, превышающих несколько микросекунд.

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

Важная функция наследования приоритетов позволяет решить проблему инверсии приоритетов. Инверсией приоритетов называют ситуацию, когда процесс с низким приоритетом блокирует объект, требуемый процессу с высоким приоритетом. Проблема в том, что низкоприоритетный процесс никак не может освободить блокировку, так как диспетчер отправляет на исполнение другие процессы со средним приоритетом, а ожидающий процесс с высоким приоритетом вынужден простаивать. При наследовании приоритетов приоритет первого процесса повышается на время, пока он блокирует процесс с более высоким приоритетом. Большое внимание в RT Linux уделено планированию в симметричных многопроцессорных системах. Если задача предсказуемого планирования на одиночном процессоре решается легко — достаточно только выбрать самый приоритетный процесс из очереди планировщика, то в многопроцессорных системах такая очередь существует уже для каждого процессора. Ядро операционной системы должно регулярно «пересматривать» очереди, чтобы обеспечить первоочередное выполнение потоков с высоким приоритетом на любом из процессоров.

Некоторые изменения в операционной системе требуют также аппаратной поддержки. К примеру, многие современные серверы используют прерывания по управлению системой (System Management Interrupt, SMI), связанные с ошибками оборудования и управлением питания. Эти прерывания обладают непредсказуемой латентностью и потому сложно сочетаются с работой систем реального времени. Некоторые аппаратные платформы, такие как серверы-лезвия IBM, были специально модифицированы для работы с системами реального времени, и основная часть SMI-прерываний обрабатывается в BIOS и других аппаратных контроллерах в обход основной ОС.

Системы реального времени на Java

Простые в освоении языки программирования высокого уровня, такие как Java, никогда всерьез не рассматривались для систем реального времени:

  • потоки на Java так же сложно планировать в условиях реального времени, как и процессы в обычных операционных системах;
  • сборка мусора, обеспечивающая базовую функциональность Java, обычно прерывает выполнение других потоков;
  • загрузка классов в процессе исполнения программ вносит непредсказуемость, так же как и компиляция в ходе выполнения программ (just-in-time compilation).

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

Все это послужило стимулом для новой разработки WebSphere Real-Time Java (WRT) – виртуальной Java-машины, основанной на технологии IBM J9, содержащей уникальную функциональность для полноценной поддержки систем жесткого и мягкого реального времени. WRT поддерживает Java 2 Standard Edition версии 5, включая стандартную библиотеку классов Java. WRT реализует спецификацию Java реального времени (JSR 1), обеспечивая интерфейс для потоков реального времени и различных схем управления памятью в условиях производительности реального времени. Cборщик мусора Metronome, разработанный в Исследовательском центре IBM им. Томаса Ватсона, позволяет настраивать сборку так, что прерывания исполнения программы на Java не превышают одной микросекунды. WRT поддерживает компиляцию в ходе исполнения программ в условиях реального времени и содержит набор утилит для диагностики и оптимизации кода.

Приложение реального времени в WRT может строиться как на базе стандартных классов Java, так и на расширениях реального времени. При этом старый код можно не переписывать, а только частично перекомпилировать в новом окружении (рис. 2).

Системы реального времени: от Linux к Java

Традиционные сборщики мусора для Java – один из источников непредсказуемого поведения программ. Сборка мусора прерывает исполнение программ в момент, когда достигается определенный уровень использования памяти, и в это время программа уже не сможет гарантированно отреагировать на важное внешнее событие. Сборщик мусора Metronom – всего лишь один из процессов, который планируется в системе наравне с другими (рис. 3). Сборщик запускается с заданными временными интервалами и гибким уровнем использования процессорного времени, так что полностью удовлетворяет требованиям систем реального времени. При этом не нужны дополнительные внешние схемы выделения памяти, что позволяет лишь заменить сборщик мусора и обойтись без полной пересборки программ на Java.

Системы реального времени: от Linux к Java

Еще одно важнейшее улучшение виртуальной Java-машины – реализация спецификации Real-Time Specifications for Java (RTSJ, или JSR 1), которая расширяет функциональность Java для решения задач реального времени. Обычный планировщик Java не использует информацию о приоритетах потоков, что делает планирование непредсказуемым. В реализации RTSJ от IBM поддерживается приоритет потоков, так же как и наследование приоритетов (решение, аналогичное механизму в ядре RT Linux). В WRT реализованы потоки реального времени: с поддержкой приоритетов, заданными интервалами реакции системы, доступом к внешним областям памяти и обнаружением блокировок. Существует возможность запуска потоков реального времени без доступа к куче, за счет чего можно отказаться от прерывания исполнения таких потоков сборщиком мусора. В системах реального времени такие потоки могут использоваться для задач с самыми серьезными требованиями к латентности. Для выделения памяти в этих потоках используется специальная «бессмертная» область памяти, для которой не действует сборщик мусора.

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

Таким образом, приложения на базе WebSpere Real-Time Java могут существенно упростить создание и поддержку систем реального времени. Полное решение для систем реального времени от IBM включает в себя серверы-лезвия IBM на платформе x86-64, операционную систему реального времени RT Linux (дистрибутив IBM, Red Hat MRG или Novell SLERT), виртуальную машину и среду разработки WebSphere Real-Time Java.

Алексей Федосеев (alexey_fedoseev@ru.ibm.com) — специалист по решениям на Linux компании IBM (Москва).


Linux реального времени

Компактные специализированные системы реального времени, такие так VxWorks, OS-9, PSOS, QNX и LynxOS, обладают всеми необходимыми для решения своих задач качествами, однако имеются такие задачи, для решения которых требуется поддержка реального времени, но недопустимы большие затраты на разработку. В этих случаях сообщество разработчиков Linux предлагает специальные расширения, такие как RTLinux, KURT или UTIME.

ОС РВ на службе в авиации

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