Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Операционные системы реального времени и технологии разработки кроссплатформенного программного обеспечения. Ч.1. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
2.3. Состояния процесса
31
Тупики появляются тогда, когда два или более процесса владеют
каждый своим ресурсом, но ожидают освобождения другого ресурса, кото­рым владеет “конкурент”.
Голодовка возникает тогда, когда один процесс монополизировал
процессор и никак не может его освободить.
Для устранения подобных проблем существуют различные меха­низмы, но общим в них является правило: никогда не допускается создание задачи, если ресурсов для выполнения недостаточно. Проблемой может здесь являться только ситуация, когда учтенный при создании процессов ресурс вдруг становится недоступным.
2.3. Состояния процесса
Сейчас все задачи и процессы делятся на три основные группы.
1. Процессы, которые решают поставленные задачи и у них есть все
необходимые активные и пассивные ресурсы и доступ к процессору.
2. Процессы, которые готовы к выполнению и у них есть все ре-
сурсы, но им не выделено процессорное время. Такие процессы называ­ются “кандидатами” на выполнение. Они находятся в режиме ожидания.
3. Неактивные процессы, которым не хватило ресурсов, даже пас-
сивных. Как правило, таким процессам вообще не будет выделено процес­сорное время.
В любом случае, над процессами могут проводиться следующие опе­рации со стороны операционной системы.
1. Создание процесса – переход из состояния “рождения” в состоя-
ние готовности.
2. Уничтожение процесса – переход из состояния ожидания или вы-
полнение в состояние “смерти”.
3. Восстановление процесса – переход из состояния готовности в
состояние выполнения.
4. Блокировка процесса – переход из состояния выполнения в со-
стояние ожидания.
5. Пробуждение процесса – переход из состояния ожидания в со-
стояние готовности.
2. Основные положения
32
6. Запуск процесса – переход из состояния готовности в состояние
выполнения.
Также следует отметить, что процессы не возникают “из ниот­куда”. Всегда существует “родительский” процесс, который создал теку­щий процесс.
Запущенный или созданный процесс называется “дочерним” (child) процессом или потомком. Процесс, который породил этот процесс, назы­вается “родителем” или “предком” (parent).
У любого процесса есть минимум два собственных идентификатора:
идентификатор процесса – PID (Process ID).
идентификатор родительского процесса – PPID (Parent Process ID).
На рис. 2 (а, б) ниже показана часть процессов операционной си­стемы с указанными идентификаторами и другими метриками.
а
Рис. 2. Пример таблицы процессов ОС:
а – левая часть дампа; б – правая часть дампа
2.3. Состояния процесса
33
б
Рис. 2. Окончание
Под потоками (нитями) будем понимать “облегченную” разновид-
ность процесса. Процессы, пришедшие во все операционные системы из “мира” UNIX-систем, плохо реализуются в многозадачной среде, так как они имеют тяжеловесный контекст и требуют полного переключения. Но­вая концепция легковесных процессов (потоков), воспринимаемых как “подпроцессы”, помогает реализовывать многозадачность, так как поток или нить выполняется в рамках и в контексте полновесного процесса.
С помощью потоков также можно реализовывать концепцию парал-
лельного выполнения программ. Кроме того, сейчас большинство про­грамм являются многопоточными, а большинство современных языков программирования имеют встроенные модули и функции для создания и
2. Основные положения
34
управления потоками. Причем потоки могут быть как именованными (пол­ноценными), так и анонимными, которые “погибают”, как только выполнят свою функцию, параллельно с остальной программой.
Каждая операционная система имеет свой механизм формирования потоков. Для UNIX-подобных систем это механизм “форков” (fork), для других “выполнений” (exec). Это необходимо учитывать при разработке кроссплатформенных приложений.
В любом случае есть два основных требования к потокам:
поток, выполняемый в контексте процесса, имеет возможность доступа к определенным ресурсам. Он расположен в виртуальном адрес­ном пространстве процесса. Кроме того, поток может иметь доступ к ре­сурсам за пределами процесса, с определенными ограничениями;
поток также подвержен диспетчеризации и, как следствие, изме- нениям порядка выполнения.
Владельцу ресурса (процесса, задачи) принадлежат: адресное про­странство, отдельный доступ к микропроцессору, доступ к другим процес­сам, файлам и ресурсам ввода-вывода.
Модулю диспетчеризации подчиняются: состояния выполнения по­тока и процесса, механизмы сохранения и загрузки контекста задачи, ин­струменты управления стеком и статической памятью для хранения пере­менных, ресурсы памяти и ресурсы самого процесса.
Все потоки в той или иной мере разделяют общие ресурсы. При этом изменения, вносимые одним потоком, становятся доступны другим потокам.
Преимущества потоков перед процессами следующие.
1. Потоки более легковесные и все используют адресное простран-
ство порождающего процесса, для них требуется меньше времени на пере­ключение.
2. Требуется меньше времени для завершения потока.
3. В пределах одного процесса коммуникационные расходы мини-
мальны, так как ресурсы делятся и данные, продуцируемые одним потоком, сразу же становятся известны другим потокам.
Операционная система реального времени, реализующая концеп­цию многопоточности, имеет следующие определенные преимущества.
1. В такой системе реакция или “отклик” приложений гораздо лучше,
чем у других систем. Сложные приложения всегда проектируются так, чтобы
2.4. Стандарты на операционные системы реального времени
35
часть задач выполнялась в фоне, т.е. в виде параллельных потоков. Напри­мер, хорошим тоном является разделение бизнес-логики приложения и алго­ритмов отрисовки интерфейса пользователя таким образом, чтобы логика, получение данных по сети, математические расчеты и сложные вычисления происходили в своих потоках, отдельно от графики. Пользователю не нужно ожидать завершения работы фонового процесса – данные “сами” появятся на графических элементах и “зависаний интерфейса” не будет.
2. Подобные ОС более эффективно используют возможности мно-
гопроцессорных систем. Производительность приложения может равно­мерно увеличиваться с ростом числа доступных ядер и процессоров благо­даря так называемому “горизонтальному масштабированию”, когда вычис­лительные алгоритмы в фоне занимают свободные ресурсы. Этот эффект становится более явным, если реализуемые программой алгоритмы хорошо распараллеливаются. Примером таких алгоритмов являются операции над матрицами.
3. Программы для ОС с многопоточностью имеют более высокое ка-
чество и лучшую структуризацию сразу на этапе проектирования. Это обу­словлено тем, что программа разрабатывается сразу с учетом многопоточно­сти, т.е. она представляется в виде набора нескольких слабозависимых алго­ритмических и программных единиц и уже не является монолитной.
4. ОС с поддержкой многопоточности более эффективно расхо-
дуют ресурсы. Этот эффект вызван тем, что программы, использующие бо­лее одного процесса, имеют доступ к общим данным посредством разделя­емой памяти и содержат более одного потока управления. При этом каж­дый поток видит полное адресное пространство и множество состояний в операционной системе.
2.4. Стандарты на операционные системы реального времени
Так как операционные системы – это такой же промышленный про-
дукт, как автомобиль, на них распространяется действие определенных стандартов. Долгое время единственным стандартом был легендарный
POSIX (IEEE Portable Operating System Interface for Computer
Environments, IEEE 1003.1/). Первый вариант стандарта появился еще в
2. Основные положения
36
1990 г. и распространялся на произведенные, начиная с 1970 г., операци­онные системы различного вида. Спецификация POSIX распространяется на механизмы взаимодействия прикладных программ и ядра операцион­ной системы. Стандарт POSIX является собирательным и включает в себя более чем 30 документов.
Для коммерческих систем наиболее распространены следующие три стандарта:
1003.1a;
1003.1b;
1003.1c.
Следует упомянуть, что начиная с 90-х гг. особого продвижения в стандартах ОС РВ не наблюдается. Возможно, это вызвано тем, что компь­ютерная техника развивается скорее по пути увеличения мощности и сте­пени интеграции, а научного прорыва и революционных технологий пока не наблюдается.
POSIX разработан в Америке, а в Европе существуют свои варианты стандартов, например, DO-178B или OSEK/VDX [OSEK].
На рис. 3 приведена структура системы стандартов POSIX.
POSIX был задуман как интерфейс между сервисами операционных систем, позволяющий создавать переносимые приложения. Сейчас POSIX является целым семейством стандартов с собирательным номером IEEE Std
1003.n.
Что касается этого стандарта, наиболее важные его части охваты­вают следующие особенности операционных систем реального времени. Рассмотрим некоторые из них в рамках 1003.1b:
Блокирование виртуальной памяти (1003.1b). Включено в стандарт вследствие широкого распространения виртуальной памяти в UNIX­системах. Раздел стандарта описывает механизмы работы программ, напря­мую не относящихся к реальному времени. Это в основном функции фик­сации или, другими словами, блокировки в памяти общего адресного про­странства процесса или отдельных его областей. Эти функции в основном используются в работе процессов, для которых критично время работы. Четкое соблюдение рекомендаций стандарта помогает сделать процессы более предсказуемыми.
2.4. Стандарты на операционные системы реального времени
37
Рис. 3. Стандарты POSIX
Синхронизация процессов (1003.1b). Является подразделом упомя-
нутого выше стандарта. В нем объясняются принципы использования се­мафоров-счетчиков для синхронизации процессов. Вся суть подхода за­ключается в том, что стандарт задает некоторое определенное простран­ство имен процессов, имена которых являются производными. Следует от­метить, что это пространство имен может совпадать с пространством имен файлов, но это не обязательно. Семафоры-счетчики здесь – это обобщенное понятие для элементов механизма синхронизации, контролирующего взаи­моисключающий доступ к разделяемым ресурсам, а также формирование и обработку сигналов этой синхронизации.
Разделяемая память (1003.1b). Данный раздел стандарта описывает
методы работы с разделяемой памятью, которые особенно важны в том
2. Основные положения
38
случае, когда процессы делят между собой части физической памяти. Это происходит чаще всего с приложениями реального времени, которым тре­буется обработать большие объемы данных.
Сигналы реального времени (1003.1b). События в ОС РВ не теря­ются потому, что, согласно этой части стандарта, они помещаются в оче­редь, как и задачи. Номер сигнала в очереди также служит индикатором приоритета. Необработанные задачи извлекаются из очереди и отправля­ются на выполнение. Сигналы реального времени содержат дополнитель­ное поле с данными. Оно служит для передачи информации между генера­тором сигнала и его обработчиком. Кроме всего прочего, это поле может использоваться и для идентификации сигнала в очереди.
Взаимодействие процессом (1003.1b). Каждое сообщение имеет до­полнительное поле приоритета, также принадлежащее пространству имен, определяемое стандартом. Передача сигналов и сообщений, а также их об­работка может блокироваться и разрешаться вновь. При этом передача и получение сообщений никак особо не синхронизируются. Это значит, что отправитель сообщения не ждет, когда оно будет взято из очереди и обра­ботано. Следует упомянуть, что очереди сообщений часто используются и на прикладном уровне, внутри программных комплексов, части которых имеют слабую связь.
Таймеры (1003.1b). Синхронизация и очередность событий в си­стеме реализуется при помощи таймеров и счетчиков. При этом таймеры могут быть не только аппаратные, но и программные. В этом случае си­стема должна обеспечивать действительно “реальное” время работы, чтобы периоды таймера были равной величины. Таймеры могут работать в раз­личных режимах. Например, наследуется принцип работы старых таймеров микропроцессорного комплекта i8086: генератор и делитель частоты, еди­ничного импульса, меандра.
Асинхронный ввод-вывод (1003.1b). Стандарт определяет работу процессов ввода-вывода вместе с прикладными задачами. Ввод и вывод данных обычно являются асинхронными операциями и инициируются дан­ными приложения. Когда операция завершается, может генерироваться до­полнительный сигнал, который также может начинать другие события.
В сравнении с рассмотренным выше стандартом, европейский ана­лог DO-178B создан Радиотехнической комиссией по аэронавтике (RTCA,
2.5. Основные требования к операционным системам реального времени
39
Radio Technical Commission for Aeronautics). Изначально он использовался для бортовых систем авиации. В большей степени этот стандарт ориенти­рован на сохранение уровня безопасности систем, поэтому он сейчас ис­пользуется, например, для стандартизации уровней отказов ОС и приклад­ного программного обеспечения.
Он включает пять уровней безопасности и требует соблюдения норм
каждого пункта: катастрофический (А), опасный (В), существенный (С), несущественный (D) и не влияющий (Е).
Другим дополнительным стандартом для POSIX является стандарт
ARINC-653, разработанный компанией ADINC в 1997 г. Он регламенти­рует универсальный программный интерфейс APEX между операционной системой и прикладным программным обеспечением. В стандарте подра­зумевается, что прикладное программное обеспечение может осуществлять контроль диспетчеризации, связывание и изменение состояния внутренних элементов.
Стандарт APEX обновился в 2003 г. и стал включать в себя обнов-
ленную архитектуру изолированных виртуальных машин.
Существует стандарт OSEK/VDX, являющийся собирательным. Он родился в отрасли автомобилестроения среди компаний BMW, Bosch, Daimler Benz, Opel, Siemens, и Volkswagen, Renault, а также нескольких ин­ститутов. Первоначально стандарт предназначался для построения про­граммных интерфейсов API. Он получился настолько обширным и аб­страктным, что вышел за рамки автомобильной отрасли. Состоит из четы­рех основных частей: стандарт операционной системы, коммуникацион­ный стандарт, стандарт сетевого менеджера, а также специальный описа­тельный язык для реализации стандарта.
2.5. Основные требования к операционным системам реального времени
Исходя из приведенного выше материала, можно сформировать следующие основные требования для операционной системы реального времени.
1. ОС РВ должна быть многозадачной, т.е. реализовывать концеп-
цию многопоточности и обрабатывать прерывания.
2. Основные положения
40
2. ОС РВ должна быть предсказуемой, т.е. для любого штатного про-
цесса должно быть определено максимальное время реакции на событие и максимальное время, за которое эта реакция должна быть реализована.
3. ОС РВ должна иметь планировщик задач. Планировщик должен
иметь возможность создать любой процесс, направить на выполнение и прервать его.
4. ОС РВ должна реализовывать концепцию потоков и приорите-
тов. Любой активный элемент системы должен иметь приоритет.
5. ОС РВ должна иметь механизм выделения, распределения и кон-
троля ресурсов. В идеале ОС отдает ресурс согласно требованиям потреби­теля и его приоритетом, а также определяет крайний срок его использова­ния. Для этого в ОС должны быть четко определены и заранее известны временные интервалы выполнения различных действий программ. На са­мом деле это практически невозможно, поэтому данный принцип действует с ограничениями. Для каждой задачи вводится понятие уровня приоритета, и временные ограничения затем сводятся к управлению приоритетами. Управление реализуется через расписание, методы случайного доступа и имитационное моделирование.
6. ОС РВ должна поддерживать механизмы синхронизации. Задачи
должны общаться друг с другом, если они разделяют какие-либо ресурсы.
7. ОС РВ должна поддерживать механизмы наследования приори-
тетов. Здесь имеется в виду повышение приоритета до уровня вызываю­щего потока. Наследование означает, что блокирующая ресурс нить насле­дует приоритет блокируемой нити (справедливо лишь в том случае, если блокируемая нить имеет более высокий приоритет).
8. ОС РВ должна иметь директивный, т.е. определенный срок вы-
полнения задачи. Этот срок называется “дэдлайн” (deadline). Еще раз напомним, что выполнение любой задачи должно занимать не более опре­деленного временного интервала.
9. ОС РВ должна иметь регулированный разброс значений, называ-
емый “джиттером” (jitter). В среднем, по статистике, этот разброс сходится к одному значению. В хорошей системе джиттер стандартизирован и ми­нимален.
10. ОС РВ должна иметь определенную латентность (latency). Это за-
держка системы. Значение латентности должно быть минимальным. К ми­нимизации этой величины сводится процесс оптимизации ОС.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]