Современный C++ для высоконадежных вычислений и систем реального времени Л.А. Меркин Профессор Департамента информатики НИУ ВШЭ в Санкт-Петербурге leonid.a.merkin@gmail.com Аннотация Предлагаемая учебная программа может быть реализована в рамках образовательной программы базового высшего образования (бывший специалитет) на старших курсах, а также программы магистратуры или программы дополнительного профессионального образования, для студентов, обучающихся по специальностям в области прикладной математики, компьютерных наук, инженерии программного обеспечения (ПО) и аппаратно-программных комплексов, систем автоматического управления и другим аналогичным специальностям. Основная цель данной программы — познакомить студентов с современным состоянием мировой науки и практики в области высоконадежных вычислительных методов, включая критические по надежности системы реального времени, и подготовить студентов к решению научных и прикладных задач в этой области, проистекающих, в том числе, из потребностей разработки высоконадежных систем управления для аэрокосмической, энергетической, транспортной и других отраслей индустрии, а также систем управления вооружениями и военной техникой. Следует отметить, что «высоконадежные вычисления» (dependable computing) как научная, прикладная и учебная дисциплина получила в последние 30 лет значительное развитие за рубежом, в первую очередь во Франции и Великобритании. К сожалению, в Российской Федерации высоконадежные вычислительные методы не получили пока достаточного распространения, что негативным образом сказывается на уровне надежности критически-важных аппаратнопрограммных комплексов. Пример — авария космического аппарата «Луна-25» в августе 2023 года, произошедшая по причине отказа в системе управления, который, в свою очередь, был вызван непроведением анализа планируемости и приоритезации программных сообщений между компонентами системы на этапе разработки. Предлагаемая учебная программа направлена на то, чтобы содействовать преодолению отставания российских методов инженерии ПО в данной области. В текущей реализации программы прикладной акцент сделан на методах реализации высоконадежных вычислений, в том числе систем реального времени, для задач баллистики и управления полетом космических аппаратов. Программа может быть реализована в виде годового (двухсеместрового) курса общим объемом 72 академических часа, из которых 36 часов составляют лекции и 36 часов — лабораторные практические занятия. Студенты, изучающие данную программа, должны быть знакомы (на теоретическом и практическом уровне) с методами и парадигмами программирования на языке C++, а также с основами теории операционных систем, пропозиционной математической логики, теоретической механики, высшей алгебры, дифференциальных уравнений и численных методов. Таким образом, предлагаемая учебная программа является междисциплинарной, находящейся на пересечении прикладной математики, теоретической механики и компьютерных наук. Она призвана способствовать усилению и интеграции знаний учащихся во всех вышеперечисленных областях, развитию у них мотивации к конструктивному применению этих знаний для решения задач в области разработки передовых технических решений в аэрокосмической области и за ее пределами. Тематический учебный план 1-й семестр: 1. Понятие о надежности (качестве) ПО в широком смысле. Составляющие надежности: функциональная и временнАя корректность, безотказность, безопасность, производительность, сопровождаемость и пр. Количественные метрики для измерение уровней надежности ПО. Классификация ошибок ПО (триада «fault / error / failure»). Процессы валидации, верификации и сертификации ПО. Уровни зрелости процесса разработки ПО и их взаимосвязь с надежностью. Российские и международные стандарты в области надежности ПО. 2. Язык программирование как отображение сущностей «реального» мира или математики на архитектуру вычислительной системы. «Сильная» система типов в языке программирования как необходимое (но не достаточное) условие обеспечения надежности ПО. Полиморфные типы, их возникновение в функциональных языках (система HindleyMilner’а). Язык C++ как наиболее распространенная современная технология программирования с полиморфными типами (templates). Полиморфные типы (generics) в языке Ada. 3. Вычисления на этапе компиляции (compile-time evaluation) в современных стандартах языка C++ (от C++11 и выше) и их связь с полиморфными типами. Пример: вычисление математических функций на этапе компиляции через аппроксимации Pade, сгенерированные с помощью систем компьютерной алгебры (например, Maple). 4. Понятие о зависимых типах и изоморфизме Curry—Howard’а между системой типов и пропозиционной логикой. Пример: доказательство коммутативности моноида порядка 2. 5. «Размерные типы»: система типов, представляющая информацию о физических размерностях и единицах измерения переменных в языке программирования. Авария космического аппарата Mars Climate Orbiter в 1999 году по причине ошибки в представлении физических единиц. Правила вывода для системы размерных типов. Существующие реализации системы размерных типов в различных языках программирования (ML, F#, C++). 6. DimTypes — новая реализация системы размерных типов в современном стандарте C++20, разработанная автором данной программы (https://github.com/LMerkin/DimTypes). Применение арифметики над полем Zp на этапе компиляции для представления векторов размерностей. Использование специальных свойств препроцессора С++ для реализации удобного синтаксиса объявления размерностей, размерных типов и переменных в C++ программах. 7. Задача: реализация высоконадежной системы баллистических вычислений для проектирования траекторий ракет-носителей и космических аппаратов. Критерии и варианты выбора технологии программирования (например, C++20/23 или Ada). Факторы выбора C++. Обзор принципов и архитектуры библиотеки SpaceBallistics, также разработанной автором данной программы (https://github.com/LMerkin/SpaceBallistics), на основе DimTypes. 8. Системы координат в задачах космической баллистики. Связанные («встроенные»), топоцентрические («стартовые»), геоцентрическая вращающаяся, геоцентрическая «фиксированная», барицентрическая и другие системы координат. Представление систем координат и связанных с ними векторов (положения, линейной и угловой скорости, линейного и углового ускорения, сил и моментов сил, и пр.) в полиморфной системе типов C++. Преимущества такого представления: защита на этапе компиляции от ошибочного использования кинематических и динамических векторов. 9. Преобразования между вышеуказанными системами координат и их реализация на C++. Углы Эйлера и преобразования между связанной и стартовой системой. Параметры земного эллипсоида (модель WGS84) и преобразования между стартовой и геоцентрической вращающейся системой координат (на этапе компиляции). Суточное вращение Земли и преобразования между геоцентрической вращающейся и геоцентрической «фиксированной» системами. Орбитальное движение Земли в инерциальной (барицентрической) системе координат; семейство эфемерид JPL, их реализация в С++ и преобразования между геоцентрической «фиксированной» и барицентрической системами. 10. Конструкция, динамические характеристики и математическая модель ракеты-носителя (РН) «Союз-2.1б» и соответствующая связанная система координат. Задача о поступательном и вращательном движении РН и об управлении ее полетом. Фиксированные, переменные и управляющие параметры. 11. Приближенное вычисление моментов инерции ступеней РН переменной массы методом декомпозиции элементов конструкции РН на элементарные геометрические объекты Иерархия соответствующих классов в C++. Факторы отказа от использования классической объектно-ориентированной парадигмы (динамического полиморфизма) в пользу статической полиморфной системы типов, CRTP («curiously recurring template pattern») и выполнения большинства вычислений на этапе компиляции. 12. Силы, действующие на РН в полете: аэродинамические, гравитационные, реактивные. Представление этих сил в различных системах координат, реализация вычислений в C++ с различной степенью точности. Модель стандартной атмосферы Земли. Гравитационный потенциал Земли: сферическое приближение, эллипсоидальное приближение до 2-ой зональной гармоники, полная модель. Особенности движения космического аппарата (КА) в гравитационном поле Луны (пример неустойчивой орбиты). 13. Дополнительные силы и ускорения, вызванные неинерциальностью рассматриваемых систем координат, кроме барицентрической: переносные, центробежные и кориолисовы ускорения: вывод формул и их реализация на C++. 14. Полные дифференциальные уравнения поступательного и вращательного движения РН на активном участке траектории в топоцентрической системе координат (с использованием иных систем координат для представления действующих сил); представление правых частей этих уравнений в C++. 15. Численное интегрирование дифференциальных уравнений движения (решение начальной задачи): метод Runge-Kutta-Fehlberg’а и его реализация над системой размерных типов в C++. Вычисление траекторий движения РН при заданных законах управления. 16. Введение в численные методы оптимального управления для решения граничных задач. Обзор современных численных методов оптимизации: локальные и глобальные, дифференциальные и бездифференциальные методы. Численное построение оптимального управления (полетного задания) для задачи вывода КА с помощью РН «Союз2.1б» на стандартную низкую опорную орбиту. 17. Задание для самостоятельной работы студентов: построение математической модели разгонного блока «Фрегат» и численное построение оптимального управления для задачи вывода КА на траекторию прямого попадания в Луну. 2-ой семестр: 1. Понятие о системах реального времени (СРВ). Классификация СРВ по уровню критичности времени отклика: hard-, firm-, soft-deadline СРВ. Взаимосвязь между понятиями высоконадежного ПО, критичных по времени отклика СРВ и встроенных (embedded) систем. 2. Типичная архитектура СРВ: операционная система (ОС, ядро, executive), периодические (time-driven) задачи, спорадические (event-driven) задачи. Задачи, отвечающие за управление вводом / выводом данных. Аппаратная архитектура для СРВ: однопроцессорные, многопроцессорные и распределенные СРВ. Механизмы взаимодействия между задачами в СРВ. 3. Языки программирования, ориентированные на разработку СРВ (например, Ada) и их свойства. Взаимосвязь между понятиями «concurrency», «parallelism» и «real-time». Concurrent механизмы в современных стандартах языка C++ (начиная с C++11). 4. Обзор различных существующих операционных систем реального времени: VxWorks, QNX, различные real-time модификации Linux, FreeRTOS, системно-независимые реализации Ada, микроядра (например, seL4), RTEMS и пр. Стандартизация API операционных систем реального времени: Real-Time POSIX. Взаимосвязь между конструкциями языка программирования (например, задачами в Ada и механизмами взаимодействия между ними) и нижележащими механизмами, реализуемыми на уровне ОС (например, потоками, процессами и механизмами IPC). 5. Приоритеты задач, выполняемых в СРВ в «concurrent» режиме на одном процессоре. Прерывание и возобновление выполнения задач. Распределение периодических задач по приоритетам (rate-monotonic scheduling). «Уравнение планируемости» (schedulability equation), его решение и применение для синтеза hard-deadline СРВ. 6. Критические секции и проблема блокировки и инверсии приоритетов задач в СРВ. Решение данной проблемы с помощью «наследования приоритетов» и «протокола потолка приоритетов» (prioriry ceiling protocol). Соответствующие модификации «уравнения планируемости». Учет спорадических задач в уравнении. 7. Задачи и методы оптимального синтеза СРВ. Критерии оптимальности: например, максимизация загрузки процессора при выполнении гарантий соблюдения deadline’ов критических задач, или максимизация общей функции полезности системы при тех же условиях. Алгоритмы планирования, обеспечивающие выполнение задач разного уровня критичности (hard-, firm-, soft-deadline). 8. Распределенные СРВ, учет пропускной способности и задержек сетевых коммуникаций и холистическое планирование задач и коммуникаций. 9. Система RTEMS (https://www.rtems.org): ее происхождение, история развития, архитектура, нативный API и POSIX API. Преимущества этой системы для реализации систем управления космическими аппаратами. Разработка приложений для RTEMS на C++ и выполнение их на эмуляторе QEMU. 10. Разработка модели системы управления РН «Союз-2.1б» на основе системы RTEMS. Определение номенклатуры и временнЫх характеристик задач, эмулирующих источники данных («датчики», например, акселерометры, гироскопы и пр.), многозадачную вычислительную архитектуру и органы управления (например, приводы рулевых камер ЖРД и аэродинамических рулей). 11. Определение дифференциальных законов управления РН в условиях воздействия внешних и внутренних возмущающих факторов. 12. Проектная работа: реализация системы управления РН на C++ / RTEMS несколькими командами студентов. Система управления должна формировать в реальном времени команды для органов управления РН с целью реализации полетного задания, сформированного на основе методов, изученных в 1-ой части данной программы, а также формировать команды для компенсации стохастических возмущений полетных параметров, информация о которых поступает с различных эмулированных «датчиков». Апробация программы 1-я часть данной программы была апробирована в течение 2023/24 учебного года в ходе спецкурса «Современный C++ для задач космической баллистики и управления космическими аппаратами», проведенного автором в дистанционном режиме для студентов НИУ ВШЭ и других российских высших учебных заведений.