Системы реального времени
Что такое системы реального времени
4 июня 1996-го. Ariane 5 взлетает. Через 37 секунд - взрыв. Причина: integer overflow в системе инерциальной навигации, скопированной с Ariane 4. Система не справилась с новым профилем полёта - и вместо graceful degradation выдала необработанное исключение. Стоимость: 370 миллионов. Boeing 737 MAX MCAS - система реального времени с ошибкой в логике приоритетов: датчик врал, а система верила ему, игнорируя пилота. 346 погибших. Разница между «быстро» и «реального времени» - не скорость, а гарантированная верхняя граница. ABS тормозит за 5-7 мс не потому что быстро, а потому что всегда укладывается в 5-7 мс. Пропустил дедлайн - машина не остановилась.
- **Ariane 5, 1996:** 370 млн сгорело за 37 секунд из-за пропущенного deadline в inertial reference system. Тот же код работал на Ariane 4 - но у Ariane 5 другой профиль ускорения, и число вышло за int16 boundary
- **ABS в каждой машине:** 5-7 мс от обнаружения блокировки до сброса давления - hard deadline. Программный стек: C + bare-metal RTOS. Никаких Java, никакого GC, никакого malloc в цикле управления
- **HFT (High-Frequency Trading):** ордер, пришедший через 101 мкс вместо 100, отправляется в /dev/null - цена уже другая. Firm RT. Именно поэтому биржевые серверы живут в одном здании с биржей (colocation) и соединены прямым оптоволокном
Hard Real-Time: дедлайн = закон
120 км/ч, мокрый асфальт. Колесо заблокировалось. ABS должна сбросить давление в тормозном цилиндре за **5-7 миллисекунд** - иначе машина потеряет управляемость. Не «лучше уложиться», не «желательно», а **обязательно**. Это и есть **hard real-time**: пропущенный дедлайн - это отказ системы, независимо от правильности вычисления.
| Система | Дедлайн | Последствия нарушения |
|---|---|---|
| ABS тормозов | 5 мс | Занос, авария |
| Кардиостимулятор | 10 мс | Остановка сердца |
| Подушка безопасности | 15 мс | Не раскроется вовремя |
| Управление ядерным реактором | 100 мс | Расплавление стержней |
| Автопилот самолёта | 50 мс | Потеря управления |
В **hard real-time** системах корректность определяется не только правильностью результата, но и **временем** его получения. Правильный ответ, полученный после дедлайна, считается ошибкой - такой же, как неправильный ответ.
Именно поэтому ABS-контроллер написан на C, а не на Java. GC-пауза в 50 мс в неудачный момент - и дедлайн пропущен. Кардиостимуляторы работают на C и Ada. Boeing 737 MAX использовал C, но с ошибкой в логике приоритетов: датчик угла атаки врал, MCAS ему верил, а пилоту - нет. Hard RT не прощает ошибок в логике так же, как не прощает опозданий.
Контроллер подушки безопасности рассчитал момент срабатывания, но опоздал на 50 мс. Результат?
Soft Real-Time: качество деградирует
YouTube, 60 FPS. Один кадр опоздал на 5 мс - небольшой рывок на экране. Два подряд - заметное подёргивание. Но видео продолжается, сервер не упал, никто не пострадал. Это **soft real-time**: пропущенный дедлайн деградирует качество, не ломает систему. Utility function - ценность результата - снижается после дедлайна, но не обрушивается в ноль.
| Система | Дедлайн | При нарушении |
|---|---|---|
| Видеозвонок | 33 мс (30 FPS) | Лаг, заикание видео |
| Онлайн-игра | 16 мс (60 FPS) | Фриз, teleporting персонажей |
| Стриминг музыки | 10-50 мс буфер | Заикание звука |
| GPS навигация | 1 сек обновление | Устаревшая позиция на карте |
| VoIP телефония | 150 мс | Эхо, задержка речи |
В **soft real-time** существует **функция ценности** (utility function): чем позже ответ, тем менее он полезен, но всё ещё имеет некоторую ценность. В hard RT ценность падает до нуля (или отрицательной!) мгновенно в момент дедлайна.
Онлайн-игра: сервер должен обработать действие игрока за 50 мс. Обработка заняла 200 мс. Что произойдёт?
Firm Real-Time: просроченное - в мусор
Биржа. Алгоритм принял решение о сделке за 95 мкс - отлично. Но исполнение пришло через 200 мкс вместо 100 - цена сдвинулась, арбитражная возможность закрылась. Результат не опасен, не деградирован - просто **бесполезен**. Ордер отправляется в /dev/null. Это **firm real-time**: ценность просроченного результата строго ноль.
| Тип | Нарушение дедлайна | Пример | Ценность просроченного |
|---|---|---|---|
| Hard RT | Катастрофа | ABS, кардиостимулятор | Отрицательная (опасно!) |
| Firm RT | Результат бесполезен | HFT, робот-сборщик | Ноль (бесполезно) |
| Soft RT | Деградация качества | Видеозвонок, игры | Положительная, но уменьшается |
**Firm RT** часто путают с hard RT, но разница критична: в hard RT просроченный результат **опасен** (подушка безопасности после удара), в firm RT - просто **бесполезен** (торговый ордер на уже изменившуюся цену). Firm RT допускает пропуск некоторого процента дедлайнов.
Роботизированный конвейер Toyota: деталь проезжает точку сборки за 500 мс. Опоздал - деталь ушла, конвейер не остановился, следующая придёт через секунду. Каждый пропуск - дефект продукции или потеря производительности. Не авария. Именно firm RT.
Метеостанция должна передать данные о температуре каждые 10 минут. Передача опоздала на 2 минуты. Какой тип RT?
Детерминизм: предсказуемость важнее скорости
Ariane 5 взорвался через 37 секунд. Inertial reference system работала прекрасно - 99.9% времени. Но в этот конкретный момент вылетел integer overflow, и вместо graceful degradation система выбросила необработанное исключение. 0.1% worst-case уничтожил 99.9% uptime. **В real-time нет статистики - есть только worst-case.** Алгоритм на 1 мс в среднем, но иногда 100 мс, хуже алгоритма, который всегда 10 мс.
| Источник недетерминизма | Причина | Решение в RT |
|---|---|---|
| Garbage Collection | GC-пауза 10-200 мс | Не использовать GC языки (C, Rust) |
| Virtual Memory (page faults) | Обращение к диску: ~10 мс | Заблокировать страницы в RAM (mlock) |
| Cache misses | L3 miss: ~100 нс | Partitioning кеша, prefetch |
| Dynamic memory (malloc) | Фрагментация, разное время | Статическая аллокация при старте |
| Interrupts от других устройств | Непредсказуемое время | Выделить ядра для RT (CPU isolation) |
**RTOS** (Real-Time Operating System): VxWorks, FreeRTOS, QNX - ОС, спроектированные для детерминизма. Они гарантируют максимальное время реакции на прерывание (interrupt latency < 10 мкс). Linux по умолчанию - не RT, но **PREEMPT_RT** патч превращает его в soft RT-систему.
Сервер на Core i9 с GC-языком vs STM32 за 2 доллара с bare-metal C. Средняя задержка сервера - 0.3 мс. Worst-case - 80 мс (GC-пауза). STM32 средняя - 8 мс. Worst-case - 9 мс. Для дедлайна 15 мс выбирают STM32. Не потому что дешевле - потому что предсказуемо. Именно этот принцип объясняет, почему в кардиостимуляторах не стоит Snapdragon.
Real-time = быстро. Чем мощнее процессор, тем более "real-time" система.
Real-time = предсказуемо и в срок. Медленная, но детерминированная система лучше быстрой, но непредсказуемой.
«Real-time» - это гарантированная верхняя граница времени реакции, не средняя скорость. JVM с GC выдаёт паузы до 200 мс - непредсказуемо. STM32 на 16 МГц, bare-metal, без ОС - worst-case 10 мс, и это доказуемо. Ariane 5 взорвался не потому что код был медленным, а потому что один edge case не был покрыт worst-case анализом. В RT единственный вопрос: «что происходит в худшем случае?» - не «что происходит в среднем?»
Для hard RT-системы контроля робота: Linux (среднее 0.5 мс, worst-case 50 мс) или FreeRTOS (среднее 5 мс, worst-case 6 мс)?
Ключевые идеи
- **Real-time = предсказуемо в срок, не быстро:** STM32 за 2 доллара выигрывает у сервера на 5 ГГц, если дедлайн 10 мс и у сервера GC-паузы до 50 мс
- **Hard RT - нулевая терпимость:** ABS, кардиостимулятор, управление ядерным реактором. Правильный ответ после дедлайна = неправильный ответ. Языки: C, Rust, Ada. Никакого GC
- **Soft RT - graceful degradation:** видеозвонок, игры, стриминг. Пропущенный кадр = дёрганье, не катастрофа. Utility function снижается плавно
- **Firm RT - просроченное бесполезно:** HFT, роботизированный конвейер. Результат после дедлайна не опасен и не деградирует - просто выбрасывается
Связанные темы
RT-системы объединяют знания из нескольких областей:
- Планирование: Rate Monotonic — Алгоритмы планирования задач с дедлайнами
- Worst-Case Execution Time — Анализ worst-case времени выполнения для гарантий дедлайнов
- Операционные системы — RTOS vs general-purpose OS - разные приоритеты проектирования
Вопросы для размышления
- Почему автомобильные контроллеры используют микроконтроллеры за $2, а не мощные процессоры за $200?
- Можно ли превратить обычный Linux в hard RT-систему? Что для этого нужно изменить?
- Вернёмся к началу: как ABS в вашей машине гарантирует реакцию за 5 мс, учитывая все возможные сценарии?
Связанные уроки
- emb-01 — Реал-тайм системы обычно работают на embedded железе: прерывания, RTOS, ограниченные ресурсы
- os-01-intro — RTOS - специализация ОС: детерминированный планировщик вместо fair-share, жёсткие deadline вместо throughput
- ds-01-intro — Distributed systems тоже требуют determinism и fault tolerance, но в масштабе сети, а не одного устройства
- arch-01-binary — Понимание pipeline, кеша и прерываний процессора критично для worst-case execution time анализа