- •Основная часть Определение и отличительные особенности осрв
- •Архитектурные решения осрв
- •Управление задачами и планирование
- •Управление памятью в условиях реального времени
- •Синхронизация задач и средства ее реализации
- •Проблема инверсии приоритетов
- •Протоколы наследования и граничных приоритетов
- •Мьютексы и семафоры: различия в защите от инверсии
- •Стандарты осрв и расширения posix
- •Заключение
- •Список источников
Управление задачами и планирование
Управление задачами в ОСРВ строится на принципе приоритетного вытеснения. Планировщик всегда отдает ресурсы процессора той задаче, которая имеет наивысший приоритет среди всех готовых к выполнению. Если в систему поступает прерывание, требующее запуска более приоритетного потока, текущая задача должна быть немедленно приостановлена. Для обеспечения реального времени используются алгоритмы с фиксированными приоритетами, такие как Rate Monotonic Scheduling (RMS), или динамические алгоритмы, например Earliest Deadline First (EDF). В отличие от систем общего назначения, в ОСРВ практически не применяется квантование времени в чистом виде для высокоприоритетных задач, так как это вносит неопределенность в момент завершения операции.
Важнейшими метриками планирования являются наихудшее время выполнения задачи (WCET) и джиттер – колебание времени запуска или завершения задачи. Система считается корректно спроектированной, если для всех критических задач сумма их WCET и накладных расходов на переключение контекста не превышает установленных временных рамок. При этом планировщик должен обеспечивать корректную обработку ситуаций, когда несколько задач имеют одинаковый приоритет, обычно используя круговой алгоритм (Round Robin) в рамках одного уровня приоритета, если это допустимо требованиями системы.
Управление памятью в условиях реального времени
Механизмы управления памятью в ОСРВ должны исключать любые операции, время выполнения которых невозможно предсказать. Основной проблемой традиционных ОС является виртуальная память с подкачкой страниц на диск, так как время доступа к внешней памяти на несколько порядков превышает время работы с ОЗУ и зависит от множества факторов. В системах жесткого реального времени виртуальная память либо отсутствует, либо используется ограниченно. Применяется механизм фиксации страниц (memory locking), который гарантирует, что критический код и данные всегда находятся в физической оперативной памяти.
Динамическое выделение памяти через стандартные функции типа malloc также является рискованным процессом из-за возможности фрагментации и неопределенного времени поиска свободного блока. Вместо этого в ОСРВ предпочтение отдается статическому распределению памяти на этапе компиляции или инициализации. Для нужд динамического выделения используются пулы блоков фиксированного размера. В такой модели время выделения блока памяти является константным, а фрагментация исключается за счет того, что все блоки идентичны. Кроме того, использование устройств аппаратной защиты памяти (MMU) в ОСРВ часто настраивается таким образом, чтобы защитить адресные пространства процессов друг от друга, не внося при этом существенных задержек при переключении контекста.
Синхронизация задач и средства ее реализации
В многозадачной среде неизбежно возникает необходимость синхронизации доступа к разделяемым ресурсам, таким как области памяти, устройства ввода-вывода или системные переменные. Проблемы синхронизации включают в себя состояния гонок, тупиковые ситуации (deadlocks) и неопределенность времени ожидания. Для решения этих задач ОСРВ предоставляют набор примитивов, среди которых особое место занимают мониторы и условные переменные. Монитор – это программная конструкция, которая инкапсулирует данные и методы доступа к ним, автоматически гарантируя взаимное исключение: в любой момент времени только один поток может выполнять код внутри монитора.
Условные переменные используются внутри мониторов для управления очередностью выполнения. Они позволяют задаче добровольно приостановить свое выполнение и освободить доступ к монитору до тех пор, пока не произойдет определенное событие. Это избавляет систему от активного ожидания (polling), которое нерационально расходует процессорное время. Когда одна задача изменяет состояние ресурса, она сигнализирует об этом через условную переменную, пробуждая одну или все ожидающие задачи. Такой механизм обеспечивает логическую целостность данных и детерминированную передачу управления между потоками.
