Разработка сред управляемого исполнения на примере виртуальной машины Java Занятие 8 Салищев С.И. Использование Java в системах реального времени (Real-Time) Системы реального времени Стандартные проблемы Проблемы специфичные для сред управляемого исполнения JSR1 Real Time Java Особенности компиляции Метроном Системы реального времени Жесткое реальное время (Hard RT) Завершение операции после наступления крайнего срока является бесполезным. управление оборудованием, протоколы передачи данных низкого уровня, обработка звуковых сигналов. Несоблюдение крайнего срока может привести к поломке оборудования, потере данных, неприемлемым искажениям сигнала. Мягкое реальное время (Soft RT) Завершение операции после наступления крайнего срока является допустимым при условии ограниченного количества таких событий Сетевые сервисы, потоковое видео, видеоигры Существуют механизмы обработки задержек: пропуск кадра, повторный запрос и т.д. Метрики Минимальная/Средняя Утилизация Мутатора (Minimum Mutator Utilization) Минимальное/среднее соотношение времени исполнения пользовательского и системного кода за максимальное/среднее время отклика Независимая от приложения метрика производительности Максимальное/Среднее время отклика максимальное/среднее время реакции на внешнее событие Сумма времени обработки в пользовательском коде и задержки создаваемой системой Минимальная память Количество памяти необходимое системе для сохранения временных метрик Стандартные проблемы Детерминированное планирование нитей Код нити не может прерываться в произвольных местах Строгий порядок передачи управления между нитями Синхронизация Детерминированная передача управления при синхронизации Строгий порядок очередности ожидающих нитей Защита от инверсии приоритетов Управление памятью Детерминированное время выделения памяти Детерминированное время обращения к памяти Защита от фрагментации и выгрузки памяти Real-Time OS Примеры: RTLinux, QNX, RTOS, VxWorks Особенности Невытесняющее планирование нитей Строгая семантика приоритетов нитей Упорядоченная синхронизация (fair locks) Запрет выгрузки памяти Наследование приоритетов Недостатки Дополнительные затраты на синхронизацию Ограниченная масштабируемость Убегающие нити (Runaway threads) Невытесняющее планирование Приоритеты … Нити Инверсия и наследование приоритетов Стандартные техники программирования Статическое выделение памяти Все объекты выделяются перед стартом основного цикла обработки событий Обработка пропусков крайнего срока (watchdog) Обнаружение повисания системы Рестарт нитей обработки событий Обработка повышенной загрузки ЦП одной нитью Обнаружение убегающих нитей Рестарт нити Проблемы специфичные для сред управляемого исполнения Сборка мусора Задержки при останавливающей сборке мусора Невозможность выделить достаточный объем памяти без сборки мусора JIT компиляция Недетерминированная производительность Задержки компиляции Загрузка классов Ленивая загрузка и верификация классов во время исполнения JSR1 Real-Time Java Реализации: Sun Java RTS, IBM WebSphere Real Time, Apogee Aphelion, TimeSys RTSJ Планирование Невытесняющее планирование Строгая семантика приоритетов Наследование приоритетов Управление памятью Бессмертная память Контекстная память Нити Нити реального времени без кучи Нити реального времени Крайние сроки JSR1 Real-Time Java 2 Синхронизация Неждущие (lock free, wait free) очереди Время и таймеры Периодические события Часы повышенной точности Асинхронная обработка событий Обработка периодических событий Обработка системных сигналов Обработка пропущенных крайних сроков Обработка пользовательских событий Типы памяти Бессмертная память Класс ImmortalMemory Служит для статического выделения бессмертных разделяемых объектов Контекстная память Класс ScopedMemory Служит для выделения объектов с ограниченным временем жизни без использования сборки мусора Контексты образуют иерархию Для освобождения контекста используется подсчет ссылок Обычная куча Использует сборку мусора Возможные ссылки Stored In Reference to Heap Reference to Immortal Reference to Scoped null Heap Permit Permit Forbid Permit Immortal Permit Permit Forbid Permit Scoped Permit Permit Local Variable Permit Permit Permit, if the reference is from the same scope, or an outer scope Permit Permit Permit Возможные ссылки 2 Heap D Outer scope A Immortal area Inner scope B C E Типы нитей Нить реального времени без кучи Класс NoHeapRealtimeThread Может использовать только контекстную и бессмертную память Не останавливается для сборки мусора Не вытесняется при планировании Обеспечивает наилучшее время реакции Используется для обработки событий с коротким жестким крайним сроком Сложности при программировании Типы нитей 2 RealtimeThread Класс RealTimeThread Не вытесняется при планировании Останавливается для сборки мусора Время реакции определяется свойствами сборки мусора Используется для обработки периодических событий с ограниченным крайним сроком Использование мало отличается от обычных нитей Обычные нити Класс Thread Вытесняется при планировании Останавливается для сборки мусора Для нетребовательных к времени реакции задач Особенности компиляции JIT компиляция Ресурсы на компиляцию Изменение производительности с течением времени Требуется прогрев AOT компиляция Невозможность межпроцедурной оптимизации Усложнение развертывания Постоянная производительность Метроном Алгоритм сборки мусора реального времени с доказанными временными характеристиками Достижимые значения метрик для однопроцессорной системы Максимальная задержка сборки мусора – 1ms Минимальная утилизация мутатора на интервале 10ms – 70% Метроном 2 Метроном: особенности алгоритма Явное разделение квантов времени между пользовательским кодом и сборкой мусора (тик-так) Выделение памяти при помощи сегрегированных списков свободных блоков Инкрементальная разметка очистка, вариант слепок на старте Дефрагментация при помощи эвакуации в заполненный блок Использование Read Barrier для отслеживания обращений к старой версии объекта при эвакуации Разбиение массивов на блоки (1Mb) для уменьшения фрагментации