Лекция 3

Download Report

Transcript Лекция 3

Система реального времени
QNX/Neutrino
(QNX6)
QNX
•
•
•
•
Микpоядеpная
Cетевая
Мyльтизадачная
Многопользовательcкая
Особенности QNX6 (vs QNX4)
• полная cовмеcтимоcть c POSIX - cтандатами;
• планиpование идет междy потоками (threads);
• поддеpжка мyльтипpоцеccоpных аpхитектyp
• механизм Send-Receive-Reply теперь требует
установления канала между потоками
• Базовая сущность – это менеджеpы
• гpафичеcкая оболочка Photon 2.0
pеcypcов
Аппаратные требования
• x86, PowerPC, MIPS, SH-4, ARM,
StrongARM, XScale.
• 64M памяти & диск 600 Мбайт
• конечные cиcтемы могyт pаботать
вообще без диcка.
• Для разработки:
• 256Mбайт RAM 1.5Гбайт диcк
Архитектура
• QNX состоит из
небольшого ядра и
набора менеджеров
ресурсов
(процессов)
Process
manager
Filesystem
mgr
Микро
Ядро
Device
manager
Network
mgr
Синхронизация
•
•
•
•
•
•
•
Обмен сообщениями (MsgSend/Receive)
Мутексы(mutex)
Семафоры (semaphore)
Барьеры (barrier)
Блокировки чтения/записи (r/w locks)
Ждущие блокировки (sleepons)
Условные переменные (cond variables)
Обмен сообщениями
Client
int coid = ConnectAttach
(0, 77, 1, 0, 0);
MsgSend(coid, smsg, s_len,
rmsg, r_size);
Server
int chid = ChannelCreate(0);
rid = MsgRecive(chid, m,
m_size, 0);
…..
MsgReply(rid, sts, m,
m_len);
Send/Recive
sts = MsgSend(coid, smsg, sbytes, rmsg, rbytes)
rid=MsgRecive(chid, rmsg, rbytes, 0);
MsgReply(rcvid, sts, smsg, sbytes);
Семафоры (POSIX) <semaphore.h>
• int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_destroy(sem_t * sem);
Инициализация/удаление семафора <sem>. <pshared> = 0
<value> – Начальное значение семафора.
• int sem_getvalue(sem_t * sem, int * val);
Возвращает текущее состояние <val> семафора <sem>.
• int sem_post(sem_t * sem);
Установка семафора (+1).
• int sem_wait(sem_t * sem);
Ожидает ненулевого значения семафора. При вызове функции
значение семафора уменьшается на единицу.
• int sem_trywait(sem_t * sem);
Неблокирующие ожидания ненулевого значения семафора.
Мутексы (POSIX) <pthread.h>
• int pthread_mutex_init(pthread_mutex_t *mutex, const
pthread_mutexattr_t *mutexattr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
Создание/удаление мутекса.
• int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
Захват/освобождение мутекса. Если мутекс уже
захвачен - поток блокируется до освобождения.
• int pthread_mutex_trylock(pthread_mutex_t *mutex);
Попытка захвата мутекса без блокировки Если
семафор занят возвращается «BUSY».
Условные (сигнальные переменные)
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t
*cond_attr);
int pthread_cond_destroy(pthread_cond_t *cond);
создание/удалении условной переменной <cond>.
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
Разблокирует один/все потоки ожидающие условную
переменную
•
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t
*mutex);
int pthread_cond_timedwait(pthread_cond_t *cond,
pthread_mutex_t *mutex, const struct timespec *time);
Блокирует текущий поток на базе мутекса до изменения
условной переменной <cond> с таймаутом <time>.
RW-lock
• int pthread_rwlock_init(pthread_rwlock_t * lock, const
pthread-rwlockattr_t * attr);
• int pthread_rwlock_destroy(pthread_rwlock_t * lock);
• int pthread_rwlock_rdlock(pthread_rwlock_t * lock);
• int pthread_rwlock_wrlock(pthread_rwlock_t * lock);
• int pthread_rwlock_tryrdlock(pthread_rwlock_t * lock);
• int pthread_rwlock_trywrlock(pthread_rwlock_t * lock);
Ждущие блокировки
while(!data_ready) {
phtread_sleepon_wait
(&data_ready);
}
pthread_sleepon_lock();
data_ready = 1;
pthread_sleepon_signa
l(&data_ready);
pthread_sleepon_unlock();
Барьеры
• barrier_init(&barrier, 0, 3);
• barrier_wait(&barrier);