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

Системы реального времени

..pdf
Скачиваний:
41
Добавлен:
05.02.2023
Размер:
2.46 Mб
Скачать

(Allegro Systems

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Limited)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ARTK

X

 

 

X

X

X

X

X

X

X

X

X

X

 

X

 

 

X

(Alsys GmBH)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

VCOS (AT&T)

 

 

 

 

 

X

 

 

X

X

 

X

X

X

 

 

 

 

BOX (Brainstorm

 

 

X

 

X

X

X

X

X

X

X

X

X

X

X

X

X

X

Engineering)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MIPS Kernel

X

 

 

 

 

 

X

X

X

X

 

X

X

X

 

X

 

X

(CAC)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

UNOS (Charles

X

 

 

X

X

X

X

X

 

X

X

X

X

X

X

X

X

X

River Data Sys-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

tems)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CMX (CMX

X

X

X

 

X

 

X

X

X

 

X

X

X

X

 

 

X

X

Company)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RTXC Embedded

X

 

X

 

X

X

X

X

X

 

X

X

X

X

X

X

X

X

Systems Prod-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ucts)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

HP RT (Hewlett

X

 

 

X

 

 

X

X

X

X

X

 

X

 

X

 

 

X

Packard)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

OS/Open (IBM)

 

 

X

X

X

X

 

 

X

 

X

X

 

X

X

 

 

X

VRTX (Microtec

 

 

X

 

X

 

X

 

 

X

X

X

 

X

X

 

 

 

Research)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RMOS (Siemens)

 

X

X

 

X

 

X

X

X

X

X

X

X

X

 

 

 

X

151

Вопросы для самопроверки

1.На каких процессорах может работать OC Linux?

2.Какие способы существуют для реализации механизма preemption?

3.В чем особенность системы RT-Linux?

4.Приведите основные аргумента «За» и «Против» использования Windows NT в качестве ОСРВ.

5.Какие расширения Windows NT, которые поддерживают реальное время, вы знаете?

6.Классифицируйте в виде таблицы собственно ОСРВ по категориям: self-hosted, host/target и те которые могут выступать и в том и другом варианте.

7.Опишите основные функциональные возможности ОС

LynxOS.

8.Какие механизмы синхронизации реализованы в ОС LynxOS 5.0?

9.Опишите реализацию атомарных переменных и операций в ОС LynxOS 5.0.

10.Какие барьеры памяти реализованы в ОС LynxOS 5.0?

11.Опишите ОС функциональные возможности OS-9.

12.Опишите ОС функциональные возможности VxWorks.

13.Опишите уровневую структуру VSPWorks.

14.Опишите ОС функциональные возможности SoftKernel.

15.Опишите ОС функциональные возможности CHORUS.

16.Опишите ОС функциональные возможности pSOS.

17.Опишите ОС функциональные возможности ОС2000.

18.Приведите преимущества и недостатки специализированных ОСРВ.

6. Микроядро ОС QNX Neutrino

6.1. Введение

Микроядро ОС QNX Neutrino реализует основные функции стандартов POSIX, используемые во встраиваемых системах реального времени, а также базовые службы обмена сообщениями. Те функции, которые не реализованы в микроядре, выполняются дополнительными процессами или разделяемыми библиотеками.

На самых нижних уровнях микроядра расположено всего несколько базовых объектов, а также четко отрегулированные процедуры для управления ими. Это является основой, на которой строится ОС QNX (рис. 6.1).

Интерфейс

Микроядро

Объекты

Поток

 

Соединение

Планирование

 

 

 

 

Поток

Синхронизация

 

Диспетчер

 

 

Сигнал

 

сообщения

 

 

Сообщение

 

 

Канал

 

Таймер

 

 

 

 

Вектор

Таймер

 

 

Часы

 

Импульс

 

 

Прерывания

 

Канал

Рис. 6.1. Микроядро ОС QNX Neutrino

153

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

В микроядре ОС QNX существуют системные вызовы (kernel calls), которые служат для управления следующими объектами:

потоками;

сообщениями;

сигналами;

часами;

таймерами;

обработчиками прерываний;

семафорами;

блокировками взаимного исключения, мютаксами;

условными переменными;

барьерами.

ОС QNX целиком построена на основе таких вызовов, причем ядро ОС полностью вытесняемо (preemtable), в том числе и во время обмена сообщениями между процессами.

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

Оценим работу, которая выполняется между переключениями контекстов во время обмена сообщениями, и учтем высокую скорость их переключений в минимизированном ядре. Очевидно, что объем времени, расходуемый на выполнение этих действий, настолько минимален, что становиться пренебрежительно малым в сравнении с работой, производимой для обработки запросов от механизма обмена межзадачными сообщениями.

154

На рис. 6.2. показан механизм вытеснения в ядре для процессоров с архитектурой Intel x86 без поддержки SMP. Запрет прерываний или отсутствие вытеснения происходит только на короткие периоды времени (как правило, эти периоды не превышают порядка сотен наносекунд).

SYSCALL

SYSEXIT

Вход

Операции ядра, в том числе передача сообщений

Завершение

Выход

Микро

Прерывания

секунды

запрещены

От мик-

Прерывания

росекунд

разрешены,

до милли-

полное вытес-

секунд

нение

 

Прерывания

Микро

разрешены,

вытеснения

секунды

нет

 

Микро

Прерывания

секунды

запрещены

Рис. 6.2. Механизм вытеснения в ОС QNX

155

6.2. Потоки и процессы

6.2.1.Вызовы по управлению потоками

Вядре ОС QNX минимальной планируемой и выполняемой единицей является поток. Процесс можно рассматривать как объект, который содержит в себе эти потоки и который определяет для их выполнения свое адресное пространство.

Вмикроядре ОС QNX реализован ряд вызовов по управлению потоками POSIX и соответствующие им вызовы микроядра (таблица 6.1).

Таблица 6.1. Вызовы по управлению потоками POSIX

исоответствующие вызовы микроядра [9]

POSIX-вызов

Вызов микроядра

Описание

 

pthread_create()

ThreadCreate()

Создать поток

pthread_exit()

ThreadDestroy()

Уничтожить

 

 

 

поток

 

 

pthread_detach()

ThreadDetach()

Отсоединить

 

 

поток,

чтобы

 

 

не

ждать

его

 

 

завершения

 

pthread_join()

ThreadJoin()

Присоединить

 

 

поток

и ждать

 

 

его

кода

за-

 

 

вершения

 

pthread_cancel()

ThreadCancel()

Завершить

по-

 

 

ток

в

следую-

 

 

щей

точке

за-

 

 

вершения

 

отсутствует

ThreadCtl()

Изменить

ха-

 

 

рактеристики

 

 

потока

 

 

pthread_mutex_init()

SyncTypeCreate()

Создать

 

 

 

мьютекс

 

pthread_mutex_destroy()

SyncDestroy()

Уничтожить

 

 

 

мьютекс

 

pthread_mutex_lock()

SyncMutexLock()

Блокировать

 

 

мьютекс

 

 

 

 

 

156

pthread_mutex_trylock()

SyncMutexLock()

Условно

бло-

 

 

кировать

 

 

 

мьютекс

 

pthread_mutex_unlock()

SyncMutexUnLock()

Снять

блоки-

 

 

ровку

мьютек-

 

 

са

 

 

pthread_cond_init()

SyncTypeCreate()

Создать услов-

 

 

ную

перемен-

 

 

ную

 

 

pthread_cond_destroy()

SyncDestroy()

Уничтожить

 

 

условную

пе-

 

 

ременную

 

pthread_cond_wait()

SyncCondvarWait()

Ожидать

 

 

 

условную

пе-

 

 

ременную

 

pthread_cond_signal()

SyncCondvarSignal()

Разблокировать

 

 

один

из пото-

 

 

ков,

блокиро-

 

 

ванных

на

 

 

условной

пе-

 

 

ременной

 

pthread_cond_broadcast()

SyncCondvarSignal()

Разблокировать

 

 

все

потоки,

 

 

блокированные

 

 

на

условной

 

 

переменной

pthread_getschedparam()

SchedGet()

Получить

па-

 

 

раметры

пла-

 

 

нирования

и

 

 

дисциплину

 

 

потока

 

pthread_setschedparam()

SchedSet()

Установит

па-

 

 

раметры

пла-

 

 

нирования

и

 

 

дисциплину

 

 

потока

 

pthread_sigmask()

SignalProcMask()

Проверить

и

 

 

 

 

157

 

 

 

 

вывести

маску

 

 

 

 

сигналов

пото-

 

 

 

 

ка

 

pthread_kill()

 

SignalKill()

Отправить сиг-

 

 

 

 

нал потоку

sem_post()

 

SyncSemPost()

Увеличить зна-

 

 

 

 

чение счетчика

 

 

 

 

на семафоре

sem_wait()

 

SynSemWait()

Уменьшить

 

 

 

 

значение

счет-

 

 

 

 

чика на

сема-

 

 

 

 

форе

 

pthread_barrierattr_getpshared()

Получить значение атрибута

 

 

 

совместного

использования

 

 

 

для заданного барьера

 

pthread_barrierattr_ destroy()

Уничтожить

атрибутную за-

 

 

 

пись барьера

 

 

pthread_barrierattr_iпit()

 

Инициализировать атрибуты

 

 

 

объекта

 

 

pthread_barrierattr_ setpshared()

Установить значение атрибу-

 

 

 

та совместного использова-

 

 

 

ния для заданного барьера

pthread_barrier_destroy()

 

Уничтожить барьер

 

pthread_ barrier_iпit()

 

Инициализировать барьер

pthread_barrier_wait()

 

Синхронизировать потоки на

 

 

 

барьере

 

 

pthread_sleepon_lock()

 

Блокировать поток с исполь-

 

 

 

зованием ждущей блокиров-

 

 

 

ки

 

 

pthread_rwlock_rdlock()

 

Блокировка потока по чте-

 

 

 

нию/записи

 

 

pthread_rwlock_wrlock()

 

Блокировка потока по записи

pthread_rwlock_unlock()

 

Снятие блокировки по чте-

 

 

 

нию

 

 

pthread_rwlock_tryrdlock()

 

Тестирование блокировки по

 

 

 

чтению/записи

 

pthread_rwlock_trywrlock()

 

Тестирование блокировки по

 

 

 

 

 

158

записи

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

Данные, относящиеся к потоку, реализуются в библиотеки pthread и хранятся в локальной памяти потока. Они обеспечивают механизм, предназначенный для связывания глобального целочисленного ключа процесса (process global integer key) с

уникальным значением данных для каждого потока.

6.2.2. Состояния потока

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

Завершение потока включает в себя остановку потока и освобождение ресурсов потока.

Поток ОС QNX может находиться в одном из следующих состояний [9]:

CONDVAR — поток блокирован на условной переменной

(например, при вызове функции pthread_cond_var_wait());

DEAD — поток завершен и ожидает завершения другого потока;

INTERRUPT — поток блокирован и ожидает прерывания

(при вызове функции InterruptWait());

JOIN — поток блокирован и ожидает завершения другого потока (например, при вызове функции pthread_join());

MUTEX — поток блокирован блокировкой взаимного исключения (например, при вызове функции pthread_mutex_lock());

159

NANOSLEEP — поток находится в режиме ожидания в течение короткого периода времени (например, при вызове функции nanosleep());

NET_REPLY — поток ожидает ответа на сообщение другого узла сети (поток вызвал функцию MsgReply);

NET_SEND — поток ожидает получение импульса или сигнала от другого узла сети (поток вызвал функцию MsgSend-

Pulse(), MsgDeliverEvent или SignalKill());

READY — поток ожидает выполнения, пока процессор занят выполнением другого потока равного или более высокого приоритета;

RECEIVE — поток блокирован на операции получения сообщения (поток вызвал функцию MsgReceive);

REPLY — поток блокирован при ответе на сообщение (поток вызвал функцию MsgReply);

RUNNING — поток выполняется процессором;

SEM — поток ожидает освобождения семафора (поток вы-

звал функцию SyncSemWait());

SEND — поток блокируется при отправке сообщения (поток вызвал функцию MsgSend);

SIGSUSPEND — поток блокирован и ожидает сигнала (поток вызвал функцию sigsuspend());

SIGWAITINFO — поток блокирован и ожидает сигнала (поток вызвал функцию sigwaitinfo());

STACK — поток ожидает выделения виртуального адресного пространства для своего стека (родительский поток вызывает функцию ThreadCreate());

STOPPED — поток блокирован и ожидает сигнала

SIGCOUNT;

WAITCTX — поток ожидает доступности нецелочисленного контекста;

WAITPAGE — поток ожидает выделения физической памяти для виртуального адреса;

WAITTHREAD — поток ожидает завершения создания дочернего потока (поток вызвал функцию ThreadCreate()).

160