
- •18 “Проектування систем реального часу” Лабораторна робота №1.
- •1. Загальна характеристика ос qnx-6.
- •2. Принципи роботи мікроядра qnx-6.
- •2.1. Потоки і процеси в qnx-6
- •Таблиця 2.
- •2.2. Життєвий цикл потоку
- •2.3. Диспетчеризація потоків
- •2.4. Засоби синхронізації потоків
- •2.5. Організація зв'язку між процесами
- •2.6. Таймери
- •2.7. Оброблювачі переривань
- •3. Розробка консольних додатків.
Таблиця 2.
Функція |
Опис |
pthread_key_create () |
Створити ключ даних з функцією деструктора |
pthread_key_delete () |
Знищити ключ даних |
pthread_setspecific () |
Зв'язати значення даних із ключем даних |
pthread_getspecific () |
Повернути значення даних, зв'язане з ключем даних |
2.2. Життєвий цикл потоку
Кількість потоків у межах процесу може змінюватись протягом виконання програми. Це пов'язано з можливістю динамічно створювати і знищувати потоки. Створення потоку за допомогою виклику функції pthread_create() визначає розподіл і ініціалізацію необхідних для потоку ресурсів у межах адресного простору процесу і початок виконання потоку в певному адресному просторі. Завершення потоку за допомогою виклику функцій pthread_exit (), pthread_cancel () визначає зупинку потоку і звільнення ресурсів потоку.
На протязі часу свого існування потік може знаходитися в 3 основних станах: виконуватися (RUNNING), бути готовим до виконання (READY), бути блокованим. Причин, з яких потік може стати блокованим, є багато, і тому визначена певна кількість станів блокування з відповідними назвами (рис.2). Зазвичай після розблокування потік потрапляє до стану READY.
Рис.2. Стани потоку.
Зазначені назви станів означають наступне:
CONDVAR - потік блокований на умовній змінній (при виклику pthread_condvar_wait ()).
DEAD - потік закінчив виконання й очікує приєднання другого потоку, не звільняє ресурси.
INTERRUPT - потік блокований, очікує переривання (при виклику InterruptWait ()).
JOIN - потік блокований, очікує на приєднання до іншого потоку (при виклику pthread_join ()).
MUTEX - потік блокований на взаємно-виключному блокуванні (при виклику pthread_mutex_lock ()).
NANOSLEEP - потік не діє протягом короткого інтервалу часу (при виклику nanosleep ()).
NET_REPLY - потік очікує відповідь, що буде отримана через мережу (при виклику MsgReply * ()).
NET_SEND - потік очікує на імпульс або сигнал, що буде отриманий через мережу (при виклику MsgSendPulse (), MsgDeliverEvent (), чи SignalKill ()).
READY - потік очікує на виконання, у той час як процесор виконує інший поток такого ж або більш високого пріоритету.
RECEIVE - потік блокований, очікує повідомлення (при виклику MsgReceive ()).
REPLY - потік блокований, очікує відповідь на своє повідомлення (при виклику MsgSend () і сервер одержав повідомлення).
RUNNING - потік виконується процесором.
SEM - потік очікує на семафорі (при виклику SyncSemWait ()).
SEND - потік блокований на відправленні повідомлення (при виклику MsgSend (), але сервер не одержав повідомлення).
SIGSUSPEND - потік блокований, очікуючи сигнал (при виклику sigsuspend ()).
SIGWAITINFO - потік блокований, очікуючи сигнал (при виклику sigwaitinfo ()).
STACK - потік очікує віртуальний адресний простір, що буде розподілено для стека потоку (батько викликає ThreadCreate ()).
STOPPED - потік блокований, очікує сигнал продовження SIGCONT.
WAITCTX - потік очікує на неціле число, щоб стати доступним для використання.
WAITPAGE - потік очікує на фізичну пам'ять, що буде розподілена для віртуальної адресації.
WAITTHREAD - потік очікує на закінчення створення дочірнього потоку (при виклику ThreadCreate ()).