
- •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.4. Засоби синхронізації потоків
QNX-6 забезпечує POSIX-засоби синхронізації потоків, деякі з них можуть бути застосовні між потоками в різних процесах. Служби синхронізації вміщують наступне:
м'ютекси,
умовні змінні,
бар'єри,
sleepon-блокування,
блокування читання/запису,
семафори,
FIFO-планування,
передача/прийом/відповідь,
атомарні операції.
Взаємно-виключні блокування, чи м'ютекси, є найбільш простими засобами синхронізації. М'ютекс використовується, щоб гарантувати монопольний доступ до загальнодоступних між потоками даних. Тільки один потік може блокувати м'ютекс у будь-який даний час. Потоки, що намагаються блокувати вже блокований м'ютекс, блокуються. Коли потік розблокує м'ютекс, потік з вищим пріоритетом, що очікує м'ютекс, розблокується і стане новим власником м'ютексу. Таким чином, потоки будуть послідовно захоплювати м'ютекс через критичний інтервал часу в порядку пріоритетної черги.
Умовна змінна, чи condvar, використовується, щоб блокувати потік у межах критичної секції програмного коду, доки певна умова не буде задоволена. Умова може бути довільною.
Бар'єр – це механізм синхронізації, що дозволяє призупинити декілька потоків, змушуючи їх чекати у визначеній точці (біля "бар'єру"), доки таких потоків не набереться певне число. Коли зазначене число таких потоків, що чекають у бар'єра, набралося, вони усі розблокуються і можуть продовжувати далі своє виконання.
Sleepon-блокування схожі на condvar, з декількома розходженнями. Подібно condvar, sleepon блокування може використовуватися, щоб блокувати потік, доки певна умова не буде задовільнена. На відміну від condvar, sleepon-блокування мають "захований" м'ютекс, який програмно не доступний, і тому їх використання більш просте й надійне.
Блокування читання/запису використовуються для розв'язку проблеми "читач/письменник". Коли певний потік намагається записати дані до загальної області пам'яті, то за допомогою використання блокувань читання/запису його запит може бути відхилений, доки потік, що читає ці дані не розблокує її. Аналогічні дії можна виконати і при спробі читання під час запису даних іншим потоком.
Семафори аналогічні м'ютексам з тим розходженням, що доступ до ресурсу має не один потік, а кілька. Звільнення ресурсу збільшує семафор на одиницю, а захоплення – зменшує на одиницю. Якщо потік очікує на семафорі, що є позитивним, він не будете блокований. Чекання на не позитивному семафорі блокує, поки деякий інший потік не збільшує його. Семафори були визначені, щоб синхронізувати процеси. Для синхронізації між потоками в окремому процесі, м'ютекс буде більш ефективний, ніж семафори.
FIFO-алгоритм може гарантувати, що ніякі два потоки того ж самого пріоритету не виконають критичну секцію водночас. Усі FIFO-потоки в системі одного пріоритету будуть виконуватися по черзі, доки вони добровільно не звільнять процесор.
Передачі повідомлень Send/Receive/Reply здійснюють неявну синхронізацію за характером блокування. Це єдина синхронізація, що може використовуватися в мережі.
У деяких випадках необхідно виконати коротку операцію з гарантією, що операція не буде вивантажуватися іншим потоком чи програмою обробки переривання. Neutrino забезпечує атомарні операції для додавання значення, віднімання значення, очищення бітів, встановлення бітів.