Автор работы: Пользователь скрыл имя, 11 Января 2012 в 11:36, реферат
ОС РВ предназначена для разработки программного обеспечения для систем (программно-аппаратных комплексов), работающих в режиме жесткого реального времени.
Разработка ОС РВ базируется на следующих принципах:
• соответствие международным стандартам,
• мобильность,
• масштабируемость (конфигурируемость),
• использование концепции микроядра,
• использование объектно-ориентированного подхода,
• кросс-разработка.
Так как
функция обработки сигнала
Сигналы влияют на результаты исполнения некоторых функций, если они доставляются потоку в момент, когда в нем исполняется такая функция. В этом случае говорят, что функция, исполнявшаяся в потоке, прерывается сигналом. После обработки сигнала одни функции продолжают свою работу обычным образом, другие возвращают управление с кодом EINTR (функция прервана сигналом).
Средства синхронизации
Так как прикладная программа обычно представляет собой несколько (псевдо)параллельно выполняемых потоков управления, то возникает потребность в средствах синхронизации. Без таких средств трудно обойтись, если несколько потоков управления должны обрабатывать общие данные. В соответствии с POSIX в реализованы следующие средства синхронизации:
Для синхронизации можно также использовать очереди сообщений.
Семафоры
Семафоры обеспечивают две основные операции:
В обеих операциях используется счетчик семафора - целое число, начальное значение которого определяется при создании семафора. Начальное значение определяет максимальное количество потоков управления, которые могут одновременно захватить семафор.
При захвате семафора вначале проверяется счетчик семафора. Если значение счетчика больше нуля, то оно уменьшается на 1, и семафор считается захваченным. Если счетчик равен 0, то это означает, что в настоящее время семафор не может быть захвачен. В таком случае поток управления будет приостановлен (установлен в очередь к семафору) до освобождения семафора. В очереди к семафору может находиться одновременно несколько потоков управления. Потоки управления, находящиеся в очереди, упорядочены по приоритетам, а потоки, имеющие равный приоритет, упорядочены по времени установки в очередь.
При освобождении семафора проверяется, имеются ли потоки, ожидающие освобождения семафора. Если таких потоков нет, счетчик семафора увеличивается на 1. В противном случае значение счетчика не меняется, а из очереди к семафору выбирается первый (наиболее приоритетный) поток управления и объявляется работоспособным.
Важным примером использования семафоров является управление доступом к ресурсам, совместно используемым разными потоками управления, например, к общим переменным. В этом случае начальное значение счетчика семафора равно 1, то есть в каждый момент времени доступ к ресурсу может иметь не более чем один поток. Операция захвата семафора позволяет получить монопольный доступ к ресурсу. Когда потоку управления больше не нужен ресурс, он освобождает соответствующий семафор.
Использование
семафоров обеспечит безопасное
использование ресурса только в
том случае, если все потоки управления
будут захватывать семафор
В качестве второго примера использования семафоров рассмотрим следующую модель. Пусть один или несколько потоков управления собирают данные, а другие протоки их обрабатывают. В этом случае поток первого типа освобождает семафор, как только он подготовил очередную порцию информации для обработки, а поток второго типа захватывает семафор, перед тем как начать обработку очередной порции информации. Если в начале работы нет данных, которые нуждаются в обработке, то начальное значение счетчика семафора равно 0.
Отметим, что освобождать семафор могут не только те потоки, которые его захватывали. Более того, освобождать семафор можно из функций обработки прерываний и функций обработки сигналов.
Мьютексы
Мьютексы имеют много общего с семафорами. Они также используются для синхронизации потоков управления на основе двух операций:
Основные отличия мьютексов от семафоров состоят в следующем. Мьютекс может быть захвачен не более чем одним потоком управления. О потоке управления, который захватил мьютекс, говорят, что он является владельцем мьютекса. Освободить мьютекс может только его владелец. В силу этого мьютексы нельзя использовать в функциях обработки прерываний.
Если мьютекс уже захвачен, то при попытке захватить его текущий поток будет приостановлен (установлен в очередь к мьютексу) до тех пор, пока мьютекс не будет освобожден. В очереди к мьютексу может находиться одновременно несколько потоков управления. Потоки управления, находящиеся в очереди к мьютексу, упорядочены по приоритетам, а потоки, имеющие равный приоритет, упорядочены по времени установки в очередь.
При освобождении мьютекса проверяется, есть ли потоки управления, ожидающие освобождения мьютекса. Если такие потоки есть, то среди них выбирается наиболее приоритетный, а среди потоков с наибольшим приоритетом выбирается тот, который дольше других ждет захвата мьютекса. Этот поток объявляется работоспособным и становится владельцем мьютекса.
В основном мьютексы используются для управления доступом к ресурсам, совместно используемым разными потоками управления. Операция захвата мьютекса позволяет обеспечить монопольный доступ к ресурсу. Когда потоку управления ресурс больше не нужен, он освобождает мьютекс.
Хотя
реализованные стратегии
Рассмотрим следующий пример. Пусть имеется три потока высокого, среднего и низкого приоритета. При этом выполняется поток, имеющий средний приоритет, а высокоприоритетный поток ждет освобождения мьютекса, захваченного низкоприоритетным потоком. Таким образом, высокоприоритетный поток не начнет выполняться до тех пор, пока работоспособен поток, имеющий средний приоритет.
Во избежание инверсии приоритетов при использовании мьютексов приоритет потока управления, владеющего мьютексом, может быть временно повышен.
Условные переменные
Условные переменные также как и мьютексы используются для управления доступом к ресурсам, которые совместно используются разными потоками управления. При этом условные переменные предоставляют больше возможностей, чем мьютексы. Мьютексы позволяют лишь получить монопольный доступ к общему ресурсу на некоторый период времени, а условные переменные позволяют получить такой доступ при выполнении определенного условия.
Применение условных переменных основано на использовании двух операций:
В качестве примера использования условной переменной рассмотрим следующую модель. Пусть одни потоки управления ("потоки-производители") создают пакеты данных и связывают их в список, а другие потоки ("потоки-потребители") извлекают из списка и обрабатывают. Если "поток-потребитель" обнаруживает, что список пуст, то он приостанавливается до тех пор, пока не будет выполнено условие "список не пуст". При занесении пакета в список "поток-производитель" сообщает ОС, что условие "список не пуст" выполнено.
Каждая условная переменная должна использоваться вместе с некоторым мьютексом. Этот мьютекс должен быть захвачен перед вызовом функции ожидания выполнения условия.
Функции ожидания выполнения условия выполняются в три этапа:
Таким образом, на время ожидания выполнения условия поток управления освобождает мьютекс, позволяя другим потокам работать с этим ресурсом и, когда условие будет выполнено, послать соответствующее сообщение. Отметим, что к моменту, когда поток снова захватит мьютекс и получит управление, условие снова может оказаться невыполненным.
Обычно поток управления, которому требуется доступ к ресурсу при выполнении некоторого условия, вначале захватывает мьютекс, обеспечивая себе монопольный доступ к этому ресурсу. Далее он проверяет, выполняется ли условие и, если условие не выполняется, то он приостанавливается до выполнения условия. После возврата из функции ожидания поток опять проверяет, выполняется ли условие и, если условие не выполняется, то он снова (в цикле) вызывает функцию ожидания выполнения условия. Если условие выполняется, поток переходит к работе с ресурсом, а затем освобождает мьютекс.
Очереди сообщений
При работе
с очередями сообщений
В качестве примера использования очередей сообщений рассмотрим следующую модель. Пусть один или несколько потоков управления собирают данные, а другие протоки их обрабатывают. В этом случае поток первого типа посылает сообщение в очередь, как только он подготовил очередную порцию информации для обработки, а поток второго типа получает сообщение из очереди, перед тем как начать обработку очередной порции информации.
Рассмотренную модель можно также реализовать с помощью семафоров, мьютексов или условных переменных, но использование очередей сообщений заметно упрощает задачу.
Сообщение
устанавливается в очередь в
соответствии с приоритетом: после
сообщений с большим или равным
значением приоритета, но перед сообщениями
с меньшим значением
При приеме сообщения может оказаться, что очередь пуста, а при посылке - переполнена. В этих случаях поток управления будет приостановлен до тех пор, пока в очередь не будет помещено сообщение или, пока не освободится место в очереди. Приостановку потока управления в таких случаях можно запретить, указав соответствующий режим блокировки. В этом случае вместо приостановки потока управления функция приема или посылки сообщения будет возвращать соответствующий код возврата.
Отправлять сообщения можно также из функций обработки прерываний. Если при этом окажется, что очередь переполнена, то независимо от режима блокировки сообщение отправлено не будет и функция возвратит соответствующий код возврата.
Прикладная программа может потребовать посылки извещения, например, сигнала, при поступлении сообщения в пустую очередь.
Часы и таймеры
Часы
Для хранения
даты и времени в системе
Для хранения интервала времени, выраженного в секундах, используются переменные типа time_t. Для более точного измерения времени используется структура timespec, которая позволяет хранить время в секундах и наносекундах.
Оба типа данных (time_t и timespec) могут использоваться для хранения календарного времени. В этом случае хранящиеся в них данные интерпретируются как время, прошедшее с 0 часов 1 января 1970 года.
Структура tm позволяет хранить дату и время в традиционном виде (год, месяц, число, часы, минуты, секунды).
Система всегда содержит, по крайней мере, одни часы с идентификатором CLOCK_REALTIME (системные часы). Значение этих часов интерпретируется как календарное время, то есть время (в секундах и наносекундах), истекшее с 0 часов 1 января 1970 года.
При наличии соответствующего оборудования могут быть созданы (пакетом поддержки модуля) дополнительные часы. Их идентификаторы также определяются пакетом поддержки модуля.
Функция clock_settime() позволяет установить показания часов, функция clock_gettime()- опросить показания часов, а clock_getres() - узнать разрешающую способность часов. Все три функции работают с высокой точностью, так используют структуру timespec. Отметим, однако, результаты измерения времени не могут быть точнее, чем разрешающая способность часов.