Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операційні системи.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6.41 Mб
Скачать

Лекція 10. Методи синхронізації процесів План

  • Історія синхронізації процесів

  • Проблема критичної секції

  • Апаратна підтримка синхронізації

  • Семафори

  • Класичні проблеми синхронізації

  • Критичні області

  • Монітори

  • Синхронізація в Solaris й в Windows.

Історія синхронізації

Методи синхронізації процесів розглядалися ще в 1960-х рр. у піонерській роботі Е. Дейкстра. Було відзначено, що спільний доступ паралельних процесів до загальних даних може привести до порушення їхньої цілісності. Підтримка цілісності загальних даних вимагає реалізації й використання механізмів упорядкування роботи взаємодіючих процесів (або потоків).

Ситуація, при якій взаємодіючі процеси можуть паралельно (одночасно) звертатися до загальних даних, називається конкуренцією за загальні дані (race condition). Для запобігання подібних ситуацій процеси варто синхронізувати.

Синхронізація процесів по критичних секціях

Розглянемо проаналізовану проблему в загальному виді. Нехай є n паралельних процесів, кожний з яких може звернутися до загального для них даним. Назвемо критичною секцією фрагмент коду кожного процесу, у якому відбувається звертання до загальних даних. Проблема синхронізації процесів по критичних секціях полягає в тому, щоб забезпечити наступний режим виконання: якщо один процес увійшов у свою критичну секцію, то до її завершення ніякий інший процес не зміг би одночасно ввійти у свою критичну секцію.

Можна показати, що для рішення проблеми критичної секції необхідно й досить виконання наступних трьох умов:

  1. Взаємне виключення. Якщо деякий процес виконує свою критичну секцію, то ніякий інший процес не повинен у цей момент виконувати свою.

  2. Прогрес.Якщо в цей момент немає процесів, що виконують критичну секцію, але є кілька процесів, що бажають почати виконання критичної секції, то вибір системою процесу, якому буде дозволений запуск критичної секції, не може тривати нескінченно.

  3. Обмежене очікування.У системі повинне існувати обмеження на число раз, що процесам дозволено входити у свої критичні секції, починаючи від моменту, коли деякий процес зробив запит про вхід у критичну секцію, і до моменту, коли цей запит задоволений.

При цьому передбачається, що кожен процес виконується з ненульовою швидкістю, але не робиться ніяких припущень про співвідношення швидкостей процесів.

Алгоритм рішення проблеми критичної секції

Нехай для простоти є тільки два процеси – P0 й P1. Загальна структура i - го процесу повинна мати вигляд:

do {

вхід у критичну секцію

критична секція

вихід із критичної секції

інша частина коду

} while (1)

Процеси можуть використати загальні змінні для синхронізації своїх дій.

Алгоритм 1. Почнемо першу спробу рішення проблеми. Уведемо цілу змінну turn (черга), значення якої turn == i буде позначати, що наступила черга процесу номер i увійти у свою критичну секцію. Спочатку turn == 0.

Алгоритм процесу Pi має вигляд:

do {

while (turn != i);

критична секція

turn = j; /* j != i: якщо i == 0, j == 1; якщо i == 1, j == 0 */

інша частина коду

} while (1)

Очевидно по побудові, що даний алгоритм задовольняє принципу взаємне виключення. Однак він не задовольняє принципу прогрес: алгоритм не вживає ніяких мір, щоб обмежити час вибору процесу, що бажає почати критичну секцію. Причина в наступному: алгоритм не зберігає інформацію про те, які процеси бажають увійти у свої критичні секції.

Алгоритм 2.Будемо зберігати не номер процесу, допущеного до критичної секції, а масив булевских прапорів flag [2], такий, що flag[i] == true, якщо i -й процес готовий увійти у свою критичну секцію. Алгоритм процесу Pi прийме вид:

do {

flag[i] = true;

while (flag[j]); /* j!=i: якщо i==0, j==1; якщо i == 1, j == 0 */

критична секція

flag[i] = false;

інша частина коду

} while (1)

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

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

Алгоритм 3. Модифікуємо алгоритм, використовуючи в ньому одночасно й змінну turn, і масив прапорів flag. Алгоритм процесу прийме вид:

do {

flag[i] = true;

turn = j;

while (flag[j] and turn == j);

критична секція

flag[i] = false;

інша частина коду

} while (1)

Можна перевірити, що даний варіант алгоритму задовольняє всім трьом принципам і вирішує проблему синхронізації по критичних секціях. Формальний доказ надаємо студентам. Ідея даного варіанта алгоритму в тім, що перед входом у критичну секцію процес спочатку заявляє про свій намір у неї ввійти, але потім намагається надати право на вхід у критичну секцію іншому процесу й тільки після того, як інший процес її виконав і більше не бажає в неї ввійти, входить сам у свою критичну секцію.