
- •Процеси та потоки Процеси
- •Модель процесу
- •Створення процесу
- •Завершення процесу
- •Ієрархія процесів
- •Стани процесу
- •Реалізація процесу
- •Класична модель потоків
- •Реалізація потоків в просторі користувача
- •Реалізація потоків в просторі ядра
- •Активація планувальника
- •Спливаючі потоки
- •Взаємодія процесів
- •Змагання між процесами
- •Критична секція
- •Блокуючі змінні
- •Строге чергування
- •Алгоритм Петерсона
- •Команда tsl
- •Завдання виробника і споживача. Sleep і wakeup.
- •Семафори
- •М’ютекси
- •Монітори
- •Завдання алгоритму планування
Спливаючі потоки
Потоки часто використовуються в розподілених системах. Одним з прикладів може послужити обробка вхідних повідомлень, наприклад запитів на обслуговування. Традиційний підхід полягає у використанні процесу або потоку, який блокуєтсья системним викликом receive в очікуванні вхідного повідомлення. Після прибуття повідомлення він його приймає, розпаковує, перевіряє його вміст і проводить подальшу обробку. Але можливий також і зовсім інший підхід, при якому надходження повідомлення змушує систему створити новий потік для його обробки. Такий потік, показаний називається спливаючим. Основна перевага спливаючих потоків полягає в тому, що вони створюються заново і не мають ніяких регістрів, стека і всього іншого, що повинно бути відновлено. Кожен такий потік починається з самого початку, і кожен з них є ідентичний до всіх іншим. Це дозволяє створювати такі потоки досить швидко. Новий потік отримує повідомлення для подальшої обробки. В результаті використання спливаючих потоків затримку між надходженням і початком обробки повідомлення можна звести до мінімуму.
Взаємодія процесів
Взаємодія між процесами - InterProcess Communication, або IPC – це передача інформації між процесами через добре продуману структуру без використання переривань.
3 основні питання, що стосуються міжпроцесної взаємодії:
-
Як один процес може передавати інформацію іншому.
-
Забезпечення спільної роботи процесів без створення взаємних перешкод (наприклад, два процеси в системі бронювання авіаквитків одночасно намагаються захопити останнє місце в літаку для різних клієнтів).
-
Визначення правильної послідовності на основі існуючих взаємозалежностей: якщо процес А виробляє дані, а процес Б їх роздруковує, то процес Б, перед тим як друкувати, повинен почекати, поки процес А не виробить певні дані.
Два останні питання стосуються як процесів так і потоків, їм властиві схожі проблеми та методи їх вирішення.
Змагання між процесами
У деяких операційних системах процеси, що спільно працюють можуть використовувати яке-небудь загальне сховище даних, доступне кожному з них для читання та запису. Це породжує проблему, яка називається змагання між процесами. Проілюструємо суть проблеми на прикладі.
Коли процесу необхідно роздрукувати який-небудь файл, він поміщає ім'я цього файлу в спеціальний каталог спулера. Інший процес під назвою демон принтера періодично веде перевірку наявності файлів для друку, і в тому разі, якщо такі файли є, роздруковує їх і видаляє їх імена з каталогу. Також є дві загальні змінні: out, яка вказує на наступний файл, призначений для друку, і in, яка вказує на наступну вільну область в каталозі. Уявимо, що майже одночасно процеси А і Б вирішують, що їм потрібно поставити файл у чергу на друк. Ця ситуація показана на рис. 2.15.
Процес А зчитує значення змінної in і зберігає значення 7 в локальній змінній по імені next_free_slot (наступна вільна область). Відразу ж після цього відбувається переривання за таймером, центральний процесор вирішує, що процес А пропрацював досить довго, і переключається на виконання процесу Б. Процес Б також зчитує значення змінної in і також отримує число 7. Він також зберігає його у своїй локальної змінної next_ free_slot. До поточного моменту обидва процеси вважають, що наступною доступною областю буде 7. Процес Б продовжує виконуватися. Він зберігає ім'я свого файлу в області 7 і присвоює змінній in оновлене значення 8. Потім він переходить до виконанню яких-небудь інших дій. Через деякий час виконання процесу A поновлюється з того місця, де він був зупинений. Він зчитує значення змінної next_frее_slot, бачить там число 7 і записує ім'я свого файлу в область 7, затираючи ім'я файлу, яке тільки що було в нього поміщено процесом Б. Потім він обчислює next_ free_slot + 1, отримує значення 8, і привласнює його змінній in. У каталозі спулера немає внутрішніх суперечностей, тому демон друку не помітить ніяких проблем, але процес Б ніколи не отримає виведення на друк.
Подібна ситуація, коли два або більше процеси зчитують або записують якісь загальні дані, а остаточний результат залежить від того, який процес і коли саме виконується, називається змаганням між процесами.