
- •Лабораторная работа №3
- •Цель работы
- •Выполнение
- •Сигналы
- •Сообщения
- •Передача сообщений между родственными процессами
- •Передача сообщений между потоками одного процесса
- •Передача сообщений между независимыми процессами (неименованные каналы)
- •Передача сообщений между независимыми процессами (именованные каналы)
Санкт-Петербургский государственный политехнический университет
Факультет Технической Кибернетики
Кафедра компьютерных систем и программных технологий
Лабораторная работа №3
Дисциплина: «Встраиваемые системы реального времени»
Тема: «Средства межпроцессорного обмена на уровне микроядра в ОС QNX»
Выполнил студент гр. 5081/12 ___________________ А. С. Бойцев Руководитель: ___________________ доц. Е. В. Душутина «______» ___________________ 2013 г.
Санкт-Петербург
2013
Цель работы
Изучить средства межпроцессорного обмена на уровне микроядра в ОС РВ QNX по следующим пунктам:
сигналы (анализ специфических сигналов для данной ОС), попытка сетевой доставки сигнала (потоку на удаленном компьютере)
передача сообщений (функции send, receive, reply)
между родственными процессами,
потоками одного процесса,
между независимыми процессами (локальными и сетевыми)
обмен пульсами
передача функциями сообщений
передача специальными функциями
передача пульса из обработчика прерывания
передача сообщений с использованием файловой модели (локальный и сетевой обмен)
очереди сообщений
реализация агентной модели на уровне передачинативных сообщений микроядра
Выполнение
Сигналы
Сообщения
В QNX Neutrino программные потоки взаимодействуют не напрямую друг с другом, а через специальные объекты, называемые каналом и соединением. Поток сервера, который желает получить сообщение, сначала создает канал; другой поток – клиент, который желает послать сообщение к потоку сервера, должен создать соединение с каналом. Каналы и соединения после своего создания получают идентифицирующие номера – малые целые числа, которые берутся из пространства файловых дескрипторов.
Для того, что бы клиент мог подсоединится к каналу сервера, нужно чтобы сервер зарегистрировал системное имя канала, поскольку между не родственными сообщениями нет возможности передавать сообщения.
Для этих целей можно использовать следующие системные вызовы:
name_attach() - Регистрация имени и создание канала;
name_open() - Получение идентификатора соединения;
name_close() - Уничтожить соединение с каналом
name_detach() - Удалить имя из пространства имен и созданный канал
Так же возможно зарегистрировать глобальное имя канала, если использовать флаг NAME_FLAG_ATTACH_GLOBAL в вызове name_attach().
Созданное глобальное имя будет известно процессам во всей сети и тогда можно будет взаимодействовать нескольким потокам, находящимся на различных узлах.
Посылка и прием сообщений осуществляются с помощью следующих вызовов:
MsgSend() - Отправка сообщения. Переход потока в блокированное состояние пока не придет ответ.
MsgReceive() - Ожидание сообщения и его прием. Поток находится в блокированном состоянии пока сообщение не пришло.
MsgReply() - Посылка ответного сообщения отправителю по его идентификатору. Ответ нужен, чтобы разблокировать отправителя.
При обмене сообщениями между родственными потоками не обязательно регистрировать имя для обмена сообщениями. Для этого можно использовать следующие вызовы:
ChannelCreate() - Создать канал для приема сообщений
ChannelDestroy() - Уничтожить канал
ConnectAttach() - Создать соединение для передачи сообщения
ConnectDetach() - Уничтожить соединение