Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПЗ_лекції.docx
Скачиваний:
148
Добавлен:
23.02.2016
Размер:
136.33 Кб
Скачать

7.Поняття моніторів.

Для того, щоб спростити написання програм в 1974 році Хоар і Брінг Хансен запропонували примітив синхронізації більш високого рівня – монітор. Монітор – це набір процедур, змінних і інших структур даних, об’єднаних в особливий модуль або пакет. Процеси можуть викликати процедури монітора, але в процедур, оголошених поза монітором нема прямого доступу до внутрішніх структур даних монітора. Монітори є структурним компонентом мови програмування, тому компілятор знає, що обробляти виклики процедур монітора потрібно інакше, ніж виклик решти процедур. Звичайно при виклику процедури монітора перші декілька команд процедури перевіряють чи нема в моніторі активного процесу. Якщо активний процес є, то викликаючому процесу потрібно почекати, в іншому випадку запит задовільняється.

Реалізація взаємного виключення залежить від компілятора, але звичайно використовується м’ютекс або бінарний семафор. В будь-якому випадку програміст, що пише код монітора, не повинен задумуватись над тим, який компілятор організовує взаємне виключення. Для цього досить знати, що забезпечивши попадання в критичні області через процедури монітора, можна не переживати за попадання в критичну область двох процесів одночасно.

Хоча монітори представляють простий спосіб реалізації взаємного виключення, цього не достатньо. У випадку проблеми виробника і споживача досить просто розмістити всі перевірки буфера на заповненність і порожність в процедури монітора, але як процес заблокується, виявивши повний буфер?

Розв’язок полягає у введенні змінних стану і двох операцій wait і signal. Коли процедура виявляє, що вона не в стані продовжувати роботу, то вона виконує операцію wait на якій-небудь змінній стану (наприклад full). Це призводить до блокування викликаючого процесу і дозволяє іншому процесу ввійти в монітор.

Другий процес, в нашому прикладі споживач може активізувати очікуючого напарника, наприклад, виконавши операцію signal на тій змінній стану, на якій він був заблокований.

Змінні стану не є лічильниками. На відмінну від семафорів вони не акумулюють сигнали, щоб в подальшому скористатися ними. Операції wait і signal подібні на sleep і wakeup, але з однією суттєвою відмінністю: невдачі застосування операції sleep і wakeup, пов’язані з тим, що процес пробував піти в стан очікування в той час, як інший процес пробував активізувати його. З моніторам такого відбутися не може.

Існує декілька мов програмування, які підтримують монітори, хоча і не завжди у відповідності з моделлю Хоара і Хансена. Одна з них – Java. Об’єктно-орієнтовна мова, що підтримує потоки на рівні користувача і дозволяє ґрупувати методи (процедури) в класи. Синхронізовані методи на мові Java відрізняються від стандартних моніторів відсутністю змінних стану.

8.Поняття про бар’єри.

Бар’єр – це механізм синхронізації, що використовується частіше для груп процесів, ніж для ситуацій з двома процесами. Деякі додатки поділяються на фази, і існує правило, що процес не може перейти в наступну фазу, поки до цього не готові всі інші процеси. Цього можна досягти, розмістивши в кінці кожної фази бар’єр. Коли процес доходить до бар’єра, він блокується, поки всі процеси не дійдуть до бар’єра.