Современная электроника №9/2023
СОВРЕМЕННЫЕ ТЕХНОЛОГИИ 6 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА • № 9 / 2023 Заглянем под капот FX-RTOS Рис . 1. Разделение процессорного времени между задачами создаёт абстракцию параллельности их выполнения Многозадачность – ключевая функция операционных систем и главный фактор их возникновения как класса ПО . Использование операционных систем во встроенном программном обеспечении микроконтроллеров широко распространено , но полемика вокруг целесообразности этого подхода ведётся до сих пор , а сама тема сохраняет атмосферу загадочности . В статье разбирается многозадачность на примере ядра российской ОСРВ c открытым исходным кодом FX-RTOS Nanokernel Lite [1]. Рассматриваются технические решения , которые реализованы для удовлетворения потребностей систем реального времени . В данной статье практически не затрагивается взаимодействие потоков , прерывания , программные таймеры и другие аспекты . Но модульная архитектура позволяет , абстрагируясь от других компонентов , последовательно изучить каждую подсистему по мере необходимости . Понимание логики работы внутренних механизмов ОС , реализующих многозадачность , необходимо , чтобы создавать корректные и эффективные программы . Дмитрий Алексеев ( ЭРЕМЕКС ) Введение В этой статье будет говориться о мно - гозадачности как о многопоточности в том смысле , что на каждую задачу при - ходятся один или несколько потоков исполнения . Поток исполнения ( или « нить », от англ . thread) – часть про - граммы , выполняющаяся непрерывно , как будто на отдельном « виртуальном » процессоре параллельно другим пото - кам . Текущее состояние процессора характеризуется содержимым его реги - стров , называемым контекстом . C мена потока достигается за счёт переключе - ния контекста (Context Switch). В ходе исполнения нить неоднократно вытес - няется и продолжается с того места , где была прервана ( рис . 1). Набор правил , который определяет порядок выпол - нения задач , называется алгоритмом планирования . Процедура выделения процессора для потока , выбранного алгоритмом планирования , называ - ется диспетчеризацией [2, 3]. Программная реализация отдельных процессов , как правило , не применя - ется в микроконтроллерных ОС вви - ду отсутствия аппаратной поддержки виртуальной памяти и ограниченности ресурсов , и управление задачами сво - дится к планированию нитей . Потоки находятся в едином физическом адрес - ном пространстве , взаимодействуя через программные объекты , распо - ложенные в совместно используемой памяти . Рассмотрим классический пат - терн производитель – потребитель для двух нитей : один поток ( назовём его « производитель ») снимает информа - цию с датчика , обрабатывает и запи - сывает её в определённую структуру . Второй поток ( потребитель ) периоди - чески считывает эту структуру и ото - бражает в текстовом виде на дисплее . Допустим , такая схема взаимодействия работает безошибочно 99% времени , но в редких случаях на экране возника - ют ошибки вследствие того , что поток - потребитель забирает данные , ког - да они ещё не полностью записаны . Про такой алгоритм взаимодействия говорится , что он содержит гонки или условия гонок ( Race Condition ). Для того чтобы обеспечить коррект - ность доступа к общим данным , необ - ходимо упорядочить поведение пото - ков с помощью специальных объектов , предоставляемых ядром ОС : прими - тивов синхронизации . Один из таких объектов называется « семафор » – по аналогии с железнодорожным сема - фором , сигнализирующим о занятом участке пути [4]. Любые обращения потока к примитивам синхронизации , как и к другим службам ядра , выпол - няются через специальные процедуры : системные вызовы . Системный вызов может возвратить ответ одномомент - но либо заблокировать поток в ожида - нии запрошенного ресурса . Политики планирования Определением следующего потока исполнения и момента времени дис - петчеризации занимается компонент ядра ОС – планировщик . Алгоритмы планирования исходят из критерия выбора следующего потока , наиболее применимого в конкретном случае . Самые распространённые политики планирования : первым поступил – первым обслужен (FIFO), по наи - меньшему остающемуся времени до дедлайна (EDF), циклическое плани - рование (Round-Robin), частотно - моно - тонное планирование (RMS) [5]. Раз - работчики ОСРВ реализуют наиболее унифицированные алгоритмы , базиру - ющиеся на вытеснении текущего пото - ка наиболее высокоприоритетным и распределении времени между пото - ками одного приоритета . Такие пла - нировщики называются вытесняющи - ми . Одновременно может происходить передача управления между потока - ми одного приоритета по собственной инициативе ( кооперативное планиро - вание ). Если код потока инициирует передачу управления или блокирует - ся в ожидании некоторого события , диспетчеризация происходит неза - медлительно , планировщик выбирает следующий поток с наивысшим при - оритетом либо первый в очереди сре - ди потоков с одинаково высоким при - оритетом ( рис . 2). CPU0 CPU0 Многопроцессорная система CPU1 CPU2 Время Время Поток 1 Поток 1 Поток 2 Поток 3 Поток 2 Поток 3 Поток 1 Поток 2 Поток 3 Программные потоки на одном процессоре
RkJQdWJsaXNoZXIy MTQ4NjUy