Загрузил leonid.merkin

Современный C++ для высоконадежных вычислений: Учебная программа

Современный 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++ для задач космической баллистики и управления космическими аппаратами»,
проведенного автором в дистанционном режиме для студентов НИУ ВШЭ и других российских
высших учебных заведений.