Обробник сигналу створюється процесом і розміщується на початку першого потоку процеса. Є аналогом обробки переривання. При передачі управління обробнику передається адреса повернення і тип прийнятого сигналу. Процес, який посилає сигнал типу “прапорець” може передати додаткову інформацію обробнику сигнала. Характер виконання дій при виникненні сигналу: обробка системної помилки при появі сигналу, передача управління підпрограми.
Семафори. Вони є механізмами передачі повідомлень від одного потоку до іншого про настання деякої події. Розрізняють семафори системні і ОП. Семафор ОП – двійкове слово в пам’яті системи, його описувач, адреса місця в пам’яті. Такі семафори не створюються і не відкриваються, а встановлюються певний стан. Процеси, які використовуються семафори ОП повинні мати доступ до відповідного сегмента пам’яті. ОС такі семафори не обслуговує і не повідомляє про їх звільнення або зайняття. При створенні семафора або його відкритті, повертається описувач семафора, який включає його ім’я. ОС контролює завершення кожного процесу, який володіє системним семафором і звільняє його для процесів. Якщо семафор вільний, то він захоплюється викликаючим його процесом, якщо семафор зайнятий, то викликаючий його потік переходить в режим очікування звільнення семафора або чекає закінчення часу. Якщо семафор звільняється всіма використовуючими його процесами, то видаляється з системи. Управління семафором реалізується за допомогою функцій:
Установки семафора з метою сигналізації;
Очікування викликаючим потоком поки семафор не буде виключений;
Очікування потоку виключення одного із декількох семафорів.
Для роботи з семафорами вводять два значення, позначені P i V. Нехай деяка S представляє собою семафор. Тоді дії P(S) i V(S) визначаються наступним чином:
Дія V(S). Деяка S збільшується на одиницю єдиною дією. Збільшення та запам”ятовування не можуть бути перерваними. До деякої S немає доступу другим потокам під час виконання даної операції.
Дія P(S). Відбувається зменшення S на одиницю, якщо це можливо. Якщо S=0, тобто неможливо зменшити S, залишаючись в області цілих невід”ємних значень, то в цілому випадку потік викликаючий операцію Р, чекає поки це зменшення стане дійсним.
Успішна перевірка і зменшення також являються нероздільною операцією.
В цілому випадку, якщо семафор S може приймати 0 і 1, він перетворюється в блокуючу змінну, яку по цій причині часто називають подвійним семафором.
Розглянемо використання семафорів на класичному прикладі: взаємодія двох виконуючих в режимі мультипрограмування потоків, один з яких пише дані в буфер, а другий зчитує з буферного пула.
Нехай буферний пул складається з N буферів, кожний з яких може містити один запис. В загальному випадку потік-записувач і потік-читач можуть мати різні швидкості і звертатися до буферного пулу з різною інтенсивністю. В один період швидкість запису може перевищувати швидкість читання, в другий навпаки. Для правельної спільної роботи потік-записувач повинен призупинитися, коли всі буфери опиняються зайнятими і активовується при звільненні хотя би одного і навпаки, коли потік-читача повинен призупинитися, коли всі буфери поржні і активуватися при появі хоч би одного запису.
Введемо два семафори: е – число порожніх буферів, f – число заповнених буферів, при чому у вихідному стані e=N, а f=0. Тоді робота потоків з загальним буферним пулом може бути описана наступним чином:
Використання семафорів для синхронізації потоків.
Потік-записувач спершу виконує операцію P(e) з допомогою якої він перевіряє наявність незаповнених буферів у буферному пулі. У відповідності із значенням операції P, якщо семафор e=0 (тобто вільних буферів в даний момент немає), то потік-записувач переходить в стан очікування. Якщо ж значення е являється позитивне число, то він зменшує число вільних буферів, записує дані в наступний вільний буфер і після цього збільшує число зайнятих буферів, а після зчитування даних, збільшується кількість вільних буферів.
В даному випадку краще використовувати семафори замість блокуючих змінних. Отже, семафори дозволяють ефективно вирішувати задачу синхронізації доступу до ресурсних пулів, таких як, наприклад, набір ідентичних в функціональному призначенні внутрішніх пристроїв (модемів, прінтерів і т.д.) або набір областей пам’яті одинакової величини, набір інформаційних структур. В усіх цих випадках і подібних їм з допомогою семафорів можна організувати доступ до роздільних ресурсів зразу на декілька потоків.
4.1. Методи і засоби синхронізації
Існує досить великий клас засобів ОС, за допомогою яких забезпечується взаємна синхронізація процесів і потоків. Потреба в синхронізації потоків виникає тільки в мультипрограмній ОС і зв'язана зі спільним використанням апаратних і інформаційних ресурсів обчислювальної системи. Синхронізація необхідна для виключення гонок і тупіків при обміні даними між потоками, поділі даних, при доступі до процесора і пристроїв в/в.
У багатьох ОС ці засоби називаються засобами міжпроцесорного взаємодії — Intel Process Communications (IРС), що відбиває історичну первинність поняття «процес» стосовно поняття «потік». Звичайно до засобів ІРС відносять не тільки засоби міжпроцесорної синхронізації, але і засоби міжпроцесорного обміну даними.
Виконання потоку в мультипрограмному середовищі завжди має асинхронний характер. Дуже складно з повною визначеністю сказати, на якому етапі виконання буде знаходитися процес у визначений момент часу. Навіть в однопрограмному режимі не завжди можна точно оцінити час виконання задачі. Це час у багатьох випадках істотно залежить від значення вихідних даних, що впливають на кількість циклів, напрямку розгалуження програми, час виконання операцій в/в і т.п. Тому що вихідні дані в різні моменти запуску задачі можуть бути різними, тому і час виконання окремих етапів і задачі в цілому є дуже невизначеною величиною.
Ще більш невизначеним є час виконання програми в мультипрограмній системі. Моменти переривання потоків, час перебування їх у чергах до поділюваних ресурсів, порядок вибору потоків для