Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемЕгор Тимохин
1 Система реального времени QNX/Neutrino (QNX6)
2 QNX Микpоядеpная Cетевая Мyльтизадачная Многопользовательcкая
3 Особенности QNX6 (vs QNX4) полная cовмеcтимоcть c POSIX - cтандатами; планиpование идет междy потоками (threads); поддеpжка мyльтипpоцеccоpных аpхитектyp механизм Send-Receive-Reply теперь требует установления канала между потоками Базовая сущность – это менеджеpы pеcypcов гpафичеcкая оболочка Photon 2.0
4 Аппаратные требования x86, PowerPC, MIPS, SH-4, ARM, StrongARM, XScale. 64M памяти & диск 600 Мбайт конечные cиcтемы могyт pаботать вообще без диcка. Для разработки: 256Mбайт RAM 1.5Гбайт диcк
5 Архитектура QNX состоит из небольшого ядра и набора менеджеров ресурсов (процессов) Микро Ядро Process manager Filesystem mgr Device manager Network mgr
6 Синхронизация Обмен сообщениями (MsgSend/Receive) Мутексы(mutex) Семафоры (semaphore) Барьеры (barrier) Блокировки чтения/записи (r/w locks) Ждущие блокировки (sleepons) Условные переменные (cond variables)
7 Обмен сообщениями 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);
8 Send/Recive sts = MsgSend(coid, smsg, sbytes, rmsg, rbytes) rid=MsgRecive(chid, rmsg, rbytes, 0); MsgReply(rcvid, sts, smsg, sbytes);
9 Семафоры (POSIX) int sem_init(sem_t *sem, int pshared, unsigned int value); int sem_destroy(sem_t * sem); Инициализация/удаление семафора. = 0 – Начальное значение семафора. int sem_getvalue(sem_t * sem, int * val); Возвращает текущее состояние семафора. int sem_post(sem_t * sem); Установка семафора (+1). int sem_wait(sem_t * sem); Ожидает ненулевого значения семафора. При вызове функции значение семафора уменьшается на единицу. int sem_trywait(sem_t * sem); Неблокирующие ожидания ненулевого значения семафора.
10 Мутексы (POSIX) 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».
11 Условные (сигнальные переменные) int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_cond_destroy(pthread_cond_t *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); Блокирует текущий поток на базе мутекса до изменения условной переменной с таймаутом.
12 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);
13 Ждущие блокировки while(!data_ready) { phtread_sleepon_wait (&data_ready); } pthread_sleepon_lock(); data_ready = 1; pthread_sleepon_signa l(&data_ready); pthread_sleepon_unlock();
14 Барьеры barrier_init(&barrier, 0, 3); barrier_wait(&barrier);
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.