СРВ    

  Практика ~ 
  Тема 01 ~ 
  Тема 02 ~ 
  Тема 03 ~ 
  Тема 04 ~ 
  Тема 05 ~ 
  Тема 06 ~ 
  Тема 07 ~ 
  Тема 08 ~ 
  Тема 09 ~ 
  Тема 10 ~ 
  Тема 11 ~ 
/Студентам/СРВ/Тема 06

Тема 6
Операционные системы реального времени

В этой лекции будут рассмотрены такие вопросы как особенности ОСРВ, требования к ОСРВ и др. Но прежде приведем некоторые сведения из теории ОС вообще. В тексте будут использоваться следующие аббревиатуры: ОС - операционная система, ОСРВ - операционная система реального времени, ОСОН - операционная система общего назначения.

Операционные системы

С точки зрения программиста, разрабатывающего ОС, ОС - это система управления ресурсами (ЭВМ). Под "ресурсами" понимается процессорное время, оперативная память, устройства ввода-вывода, долговременного хранения данных и т.п. Ресурсы "предназначены" для использования прикладными программами. Задачей ОС является предоставление прикладным программам ресурсов таким образом, чтобы достигалась некая цель, например, достижение наибольшей эффективности использования ЭВМ, обеспечение наилучшей реактивности системы и пр.

С точки зрения программиста, разрабатывающего прикладные программы, ОС - это своего рода "черный ящик", воображаемая, абстрактная ЭВМ, а её (ОС) задачей является предоставление программисту удобных средств для работы с реальной аппаратурой. Например, для того, чтобы прочитать данные с накопителя на жестких дисках, программист использует ряд системных вызовов (например, в Unix - open(), read(), write(), close() и др.) с использованием абстракций "каталог", "файл" вместо того, чтобы "вручную" позиционировать головки привода накопителя, включать и выключать его двигатель и пр. Все эти низкоуровневые действия выполняет "по просьбе" прикладной программы ОС.

Мы остановимся здесь только на некоторых аспектах проектирования ОС. Во-первых, рассмотрим диаграмму состояний задач (процессов,нитей) в многозадачных средах:

Picture: task states

На этой диаграмме показаны состояния процессов и переходы между этими состояниями. Состояние READY (ГОТОВА) - это состояние, когда задаче для продолжения работы не требуется ничего, кроме процессорного времени. Все задачи в этом состоянии образуют очередь. Когда планировщик задач выбирает какую-либо задачу из этой очереди, эта задача переходит в состояние RUNNING (ИСПОЛНЯЕТСЯ). Из этого состояния задача может перейти либо обратно в состояние READY (этот переход называется "вытеснение"), либо в состояние BLOCKED (ЗАБЛОКИРОВАНА). Это состояние также называют SLEEPING, WAITING, SUSPENDED. Это такое состояние, когда задаче для продолжения работы, помимо процессорного времени, требуется еще какой-то ресурс или данные.

Обратите внимание на переход, помеченный словом "SYSCALL". Это обращение к операционной системе, системный вызов. Совершая этот вызов, задача переходит из пользовательской фазы в системную фазу. При этом важно, может ли быть задача вытеснена только тогда, когда она находится в пользовательской фазе или же на возможности вытеснения не сказывается, в какой именно фазе работает задача.

Если вытеснение задачи возможно из любой фазы, тогда ядро ОС называют вытесняемым (англ. "preemptable", от "preempt", то есть "вытеснять"). В противном случае (вытеснение возможно только из пользовательской фазы) ядро ОС называют невытесняемым.

Во-вторых, уделим некоторое внимание проблемам, связанным с зависимостями между задачами. Как говорилось в Лекции 2, у задач могут иметь место 2 типа зависимостей - это ограничения на порядок исполнения и критические секции. Здесь мы будем говорить только о критических секциях. Напомним, что теория планировщиков, изложенная в предыдущих лекциях, базировалась на предположении, что все задачи независимы. На практике обычно имеет место обратное и это привносит определенные сложности в проектирование как ядер ОСРВ, так и приложений РВ.

Определение. Критическая секция - участок программного кода, в котором задача работает с каким-либо общим ресурсом.

Под словом "общий" подразумевается, что тот или иной ресурс используется не только данной задачей, но и другими. Примерами таких ресурсов могут выступать структуры данных в памяти, внешние устройства и др. (примеры...связанный список)

Во время исполнения критической секции задачу нельзя вытеснять, так как это может привести к нарушению целостности ресурса, неправильному функционированию устройств, получению неправильных результатов и прочим нежелательным последствиям. Точнее, нельзя давать управление задачам, которые используют этот же ресурс. Недопущение нахождения более чем одной задачи внутри критической секции обычно называют "синхронизацией", хотя, возможно, этот термин не совсем удачен. Среди средств синхронизации можно упомянуть следующие:

Особенности ОСРВ и их отличия от ОСОН

Параметры ОСРВ

Первый параметр есть промежуток времени, который проходит с момента, когда на процессор поступил сигнал "запрос на прерывание" и до момента, когда начала исполняться первая инструкция обработчика прерывания. "Природа" этой величины такова. В коде ядра имеются участки, которые исполняют все задачи (критические секции); во время исполнения этих участков ОС запрещает все прерывания. Если в этот время возникнет какое-то прерывание от внешнего устройства, оно не будет обработано до тех пор, пока ОС не разрешит прерывание. Максимальный по длительности такой участок и определяет описываемую величину. Отметим, что так называемое "аппаратное время реакции на прерывание", которое представляет собой максимальную длительность исполнения инструкции процессором (тут следует помнить, что процессоры физически не могут отложить выполнение инструкции, они всегда выполняют ее до конца и во время ее исполнения не реагируют на прерывания), гораздо меньше, чем "время реакции на прерывания" ОС. Последняя величина на более или менее современных архитектурах составляет примерно 4-8 мксек. Если же оценить аппаратное время реакции на прерывание, то при тактовой частоте, скажем, 100 МГц (для микроконтроллеров это будет сильно завышено, а для ЭВМ - занижено) и самой "долгой" инструкции, требующей, скажем, 10 тактов, то получим 100 нсек, что примерно в 500 раз меньше, чем время реакции на прерывание ОС. Это связано с тем, что критические секции в коде ядра ОС могут составлять весьма значительное количество инструкций процессора.

По поводу второго параметра можно сделать следующие замечания

В качестве отступления отметим, что ОС, основанные на микроядрах, более удобны для разработки и более гибки в сопровождении, они легче масштабируются, то есть перестраиваются под конкретную задачу.

Требования к ОСРВ. Стандарт POSIX на ОСРВ

ОСРВ должны удовлетворять следующим требованиям:

Необходимость первого требования самоочевидна: поскольку ядро должно иметь возможность дать управление той задаче, которая больше всего в этом "нуждается", то оно должно иметь возможность вытеснять задачи независимо от того, в какой фазе, системной или пользовательской (см. рисунок выше), они работают в данный момент.

Инверсия приоритетов. Наследование приоритетов

Остановимся подробнее на 4-ом требовании. Для этого введем понятие "инверсии приоритетов". В простейшем случае под этим понимается следующая ситуация.

Прямая инверсия

Пусть у нас имеется две _зависимых_ задачи с разными приоритетами. Тогда может случиться так, что задача с более низким приоритетом, заняв общий ресурс, вынудит задачу с более высоким приоритетом ждать до тех пор, пока ресурс не освободится. Иными словами, из-за зависимости между задачами более приоритетная задача не может вытеснить менее приоритетную несмотря на свой более высокий приоритет. Из-за этого более приоритетная задача может пропустить свой крайний срок. Избежать прямой инверсии можно только одним единственным способом - сделать задачи независимыми.

Косвенная инверсия

Ситуация еще более усугубляется в случае, если еще имеется хотя бы одна задача с приоритетом, промежуточным между двумя данными и _независимая_ от них. Тогда эта третья среднеприоритетная задача может вытеснить низкоприоритетную в то время, когда она заняла ресурс, нужный также высокоприоритетной задаче. Получается, что третья задача не может быть вытеснена более приоритетной из-за того, что ожидает освобождения ресурса, используемого низкоприоритетной задачей, а эта последняя не может его освободить, так как вытеснена среднеприоритетной задачей.

В связи с этим нередко упоминают неприятную историю, произошедшую с марсоходом MarsPathFinder...

Для недопущения подобных ситуаций предлагаются так называемые механизмы "наследования приоритетов". Разработчики таких механизмов должны уделять внимание следующим вопросам:

Почему эти вопросы важны, мы увидим из рассмотрения одной схемы наследования приоритетов, которая выглядит следующим образом:

Когда задача T1 пытается занять ресурс R, уже занятый к этому моменту менее приоритетной задачей T2, приоритет задачи T2 повышается до приоритета задачи Т1. Когда задача T2 освобождает ВСЕ ресурсы, ее приоритет становится равным первоначальному.

Именно такой механизм реализован во многих ОСРВ. Посмотрим, решает ли он проблему инверсии приоритетов. При этом будем придерживаться предположения, что чем меньше номер задачи, тем больше ее приоритет. Вот два возможных сценария развития событий, демонстрирующих недостатки приведенной схемы наследования приоритетов [Victor Yodaiken].

Пусть имеется 4 задачи, T1-T4, причем задачи Т1 и Т4 имеют общий ресурс В. События могли развиваться в следующей последовательности:

Получается, что задача Т4 какое-то время будет "незаконно" иметь приоритет, превышающий приоритеты задач Т2 и Т3, что, является, по сути, инверсией приоритетов и может привести к тому, что задачи Т2 и Т3 не успеют отработать до своих крайних сроков.

Пусть опять имеется 4 задачи, причем Т4 и Т3 имеют общий ресурс А, а Т3 и Т1 имеют общий ресурс В. Может сложиться такая ситуация:

В результате получается, что задача Т2 не дает закончить задаче Т4 работу с ресурсом А, что мешает начать (и закончить) работу с этим ресурсом и с ресурсом В задаче Т3, что, в свою очередь, мешает задаче Т1, который нужен ресурс В. Опять таки, имеем инверсию приоритетов - задача Т2 не может быть вытеснена задачей Т1, несмотря на свой более низкий приоритет.

Имеются более сложные модификации механизма наследования приоритетов, но, к сожалению, общее наблюдение таково, что чем в большей степени улучшается этот механизм, тем все сложнее обнаружить в нем возможную логическую ошибку или ошибку в реализации. Поэтому вполне справедливо наследование приоритетов подвергается критике и предлагаются иные способы работы с общими ресурсами, например, атомарные операции (для случая недолгих критических секций) и, для случая длительных подход клиент-сервер, при котором все операции с ресурсом выполняет один специально отведенный для этого процесс, который мог бы упорядочивать запросы от клиентов в зависимости от их приоритета.

Рассмотрим теперь модификацию механизма наследования приоритетов, отличающегося от вышеприведенного тем, что

Во-первых, такая схема подразумевает, что критические секции не могут перекрываться - они должны быть вложенными. В противном случае механизм не будет работать должным образом. Для иллюстрации представим себе следующий сценарий развития событий. Пусть некоторая задача, имеющая приоритет π, занимает ресурс A, получая при этом приоритет πA > π, затем занимает ресурс B, получая при этом приоритет πB > πA и затем освобождает ресурс A. Согласно правилу, после этого она будет иметь приоритет π, но все еще работает с ресурсом B и, по идее, должна иметь приоритет πB > π. Таким образом, получается, что схема работает неправильно. В случае вложенных (не перекрывающихся) критических секций такая ситуация возникнуть не может. Под вложенностью понимается то, что освобождение ресурсов происходит в порядке, обратном тому, в каком они занимались. В сложных системах (много задач и много общих ресурсов) проверка того, что это условие соблюдается, может оказаться весьма нетривиальной.

Во-вторых, даже при строгом соблюдении вложенности критических секций рассматриваемая модификация механизма наследования приоритетов может привести к некорректному поведению системы. Пусть у нас имеется 4 задачи, T1 с приоритетом π1 и так далее. Нумерация задач - как ранее, то есть задача с бОльшим порядковым номером имеет меньший приоритет. Сценарий развития событий, ведущий к инверсии приоритетов:

Получается, что задача T1 будет вынуждена ждать освобождения ресурса А задачей T4, которая работает с приоритетом π4, а не π1, как должно было бы быть. Ситуация еще более ухудшится, если управление получит задача T2 или же задача, которая вообще не использует ресурсы А и В.

Классификация ОСРВ

Различают следующие типы ОСРВ:

Краткий обзор наиболее распространенных коммерческих ОСРВ (LynxOS, pSOSystem, VxWorks, VRTX, QNX).

Все эти системы обладают следующим общими свойствами (за некоторыми исключениями):

Отметим, что данное свойство не является прерогативой ОСРВ. Аналогичные механизмы обработки прерываний имеются и в ядрах ОС общего назначения. Например, в ОС Linux подобный механизм носит название upper half/bottom half, то есть "нижняя" и "верхняя" "половины". "Нижней половине" соответствует понятие IHR, верхней - ISR. В ОС Windows имеется механизм отложенного вызова процедур (DPC). Подпрограмма, вызываемая с помощью этого механизма, аналогична IHR.

Далее перечислены некоторые особенности каждой из этих ОСРВ.

LynxOS:

pSOSystem:

VRTX:

VxWorks:

QNX:

Дата последней модификации: 2011-01-30


/Студентам/СРВ/Тема 06

Содержимое данного сайта может быть использовано кем угодно, когда угодно, как угодно и для каких угодно целей. Автор сайта не несёт абсолютно никакой ответственности за землетрясения, наводнения, финансовые кризисы, глобальные потепления/похолодания, разбитые тарелки, зуд/онемение в левой/правой пятке читателя, эпидемии/пандемии свинячьего/птичьего/тараканьего и иных гриппов, а также за прочие негативные, равно как и позитивные, последствия, вызванные прямым или косвенным использованием материалов данного сайта кем бы то ни было, включая самого автора. При копировании/цитировании материалов данного сайта любым технически возможным в настоящее время способом, а также способом, могущим стать возможным в будущем, указание (либо неуказание) ссылки на первоисточник лежит, блин, тяжким грузом на совести копирующего/цитирующего.

Valid HTML 4.0 Strict Valid CSS!