- •Ответы по дисциплине: «Системное программное обеспечение»
- •Задачи не прелагаются!
- •Ос реального времени.
- •Технические требования к ос реального времени
- •Инверсия приоритетов и реальное время
- •Ос qnx характеристика
- •Концепция приоритетов в ос qnx
- •Типы диспетчеризации в ос qnx (fifo, rr). Основные правила (4 штуки) диспетчеризации.
- •Состояние потоков в qnx
- •Запуск процессов в qnx
- •Запуск потока
- •11. Синхронизация по отношению к моменту завершения потока.
- •Барьеры
- •Неявный обмен сообщения в qnx(open, close)
- •Привилегии обмена сообщениями. Установление соединения
- •Передача сообщений со стороны клиента
- •Общая структура сервера
- •Особенности обмена сообщениями. Каналы и потоки
- •Сообщения типа «имульс»
11. Синхронизация по отношению к моменту завершения потока.
Присоединение потоков выполняется одним потоком ждущим завершения другого потока. Это производится с помощью функции.
#include<pthread.h>
int
pthread_join(pthread_t*thread,
void**value_ptr);
1_й идентификатор потока к которому хотим присоединиться.
2_й не обязательный идентификатор,возвращант нужные значения.
Барьеры
Барьер (barrier) - примитив синхронизации, применяемый главным образом в вычислительных задачах MPI/OpenMP. Существуют также примеры его применения в других задачах, но как правило это также задачи вычислительного характера. При создании барьера необходимо указать количество нитей N, необходимое для перехода через барьер. Нити, подходящие к барьеру, вызывают функцию pthread_barrier_wait(3C). Если количество нитей, ожидающих возле барьера, меньше N-1, нить блокируется. Когда набирается N нитей, все они разблокируются и продолжают исполнение.
В барьера ожидаем встречи определенного числа потоков у барьера, затем они все разблокируются и одновременно продолжают работу.
Этапы:
создается барьер
#include<sync.h>
int
barrien_init(barrier_t*barrier,
const barrier attr_t*attr,
int count);
1-й переданный адрес, по которому создается барьер.
2-й аттрибуты 0.
3-й количество потоков которые должны вызвать функцию init barrier_wait(barrier_t*barrier).
Блокировки чтения записи
Int Pthread rwloc init(pthread rwlock + lock,const pthread _rwlock attr_t +attr);
После использования блокировки её необходимо уничтожить.
Int thread_rwloc_destroy(pthread_rwlock+lock,const pthread_rwlockattr_t*attr);
Выбор блокировки необходимого типа:
-pthread_rwlock wrlock(. )-чтение;
-pthread_rwlock_ur look(.. )-записи.
Клиент-серверные модели QNX
В QNX все взаимодействия между программными модулями организованы по типу клиент-сервер.
Здесь необходимо различать состояния клиента и сервера.
Клиент :
Сервер:
Состояние потока или приложения можно определить с помощью такой команды Pidin.
Обмен сообщениями в QNX реализован в библиотеке Се и может использоваться неявно.
Пример:
Программа которая обменивается сообщениями
#include <fcntl.h>
#include<unistd.h>
Int
Main(void
{
Int fd;
Fd_open (“filename ”, wronly );
Write(fd “это обмен сообщениями .\h”,24);
Close(fd);
Return(…);
}
Open() передача сообщений “open”
Write() передача сообщений ”write”
Close() передача сообщений”close”
Неявный обмен сообщения в qnx(open, close)
Привилегии обмена сообщениями. Установление соединения
Функции на стороне клиента в первую очередь клиент устанавливает с сервером соединение.
#incluse<sys/neutrino.h>
Int connect attaxch(int nd,
Pid_t pid,
Int chit,
Unsigned index,
Int flags);
Nd-номер узла
Pid-идентификатор класса
Chid-идентификатор к-ла
Последнее 2 параметра принимают нулевое значение .
В последней передаче сообщений соединение необходимо уничтожить функция :
Connect Detach()
Передача сообщения со стороны клиента
Int msg_send(int void,
Const void+smsg,
Int slytes,
Void rmsg,
Int rlytes.)
