С.В. Золотарев, А.В. Исаев, ЗАР «РТСофт»
В данной статье рассматриваются впечатляющие возможности новой флагманской версии операционной системы реального времени (ОСРВ) LynxOS 5.0 компании LynuxWorks, отражающие основные тенденции в развитии ОСРВ и встраиваемых операционных систем. Именно вызовы нашего времени создали необходимость выпуска новой версии LynxOS 5.0, для того, чтобы разработчики получили адекватный продукт, соответствующий современному уровню развития многоядерных процессорных технологий. Поэтому основное внимание в статье уделено поддержке в LynxOS 5.0 симметричной мультипроцессорной обработки данных (Symmetric MultiProcessing — SMP) и, в частности, таким вопросам как планирование и синхронизация в среде SMP. |
Новые тенденции в развитии ОСРВ и встраиваемых операционных системВ 2006 году, в связи с появлением многоядерных аппаратных решений компании Intel, прогнозировалось, что через два года многоядерные системы станут основной платформой серверов, настольных компьютеров и ноутбуков, а в перспективе и встраиваемых систем [1]. Прогноз полностью оправдался, в том числе и в отношении встраиваемых систем. Конечно, в первую очередь это коснулось аппаратных средств [2], а затем уже программной поддержки. Пока на рынке встраиваемых систем не было массового использования многоядерных процессоров для архитектур x86 и PowerPC, потребность в их программной поддержке практически отсутствовала, однако в настоящее время картина существенно изменилась. Одной из основных тенденций в развитии ОСРВ и встраиваемых операционных систем в 2008 году стала поддержка многоядерной архитектуры и симметричной мультипроцессорной обработки данных. Все основные разработчики ОСРВ реализовали в своих новых версиях поддержку SMP: QNX Neutrino 6.3, VxWorks 6.6, LynxOS 5.0 (www.lynuxworks.com/rtos/rtos.php), Integrity 10.0, ThreadX/SMP. Без программной поддержки SMP на уровне операционной системы все преимущества многоядерной архитектуры, реализованные на аппаратном уровне, становятся практически малополезными возможностями, ничего не дающими пользователям. Заметим, однако, что уровень поддержки SMP сильно отличается у разных ОСРВ. Одна из наиболее развитых поддержек SMP реализована в LynxOS 5.0. Причем следует особо отметить, что реализация в LynxOS 5.0 поддержки SMP не просто отражает общую тенденцию в развитии ОСРВ, а ориентирована, прежде всего, на значительное улучшение основного показателя этого класса операционных систем – характеристик реального времени, таких как время реакции на события и детерминизм поведения при любых нагрузках. Очень важно, чтобы отечественные разработчики по достоинству оценили новые возможности LynxOS 5.0 и в полной мере воспользовались конкурентными преимуществами, которые предоставляет данная ОСРВ. Немного об истории развития LynxOSПрежде чем перейти к детальному рассмотрению LynxOS 5.0, хотелось бы напомнить об основных этапах развития этой операционной системы и ее вкладе в становлении многих основополагающих подходов в области ОСРВ. Именно в LynxOS были впервые реализованы многие идеи, впоследствии подхваченные другими поставщиками операционных систем реального времени. Например, согласованность со стандартом POSIX или поддержка Linux-приложений. Компания LynuxWorks была основана в 1988 и вышла на рынок с первой в мире реализацией UNIX реального времени: операционной системой LynxOS. Первоначально компания называлась Lynx Real-Time Systems. В мае 2000 года название компании изменилось на LynuxWorks, являясь отражением новой стратегии, отраженной в формуле: Lynx + Linux = Lynux. С одной стороны, эта формула отражала факт разработки компанией своей собственной версии продукта класса Embedded Linux (BlueCat Linux), с другой стороны, стремлением в самой ОСРВ LynxOS обеспечить определенный уровень совместимости с Linux, который впоследствии воплотился в так называемый уровень двоичной совместимости с Linux: Linux ABI (ABI – Application Binary Interface). Первая версия LynxOS была написана в 1986 году в Далласе (Техас) для процессора Motorola 68010. В 1988-89 году LynxOS была портирована на Intel 80386. LynxOS 2.0 – февраль 1991. Поддерживала относительно небольшой набор возможностей, таких как двоичные семафоры, разделяемая память, асинхронные события, межпроцессное взаимодействие, непрерывные файлы. В конце 1994 года LynxOS стала поддерживать процессоры PowerPC 60x, что явилось предпосылкой к значительному расширению рынка использования LynxOS и, в конечном счете, к завоеванию лидирующих позиций LynxOS среди других ОСРВ именно в сегменте оборудования на платформе PowerPC. С сентября 1995 года были начаты работы по портации LynxOS на процессоры SPARC-архитектуры. LynxOS 3.0 – март 1998 года. Поддерживается широкий спектр процессорных архитектур: x86 (Intel 386, 486, Pentium, Pentium Pro, Pentium II), PowerPC (603, 603e, 603ev, 604, 604e, 604er, PowerQUICC 860,821, 750), 68K (MC68030, MC68040, MC68LC040, MC68060), SPARC (microSPARC, microSPARC II). Для всех указанных платформ разработка могла вестись как в Native, так и в кросс-среде. В качестве графической среды использовалась X Window (X11R6). LynxOS 4.0 – июнь 2000 года. Основные целевые платформы: x86, PowerPC, MIPS (специальная версия для HP). Кросс-платформы Windows 2K, XP, Linux RedHat 7.2 и выше, Solaris 2.7 и выше. Поддержка Linux ABI для ядра Linux 2.4.x. Расширение сетевых возможностей, в том числе поддержка IPv6 и IPSec. LynxOS 5.0 – 2008 год. Поддержка симметричной мультипроцессорной обработки данных: выпуск новой версии был обусловлен необходимостью получения разработчиками адекватного продукта, соответствующего современному уровню развития процессорных технологий. Основными аппаратными платформами, которые поддерживаются всеми версиями LynxOS, являются x86 и PowerPC. Кроме того, существуют специальные заказные версии для процессоров MIPS. Кроме LynxOS компания LynuxWorks предлагает пользователям еще четыре системных продукта: LynxOS-178 [3], LynxOS-SE, LynxSecure[4], BlueCat Linux [5]. Основные возможности LynxOS
Новые возможности LynxOS в версии 5.0 Основной отличительной особенностью версии LynxOS 5.0 является поддержка многоядерных конфигураций и архитектуры симметричной мультипроцессорной обработки данных (SMP). Подробно об этом мы поговорим ниже. Надо сказать, что в LynxOS поддержка многоядерных конфигураций была в старых версиях LynxOS вплоть до версии 2.5, но потом (по неизвестным автору причинам) перестала поддерживаться. С чисто пользовательской точки зрения, отметим следующие важные отличия LynxOS 5.0 от версий LynxOS 4.0/4.2:
На момент написания статьи возможность использования LynxOS 5.0 была обеспечена (см. http://www.lynuxworks.com/board-support/all-lynxos.php) для аппаратной платформы x86 (процессоров Intel и AMD), а также для нескольких плат c процессором PowerPC (MPC74xx, MPC8640/8641D) от компаний GE Fanuc Intelligent Platforms, Curtiss-Wright и Freescale Semiconductor.. Поддержка SMP-архитектуры в LynxOS 5.0LynxOS 5.0 может работать в режиме SMP на платах c несколькими процессорными ядрами или процессорами. Чтобы обеспечить поддержку SMP в LynxOS 5.0, было сделано несколько изменений в ядре операционной системы и библиотеках пользовательского уровня. Эти изменения оказывают определенное влияние на процесс разработки заказных ядер операционной системы LynxOS и приложений пользователя. Далее будут вкратце описаны изменения и детализированы особенности разработки в LynxOS 5.0, связанные с поддержкой SMP. Главной особенностью систем с архитектурой SMP является наличие общей физической памяти, разделяемой всеми процессорами. При обращении к памяти все процессоры имеют равные права и одну и ту же адресацию для всех ячеек памяти. Поэтому SMP-архитектура называется симметричной. Два подхода к планированию очередей в SMP средеСуществует два подхода к организации потоков очередей на выполнение в среде SMP:
Рассмотрим преимущества и недостатки каждого из этих подходов и дадим обоснование подхода, используемого в LynxOS 5.0. Планирование в операционных системах общего назначенияКогда поток работает на процессоре, он хранит часть своих данных в кэше процессора, что позволяет ему работать быстрее на этом процессоре за счет уменьшения времени доступа к памяти. Если выполнение потока будет передано другому процессору, то этот поток будет не в состоянии работать также быстро на новом процессоре в течение некоторого (начального) момента времени. Передача потока на выполнение другому процессору вызывает большую загрузку шины системы, поскольку новый процессор заносит данные потока в свой кэшь, а старый процессор сбрасывает измененные данные потока назад в память. Таким образом, происходит замедление работы всей системы. Поэтому для повышения производительности работы конкретного потока выгодно предотвращать частое переключение этого потока между процессорами. Операционные системы общего назначения, такие как Linux, FreeBSD, и Solaris достигают этого, поддерживая для каждого процессора свою собственную очередь потоков. Каждый поток остается на одном процессоре в течение относительно длительного периода времени. Время от времени, планировщик уравновешивает загрузку процессоров, перемещая потоки с сильно нагруженных процессоров на слабо загруженные процессоры (происходит так называемая балансировка загрузки процессоров). Этот подход часто называют подходом со многими очередями на выполнение. Подход со многими очередями на выполнение хорош для повышения общей производительности системы. Однако, он имеет недостаток с точки зрения времени отклика в реальном времени, так как только поток становится готовым к выполнению, он должен ждать на своем процессоре, пока на нем закончится работа потока с более высоким приоритетом. Даже в случае, если другой процессор в системе – свободен или выполняет потоки с более низким приоритетом. Балансировка загрузки происходит достаточно редко и не может оказать помощь этому потоку (например, в случае, если другие процессоры заняты большим количеством потоков с более низким приоритетом). В качестве дополнительной возможности планировщик может позволить пользователю связывать поток с одним процессором или рядом процессоров. Такие потоки не могут быть перемещены на другие процессоры даже при балансировке загрузки. Эту особенность называют привязкой к процессору (affinity). Эффект привязки к процессору влияет и на производительность и на время отклика в реальном времени еще более явно, чем подход со многими очередями на выполнение. Однако, в отличие от числа очередей на выполнение, привязка к процессору является дополнительной (опциональной) возможностью. Пользователь может выбрать, использовать ли ему ее или нет, но только после тщательного рассмотрения и тестирования. В настоящее время LynxOS 5.0 не поддерживает возможность привязки к процессору. Однако это свойство может быть добавлено позже в виде патчей или после появления новых релизов операционной системы.
|
Операция | Описание |
atomic_set (av, v) | Установить атомарную переменную в указанное значение. |
atomic_get (av) | Возвратить текущее значение атомарной переменной. |
atomic_add (av, v) | Добавить указанное значение к атомарной переменной и возвратить ее новое значение. |
atomic_sub (av, v) | Вычесть указанное значение из атомарной переменной и возвратить ее новое значение |
atomic_inc (av) | Увеличить на 1 значение атомарной переменной и возвратить ее новое значение. |
atomic_dec (av) | Уменьшить на 1 значение атомарной переменной и возвратить ее новое значение. |
atomic_xchg (av, v) | Установить значение атомарной переменной av в v и возвратить ее старое значение. |
atomic_cmpxchg (av, v1, v2) | Взять два значения, v1 и v2. Если значение атомарной переменной равно v1, то установить ее в v2. В любом случае возвращается старое значение атомарной переменной. |
atomic_or (av, v) | Сделать побитовое ИЛИ значения атомарной переменная с указанной битовой маской и сохранить результат в атомарной переменной. Никакое значение не возвращается. |
atomic_and (av, v) | Сделать побитовое И значения атомарной переменной с указанной битовой маской и сохранить результат в атомарной переменной. Никакое значение не возвращается. |
atomic_xor (av, v) | Сделать побитовое XOR значения атомарной переменной с указанной битовой маской и сохранить результат в атомарной переменной. Никакое значение не возвращается. |
atomic_get_or (av, v) | Сделать побитовое ИЛИ значения атомарной переменной с указанной битовой маской и сохранить результат в атомарной переменной. Возвращается старое значение. |
atomic_get_and (av, v) | Сделать побитовое И значения атомарной переменной с указанной битовой маской и сохранить результат в атомарной переменной. Возвращается старое значение. |
В мультипроцессорной среде в небольшом количестве ситуаций должен быть обеспечен определенный порядок доступа к памяти процессора (загрузка и сохранение). LynxOS 5.0 обеспечивает ряд вызовов для обеспечения строгого порядка доступа к памяти процессора, названного барьером памяти.
Поясним, для чего нужно было ввести барьеры памяти в SMP-среде. Синхронизация доступа к разделяемому ресурсу требует команд доступа к памяти (сохранения и загрузки) для того, чтобы выполняться и стать видимым для всех процессоров в системе в определенном порядке. Обычно программист ожидает, что доступ к памяти будет выполнен в том же самом порядке, в котором он появляется в коде программы. Однако, без дополнительных уловок, о которых будет написано ниже, это может оказаться неправильным, потому что современные оптимизирующие компиляторы могут переупорядочить инструкции процессора (в общем случае) и доступ к памяти (в частности) для того, чтобы достигнуть лучшей производительности. Например: если программа сохраняет 1, а затем 0 в то же самое место памяти, то компилятор может исключить первое сохранение. Однако, если первое сохранение было блокированием ресурса, а второе было разблокированием ресурса, то оптимизация компилятора приведет к неправильной работе программы.
Современные процессоры порождают другую проблему: большинство современных архитектур процессоров могут выполнять программу не в том порядке, как это написано в программе, а в порядке того, как данные становятся доступными (например, чтение из кэшируемой области памяти может быть выполнено прежде, чем будет выполнено предшествующее чтение из некэшируемой области памяти). У каждой архитектуры процессора есть ряд правил для упорядочения выполнения доступа к памяти, который называется моделью памяти. Во всех архитектурах отдельный процессор является последовательным, что заставляет программу, работающую на этом процессоре, выглядеть так, что все ее инструкции выполняются в порядке, указанном в программе. Однако это становится проблемой, когда есть другие «пользователи» на шине памяти, такие как внешние устройства ввода / вывода и, что наиболее важно, другие процессоры.
Как уже сказано, переупорядочение доступа памяти компилятором и процессором может потребовать синхронизации доступа к ресурсу. Рассмотрим общую последовательность операций в критической области кода, защищающего разделяемый ресурс:
Все три пункта содержат доступы памяти. Крайне важно, чтобы пункт 1 был выполнен сначала, затем пункт 2, затем пункт 3. Однако, это, возможно, не настолько очевидно для оптимизирующего компилятора и процессора, которые видят только последовательность команд, не зная их цель. Если компилятор или процессор переставляют команды доступа к памяти пункта 2 с пунктом 1 или пунктом 3, то эти команды выпадают из критической области, чего определенно не хочет программист.
LynxOS 5.0 обеспечивает ряд вызовов, чтобы обеспечить желательный порядок доступа к памяти — барьеры памяти. Есть два вида барьеров памяти: общий и специализированный. Общие барьеры памяти гарантируют выполнение своих функций в любой ситуации; однако, они являются обычно весьма медленными. В определенных случаях могут использоваться менее универсальные барьеры, которые называются специализированными барьерами.
В общем случае, барьер памяти позволяет осуществлять выполнение доступа к памяти определенного типа в том же порядке, в каком они появляются в программе. Например, если у Вас есть следующая последовательность программы:
Барьер памяти гарантирует, что доступы A и B будут выполнены прежде доступов C и D, но не гарантирует какого-либо порядка A относительно B и C относительно D.
API барьеров памяти определен в заголовочном файле membar.h. Барьеры памяти доступны и в ядре и в программах пользователя. Общие барьеры памяти приведены в Таблице 2.
Таблица 2. Общие барьеры памяти
Барьера памяти | Описание |
membar_compiler () |
Барьер оптимизации компилятора.
Защищает компилятор от переупорядочения порядка операций доступа к памяти через этот барьер в целях оптимизации. Это также заставляет компилятор прекратить все предположения о содержимом памяти. Это — основной барьер: все другие барьеры включают функциональные возможности барьера оптимизации компилятора.
|
membar_store () |
Барьер сохранения
Гарантирует, что все сохранения, предшествующие этому барьеру (в порядке, указанном в программе), выполнены и глобально видимы перед сохранениями, следующими после этого барьера.
|
membar_load () |
Барьер загрузки
Гарантирует, что все загрузки, предшествующие этому барьеру (в порядке, указанном в программе), выполнены перед загрузками, следующими после этого барьера.
|
membar_all () |
полный барьер памяти.
Гарантирует, что все доступы к памяти (загрузки и сохранения), предшествовавшие этому барьеру (в порядке, указанном в программе) выполнены и глобально видимы перед доступами к памяти, следующими после этого барьера.
|
Специализированные барьеры памяти представлены в Таблице 3.
Таблица 3. Специализированные барьеры памяти
Барьер памяти | Описание |
membar_io () |
Барьер ввода / вывода.
Этот барьер похож на полный барьер памяти, но только применяется для операций загрузки и сохранения в некэшируемую память. Некэшируемая память обычно используется для операций ввода / вывода, отображаемого на память. Таким образом, этот барьер имеет специфический интерес для программистов драйверов устройств.
|
membar_lock_enter () |
Барьер входа в блокировку.
Это — специализированный барьер, используемый с блокировками данных, чтобы гарантировать, что блокировка защищает данные. Он размещается непосредственно после сохранения памяти, которая захватывает блокировку.
|
membar_lock_exit () |
Барьер выхода из блокировки.
Это — специализированный барьер, используемый с блокировками данных, чтобы гарантировать, что блокировка защищает данные. Он размещается непосредственно перед сохранением памяти, которая освобождает блокировку.
|
membar_pause () | Это — специализированный барьер, используемый с блокировками данных для выполнения короткой задержки. |
В контексте вопроса генерации ядра в LynxOS 5.0 в среде SMP, определимся, что понимается в LynxOS под термином процессор. Термин процессор (CPU) ссылается на отдельный кристалл с единственным процессорным ядром, индивидуальные ядра для многоядерного процессора или индивидуальные логические процессоры в случае технологии с поддержкой Hyper Threading (или аналогичной). Каждый процессор может выполнять один поток в каждый момент времени. Следовательно, система с N процессорами в состоянии выполнять одновременно N потоков.
При генерации ядра LynxOS 5.0 для работы с несколькими процессорами надо задать значение параметра NUM_CPUS в файле $ENV_PREFIX/sys/bsp.<bsp_name>/uparam.h. Если параметра NUM_CPUS нет в файле uparam.h, то LynxOS не будет поддерживать SMP и будет использовать только один процессор. Если параметр NUM_CPUS определен и равен 0 (по умолчанию), то LynxOS будет стараться определить число процессоров автоматически и использовать все найденные процессоры. Обычно этого достаточно для большинства конфигураций, но иногда желательно явно указать число процессоров, например, для того чтобы уменьшить время загрузки операционной системы. Если параметр NUM_CPUS равен -1, то число процессоров берется из установок BIOS. Если параметр NUM_CPUS равен 1, то LynxOS работает в однопроцессорной конфигурации. И, наконец, если параметр NUM_CPUS не меньше двух, то он задает число процессоров, которые должны использоваться операционной системой.
Нет никаких определенных требований к приложениям пользовательского уровня и библиотекам при работе в среде SMP. Введение SMP вызвало лишь некоторые изменения, видимые для пользователя. Большая часть приложений работают прекрасно в среде SMP без какой-либо модификации. В среде SMP процессы и потоки нормально синхронизируются стандартными примитивами (такими как мьютексы POSIX, семафоры и т.д.) тем же самым способом, как это сделано в случае однопроцессорной архитектуры. Дополнительно, могут использоваться атомарные операции и барьеры памяти, чтобы ввести новые дополнительные типы синхронизации. Довольно подробно это изложено в документе «LynxOS 4.x to LynxOS 5.0 Migration Kit Guide».
Программист может узнать число процессоров в системе при использовании библиотечного вызова sysconf либо с помощью утилиты sysctl, например, следующим образом:
$ sysctl hw.ncpu
hw.ncpu: 2
$
Утилита ps показывает, на каком процессоре выполняется поток (для тех потоков, которые выполняются в настоящее время), или на каком процессоре поток выполнялся в последний раз (для других потоков). Из-за планирования с вытеснением по приоритетам в LynxOS, перемещение потоков с одного процессора на другой процессор происходит довольно часто. Информация процессора, показанная утилитами, является снимком состояния системы на какой-то момент времени, и не отражает все изменения состояния системы во время выполнения утилиты ps.
Говоря о специальных средствах работы пользователя в SMP среде, следует упомянуть об аппаратных средствах отладки, поддерживающих отладку программного обеспечения многоядерных систем. В частности, для отладки приложений и ядра LynxOS для многопроцессорных и многоядерных систем на PowerPC можно использовать JTAG-отладчики PowerDebug компании Lauterbach (www.lauterbach.com). JTAG-отладчики PowerDebug поставляются с собственной интегрированной программной средой PowerView, которая позволяет настраиваться на конкретную операционную систему и, в том числе, на LynxOS. Интегрированная среда отладки PowerView обеспечивает оперативный, дружелюбный показ ресурсов системы LynxOS, cпецифичный именно для LynxOS показ распечатки трассировки, cтатистическую оценку и графический показ работы потоков и другую полезную информацию о работе потоков.
Где же в наибольшей степени будут востребованы новые возможности LynxOS 5.0? Конечно, в традиционных отраслях, в которых применяется LynxOS: оборонной и авиакосмической [9,10,11]. Очень показательным в этом смысле являются высказывания руководства компании GE Fanuc Intelligent Platforms (одной из ведущих в мире компаний- поставщиков аппаратных средств повышенной надежности для систем специального назначения) о том, что LynxOS 5.0 обеспечивает все необходимые функциональные возможности, которые пользуются повышенным спросом в основных военных программах (http://www.vmecritical.com/news/db/?12576). Например, в таких военных программах США и стран НАТО, как FCS (Future Combat Systems – перспективные боевые системы) и JTRS (объединенная система тактической радиосвязи). Не случайно, что LynxOS выбрана в качестве одной из базовых ОСРВ для «тяжелых» применений крупнейшими мировыми производителями аппаратных средств, таких как GE Fanuc Intelligent Platforms, Kontron AG и Curtiss-Wright Control Embedded Computing. LynxOS находит все более широкое применение и в России.
В качестве одного из конкретных примеров применения LynxOS 5.0, ориентированного на «тяжелые» применения, можно сослаться на компанию GE Fanuc Intelligent Platforms, которая выбрала LynxOS 5.0 для использования со своими наиболее современными платами VXS DSP220 (http://www.gefanucembedded.com/products/2206) и VPX DSP230 (http://www.gefanucembedded.com/products/2044), основу которых составляет многоядерный процессор Freescale MPC8641D. VPX DSP230 (рис.2) реализована инженерами GE Fanuc в перспективном конструктиве 6U VPX, поддерживает программные функции AXIS (Advanced Multiprocessor Integrated Software), что облегчает ее использование в многопроцессорных конфигурациях.
BSP LynxOS 5.0 для плат VXS DSP220 и VPX DSP230 было реализовано независимой компанией Pebble Bay Consulting Ltd из Англии (http://www.pebblebay.com/pdf/LynxOS-5%20for%20GE%20Fanuc.pdf). Эти BSP поддерживают все периферийные устройства плат VXS DSP220 и VPX DSP230, включая четыре процессора Freescale MPC8641D, восемь банков DDR2 SDRAM (в сумме дающих до 8 Гбайт памяти), Tundra Serial RapidIO для всех узлов, 8 последовательных портов, единственный XMC с поддержкой SRIO, интерфейс VME 2eSST, контроллер управления узлами и программное обеспечение для AXIS (Advanced Multiprocessor Integrated Software) компании GE Fanuc.
Как мы видим, новая версия операционной системы LynxOS 5.0 сделала огромный шаг в направлении поддержки SMP-архитектуры. Разработчики получили адекватный продукт, соответствующий современному уровню развития многоядерных процессорных технологий. При этом разработчикам из LynuxWorks удалось сохранить преемственность с основными возможностями LynxOS, реализованными в предыдущих версиях, главными из которых является поддержка работы системы в реальном времени и совместимость с Linux на уровне двоичных файлов. Кроме этого, многие реализованные в LynxOS 5.0 методы, безусловно, будут использоваться в других продуктах LynuxWorks, таких как LynxOS-178 и LynxSecure. Нет сомнений, что новые возможности LynxOS 5.0 будут востребованы разработчиками систем специального назначения, таких как комплексы управления оружием, военная и гражданская авиация, военно-морские силы. Хотелось бы надеяться, что отечественные разработчики станут одними из первых, кто воспользуется новыми конкурентными преимуществами LynxOS 5.0.
1. Золотарев С. В., Рыбаков А. Н. Программное обеспечение многоядерных систем, Открытые системы, 2, 2006
2. Встраиваемые компьютерные технологии для сильной России, МКА: мир ВКТ, 3, 2008
3. Золотарев С. В., LynxOS-178: операционная система реального времени нового поколения для авиации, Авиакосмическое приборостростроение, 8, 2005 г.
4. Золотарев С. В., LynxSecure:время операционных систем реального времени в MILS-архитектуре пришло, Мир компьютерной автоматизации (МКА), 4, 2007 г.
5. Золотарев С. В., BlueCat Linux как программная платформа для разработки встраиваемых приложений, ChipNews, 4, 2005 г.
6. Золотарев С. В., LynxOS: Реальное время всерьез, Мир компьютерной автоматизации (МКА), 3, 2005 г.
7. Brian Goetz. Java theory and practice: Going atomic. http://www-128.ibm.com/developerworks/java/library/j-jtp11234/
8. Scott Maxwell, Linux Core Kernel Commentary (Ядро Linux в комментариях), http://www.netlib.narod.ru/library/book0010/toc.htm
9. Синенко О. В., Золотарев С. В. Современные операционные системы реального времени для перспективной авионики, Военный парад, 6 (78), 2006 г.
10. Ефанов Д. В. ОС РВ LynxOS как основа современных систем ответственного применения, Автоматизация в промышленности, 2, 2008
11. Брошюра «Программное обеспечение LynuxWorks в оборонной и авиакосмической отраслях», http://www.rtsoft.ru/ru/vkt/product/pdf/