Краткий обзор
Разработчики встраиваемых систем проявляют всё больший интерес к операционной системе Linux, что во многом обусловлено её моделью на основе открытого исходного кода. Тем не менее, стандартное ядро Linux не обеспечивает возможности жёсткого реального времени, которые требуются во многих встраиваемых системах, такие как предсказуемое время отклика и микросекундные задержки. Для восполнения функций реального времени, отсутствующих в ОС Linux, было создано несколько продуктов, которые решили эту задачу с переменным успехом. Например, некоторые производители прибегли к двухъядерному подходу, который обеспечивает незащищённую среду для задач реального времени и вынуждает разработчиков писать новые драйверы и системные службы даже при наличии их аналогов в ОС Linux. В данной публикации рассматривается другой подход, который основан на использовании операционной системы реального времени (ОСРВ), разработанной в соответствии со стандартом POSIX специально для встраиваемых приложений. Этот подход позволяет Linux-разработчикам не только применять свои навыки программирования, но и использовать ключевые преимущества модели открытого исходного кода операционной системы Linux. Кроме того, подход даёт возможность работать с различными системными службами, отсутствующими в стандартной ОС Linux и её расширениях реального времени.
Возможности реального времени операционной системы Linux
Операционная система Linux ставит проектировщика встраиваемых систем перед дилеммой. С одной стороны, Linux позволяет ему работать с многочисленными разработчиками, использовать большой объём существующего исходного кода и интерфейсы прикладного программирования (API) стандарта POSIX. В то же время стандартное ядро ОС Linux не обеспечивает такие возможности «жёсткого» реального времени, как гарантированное время отклика и микросекундные задержки, которые требуются во многих встраиваемых устройствах.
Причиной этого является то, что операционная система Linux имеет архитектуру общего назначения. ОС Linux была разработана для обеспечения UNIX-функциональности и значительно усовершенствована для применения в серверных и информационных технологиях. Требования этих технологий резко отличаются от требований встраиваемых систем, а, следовательно, компромиссы, которые реализованы в ядре ОС Linux, часто недопустимы во встраиваемых приложениях.
Рассмотрим в качестве примера механизм планирования процессов. Планировщик операционной системы Linux использует не вытесняющую приоритетную многозадачность, а стратегию «равноправия», которая даёт каждому процессу удовлетворительную возможность выполнения. В результате высокоприоритетные процессы, которые требуют быстрого выполнения, не всегда могут получить немедленный доступ к процессору. В действительности операционная система иногда прерывает высокоприоритетный процесс для того, чтобы предоставить долю процессорного времени низкоприоритетному процессу. Более того, операционная система теряет всю информацию о приоритетах, когда драйвер или другая системная служба, которая обычно выполняется по вызову ядра, работает от имени клиентского потока. Такое поведение вызывает непредсказуемые задержки и не позволяет своевременно выполнять критически важные действия.
Следует отметить, что подобный механизм планирования неправильно считать недостатком операционной системы Linux. Например, он очень эффективно обеспечивает высокую общую системную производительность, которая требуется настольным и серверным приложениям. Тем не менее, возможности «равноправного» планирования не предназначены для таких детерминированных сред, как сетевые маршрутизаторы, медицинские инструменты, промышленные роботы и автомобильные приложения.
Для устранения недостатков, которые не позволяют операционной системе Linux работать в реальном времени, было создано несколько продуктов. Некоторые из них разработаны коммерческими поставщиками, а некоторые являются результатами исследовательских проектов с открытым исходным кодом. Имеются и решения, сочетающие эти два подхода. Тем не менее, ни один из предложенных подходов не стал «стандартным». Более того, некоторые решения даже отступают от стандартных принципов программирования для операционной системы Linux и стандарта POSIX.
Возможности реального времени вне Linux
Некоторые поставщики пытаются обеспечить работу операционной системы Linux в реальном времени за счёт её выполнения в режиме задачи на ядре реального времени (см. рис. 1). Все другие задачи, требующие детерминированного планирования, также работают на этом ядре под управлением механизма вытеснения, однако имеют более высокий приоритет, чем ОС Linux. Таким образом, эти задачи вытесняют операционную систему Linux, когда им необходимо выполниться, и уступают ей процессор после завершения своей работы.
Рис. 1. В двухъядерной модели операционная система Linux работает как низкоприоритетная задача в отдельном ядре реального времени
В этой двухъядерной модели ядро реального времени всегда уделяет первоочередное внимание аппаратным прерываниям. Если прерывание обрабатывается задачей реального времени, то ядро запланирует выполнение этой задачи. В противном случае ядро передаст прерывание на обработку операционной системе Linux. Эти действия прозрачны для приложений, которые работают в среде Linux; разумеется, исключение составляет процессорное время, затрачиваемое на работу ядра реального времени и его задач. Тем не менее, описанный подход имеет несколько недостатков, которые описаны в следующих разделах.
Увеличение трудозатрат на кодирование
Задачи, которые работают в ядре реального времени, не могут полностью использовать существующие службы операционной системы Linux — файловые системы, сети и т. д. В действительности обращение задачи реального времени к любой службе Linux создаёт те же проблемы с вытеснением, которые делают невозможным детерминированное поведение Linux-процессов.
Таким образом, для ядра реального времени необходимо создавать новые драйверы и системные службы, даже если аналогичные службы существуют в операционной системе Linux. Поскольку число таких готовых драйверов невелико, разработчикам программного обеспечения для ОС Linux обычно приходится писать нужные драйверы заново и часто с использованием незнакомого интерфейса прикладного программирования.
Ненадёжная среда исполнения
Операционная система Linux основана на архитектуре с монолитным ядром. Это означает, что приложения работают в пользовательском пространстве с защищённой памятью. Тем не менее, задачи, которые работают в ядре реального времени, не получают преимуществ среды исполнения, надёжно защищенной устройством управления памятью, которую операционная система Linux предоставляет обычным процессам, не работающим в реальном времени. Эти задачи выполняются в незащищённом пространстве ядра. Следовательно, любая задача реального времени, которая содержит типичную ошибку в коде, например, повреждённый C-указатель, способна с лёгкостью вызвать неисправимый сбой ядра. Такая особенность является проблемой, поскольку большинство систем реального времени предъявляет очень высокие требования к надёжности.
Ограниченная переносимость
В двухъядерном подходе задачи реального времени являются не процессами операционной системы Linux, а потоками и обработчиками сигналов, которые написаны для узкого подмножества интерфейсов прикладного программирования (API) стандарта POSIX или, в некоторых случаях, для нестандартных API. Перенос существующего кода и приложений ОС Linux в среду реального времени становится затруднительным.
Эта проблема усугубляется также тем, что в разных реализациях двуядерного подхода используются разные API. Задачи, которые написаны для расширений реального времени одного поставщика, могут оказаться неработоспособными в расширениях реального времени другого поставщика. Вместо того, чтобы использовать широко поддерживаемые API операционной системы Linux, производители встраиваемых систем вынуждены делать выбор между конкурирующими «стандартами».
Недетерминированное поведение существующих приложений и драйверов в Linux
Поскольку процессы в операционной системе Linux работают за пределами ядра реального времени, их поведение остаётся недетерминированным. Планирование этих процессов по-прежнему осуществляется с помощью алгоритма «равноправия», который применяется в ОС Linux.
Ограниченные возможности проектирования
Как было сказано выше, API, поддерживаемые ядром реального времени, обеспечивают лишь часть служб API стандарта POSIX и операционной системы Linux. Таким образом, разработчики получают более ограниченные возможности проектирования, чем при использовании ОС Linux или развитой ОСРВ.
Сочетание преимуществ
Операционная система реального времени QNX® Neutrino® представляет собой значительно более гибкое и надёжное решение проблем, которые мы рассматриваем. Вместо того, чтобы вынуждать разработчиков использовать незащищённые обходные решения, QNX Neutrino обеспечивает проверенную операционную среду реального времени, которая:
позволяет разработчикам программного обеспечения для ОС Linux пользоваться существующими API и моделью программирования;
компенсирует недостатки расширений реального времени для ОС Linux за счёт более строгой модели среды исполнения, развитых возможностей проектирования и единой среды для приложений реального времени и обычных приложений;
основана на таких ключевых возможностях модели ОС Linux с открытым исходным кодом, как простота устранения неполадок и модификация операционной системы. Фактически, микроядерная операционная система реального времени, подобная QNX Neutrino, обеспечивает уникальные преимущества в обеих этих возможностях;
предоставляет разнообразные системные службы (например, безопасную декомпозицию, распределённые вычисления, развитую поддержку многоядерных процессоров), которые отсутствуют в решениях на основе операционной системы Linux.
