операционная система реального времени
Многие считают, что операционная система реального времени (ОСРВ) — это «очень быстрая ОС». Это неверно.
Многие считают, что операционная система реального времени (ОСРВ) — это «очень быстрая ОС». Это неверно. Быстродействие само по себе не гарантирует предсказуемости. Обычная ОС может работать быстрее в среднем, но иногда давать непредсказуемо большие задержки. ОСРВ же даёт гарантию: операция будет выполнена не только быстро, но и в строго определённый, известный заранее интервал времени. Это свойство называется детерминизмом. Именно оно отличает ОСРВ от систем общего назначения.
Основные области применения операционных систем реального времени
Критерии выбора ОС РВ следующие
[]
Стандарты на операционные системы реального времени
Page 40; Quoting: Основные требования к операционным системам реального времени
Page 42; Quoting: Параметры и характеристики операционной системы реального времени
1. Детерминизм против средней производительности
- Обычная ОС (Windows, Linux без PREEMPT<sub>RT</sub>, macOS) оптимизирована для высокой средней пропускной способности. Может «задуматься» на десятки или сотни миллисекунд из-за кэширования, свопинга, фоновых процессов.
- ОСРВ жертвует средней производительностью ради минимальной и предсказуемой максимальной задержки. В жёсткой ОСРВ время ответа на прерывание никогда не превысит заданную величину (например, 10 микросекунд).
2. Планировщик: приоритеты и вытеснение
- Обычная ОС: используется планировщик с динамическими приоритетами, часто с «честным» распределением времени (fair scheduling). Высокоприоритетная задача может ждать, пока низкоприоритетная не завершит свой квант.
- ОСРВ: строго приоритетное вытесняющее планирование. Задача с более высоким приоритетом немедленно вытесняет текущую, даже если та находится в середине системного вызова. Это обеспечивается механизмом прерываний ядра (kernel preemption).
3. Механизмы синхронизации и приоритетная инверсия
- Обычная ОС: стандартные мьютексы могут приводить к приоритетной инверсии — когда высокоприоритетная задача неявно блокируется низкоприоритетной, захватившей общий ресурс. Это вносит непредсказуемые задержки.
- ОСРВ: реализуют протоколы предотвращения инверсии:
- Приоритетное наследование (priority inheritance) — задача-захватчик временно получает приоритет ожидающей высокой задачи.
- Протокол потолка приоритетов (priority ceiling) — назначается максимальный приоритет, с которым ресурс может быть захвачен.
4. Управление памятью: отказ от свопинга
- Обычная ОС: активно использует виртуальную память, подкачку (swap), кэширование. Страница может быть выгружена на диск, что вызывает непредсказуемую задержку при обращении.
- ОСРВ: либо не использует виртуальную память вовсе, либо применяет закрепление страниц (wire‑locking) — все страницы памяти критических задач фиксируются в ОЗУ, свопинг запрещён.
5. Обработка прерываний
- Обычная ОС: обработчики прерываний могут выполняться долго, откладывая другие прерывания. Часть работы переносится в «нижние половины» (tasklets, softirq), которые не имеют жёстких приоритетов.
- ОСРВ: обработчики прерываний максимально короткие — только фиксация факта. Вся логика передаётся выделенной высокоприоритетной задаче. Это называется threaded interrupts.
6. API и системные вызовы
- Обычная ОС: множество системных вызовов с переменным временем выполнения (сетевые, файловые, GUI). Сложно предсказать время.
- ОСРВ: предоставляют минимальный, детерминированный набор API: семафоры, очереди сообщений, таймеры, управление памятью. Время выполнения каждого вызова ограничено сверху и известно.
7. Отладка и анализ
-
Обычная ОС: профайлеры показывают средние значения, «горячие точки». Не дают гарантий.
-
ОСРВ: используются специализированные инструменты для статического анализа времени выполнения (WCET — Worst-Case Execution Time). Код должен быть проанализирован на предмет худшего случая.
-
Жёсткие (Hard Real-Time): Нарушение сроков влечет катастрофические последствия (системы управления тормозами, авионика, медицинские аппараты).
-
Твёрдые (Firm Real-Time): Пропуск срока снижает полезность результата, но не приводит к катастрофе (системы обработки мультимедиа).
-
Мягкие (Soft Real-Time): Допустим процент нарушений при сохранении среднего качества обслуживания (видеоконференции, онлайн-игры).
Приведённые значения — типичные для реальных систем при тактовой частоте ~100–200 МГц для микроконтроллеров и 1–3 ГГц для процессоров общего назначения. Цифры включают аппаратную задержку + программный пролог обработчика + переключение контекста.
| Архитектура | Пример ОСРВ | Типичная макс. задержка (мкс) | Примечание |
|---|---|---|---|
| ARM Cortex-M0+ (48 МГц) | FreeRTOS | 3–5 | Без FPU, простое ядро |
| ARM Cortex-M4 (168 МГц) | FreeRTOS / Zephyr | 1.5–2.5 | С поддержкой MPU |
| ARM Cortex-M7 (400 МГц) | FreeRTOS + cache | 0.8–1.2 | Кэш увеличивает разброс |
| ARM Cortex-A53 (1.2 ГГц) | Linux PREEMPT<sub>RT</sub> | 15–30 | Связано с TLB, кэшем, многоядерностью |
| x86<sub>64</sub> (2.5 ГГц) | Linux PREEMPT<sub>RT</sub> | 10–25 | Зависит от чипсета и ACPI |
| x86<sub>64</sub> (2.5 ГГц) | QNX | 2–5 | Микроядро, оптимизированные драйверы |
| PowerPC e500 (1 ГГц) | VxWorks | 1–3 | Используется в авионике |
| RISC-V (100 МГц) | FreeRTOS | 2–4 | Зависит от реализации CLIC/PLIC |
| ARM Cortex-R5 (lockstep) | INTEGRITY | 0.5–1 | Специализированный для безопасности, без кэша |
| Тактовая частота | Задержка прерывания (FreeRTOS, Cortex-M) | Задержка (Linux PREEMPT<sub>RT</sub>, x86) |
|---|---|---|
| 32 МГц | 8–12 мкс | — |
| 100 МГц | 2.5–4 мкс | — |
| 400 МГц (Cortex-M7) | 0.8–1.2 мкс | — |
| 1 ГГц (ARM Cortex-A) | — | 30–50 мкс |
| 3 ГГц (x86<sub>64</sub>) | — | 8–15 мкс |
Сравнение обработки прерывания в обычной ОС и ОСРВ
Обычная ОС (Linux без PREEMPT_RT):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Событие → Прерывание → Долгий обработчик → Планировщик → Задача
(IRQ) (100 мкс) (возможна задержка >1 мс)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ОСРВ (FreeRTOS / QNX):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Событие → Короткий обработчик (5 мкс) → Планировщик (1 мкс) → Задача (немедленно)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Приоритетная инверсия и её решение (протокол наследования)
Без протокола:
Высокий приоритет (H) ──────XXX────────────────
Средний приоритет (M) ──────────────────XXX───
Низкий приоритет (L) ──XXX───────────────────
Ресурс ────[ L захватил ]──────[ H ждёт → инверсия ]
С протоколом наследования:
Высокий приоритет (H) ──────[ ожидание ]──────
Средний приоритет (M) ──────────────── (не вытесняет, пока L наследует приоритет H)
Низкий приоритет (L) ──XXX[ наследует H ]────[ отпускает ресурс ]
Диаграмма вытеснения задачи в ОСРВ
Задача A (приоритет 1, самый низкий) ████████████████████ (выполняется)
Прерывание ^ (произошло)
Обработчик прерывания (короткий) █ (1-2 мкс)
Задача B (приоритет 10, высокий) ███████ (вытесняет A)
Задача A (возврат) ████
Время →─────────────────────────────────────────────────────────────────►
Визуализация разброса задержек для разных систем
0 10 20 30 40 50 60 70 80 90 100 мкс
├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
FreeRTOS (Cortex-M4) █ (1.5-2.5)
QNX (x86) ██ (2-5)
Linux PREEMPT_RT (x86) ████████ (10-25)
Windows 10 IoT (with RT) █████████████ (15-40)
Специализированные встраиваемые ОСРВ
- Класс A: простые, очень малый footprint (единицы КБ). Вытесняющее ядро, семафоры, очереди. Предсказуемое поведение на голом железе.
- Класс B: более функциональные, с поддержкой сетевых стеков, файловых систем, многозадачности с равными приоритетами. Могут работать на микроконтроллерах с MPU.
Проприетарные ОСРВ для критических систем
- Отличаются наличием сертификационных пакетов (DO-178C, ISO 26262, IEC 61508). Обеспечивают пространственную и временную изоляцию задач. Используются в авионике, автомобилях, медицинском оборудовании.
ОС общего назначения с расширениями реального времени
- Linux + PREEMPT<sub>RT</sub>: патч, превращающий Linux в вытесняемое ядро с задержками 10–50 мкс. Годится для твёрдого реального времени.
- Xenomai: двухъядерная архитектура (микроядро + Linux). Даёт задержки 1–10 мкс, но сложнее в настройке.
- FreeBSD: упреждающая многозадачность ядра (KERN<sub>PREEMPTION</sub>), но нет полноценного вытеснения в критических секциях. Используется в мягком реальном времени.
- Windows: собственная ОСРВ отсутствует. Однако отдельные встраиваемые продукты (например, Azure RTOS) представляют собой классическую ОСРВ для микроконтроллеров.
Многоядерность и детерминизм
Одноядерные ОСРВ легче анализировать. На многоядерных системах возникают:
- Конкуренция за кэш и шину памяти;
- Непредсказуемость, на каком ядре возникнет прерывание;
- Необходимость использования блокировок с приоритетным наследованием, которые сложнее реализовать корректно.
Решения: привязка прерываний к конкретным ядрам (IRQ affinity), разделение кэша (cache partitioning), использование асинхронных межъядерных сообщений.
Формальная верификация
Для жёсткого реального времени тестирования недостаточно. Применяются:
- Проверка моделей (model checking) — например, UPPAAL для временных автоматов.
- Дедуктивная верификация — математическое доказательство корректности планировщика.
Наиболее известный пример верифицированного ядра — seL4 (микроядро, доказанное в Isabelle/HOL).
Ресурсные ограничения
ОСРВ нередко работают на устройствах с 32 КБ ОЗУ или менее. Поэтому:
- Ядро должно быть модульным и масштабируемым.
- Динамическое выделение памяти (malloc) часто запрещено или разрешено только на этапе инициализации.
- Стек каждой задачи выделяется статически, его переполнение недопустимо.
Операционные системы реального времени интересны не «скоростью», а предсказуемостью. Они позволяют строить системы, где время — такой же ресурс, как память или процессор, и его можно распределять и гарантировать. Отличие от обычных ОС лежит в архитектурных решениях: вытесняемость ядра, протоколы синхронизации, отказ от свопинга, анализ WCET. Понимание этих различий критически важно при выборе платформы для систем, где опоздание недопустимо.