Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект по ОС.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
940.03 Кб
Скачать
  1. Блокування пам'яті.

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

Повернемося до розгляду приклада із двома паралельними процесами.

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

Здавалося б, нічого простіше ні, як запропонувати наступне рішення:

Boolean : Перемикач_1, Перемикач_2;

Begin

Перемикач_1:=False;

Перемикач_2:=False;

parbegin

Процес_1: do while (True);

Цикл_1: do while (Перемикач_2);

end;

Перемикач_1:=True;

/* Критична ділянка 1 */

Перемикач_1:=False;

/* частина, Що Залишилася, процесу 1*/

end;

Процес_2: do while (True);

Цикл_2: do while (Перемикач_1);

end;

Перемикач_2:=True;

/* Критична ділянка 2 */

Перемикач_2:=False;

/* частина, Що Залишилася, процесу 2*/

end;

parend;

End.

Однак, оскільки швидкості довільні, допустимо, що Процес 2 працює набагато швидше, ніж Процес 1. Настільки швидше, що фактично після того, як Процес 1 виявляє, що в Перемикачі 2 коштує ”неправда”, але перш ніж він встигне встановити значення “істина”, у Перемикачі 1, Процес 2 пробігає свою частину, що залишилася, і перескакує через Цикл 2 (оскільки в Перемикачі 1 усе ще коштує значення “неправда”). Обидва процеси в такому випадку перейдуть до виконання (одночасно) своїх критичних ділянок, тобто в такому перемикальному випадку система буде працювати неправильно.

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

Ми ж приведемо варіант рішення, запропонованого Деккером.

Алгоритм Деккера:

integer: C1,C2,Черга;

begin

C1:=0;

C2:=0;

Черга:=1;

parbegin

Процес_1: begin C1:=1;

do while (C2=1);

if Черга=2 then

begin

C1:=0;

do while (Черга=2);

end;

C1:=1;

end;

end;

Критична ділянка Процесу 1;

C1:=0;

Черга:=2;

частина, Що Залишилася, Процесу 1;

end;

Процес_2: begin C2:=1;

do while (C1=1);

if Черга=1 then

begin

C2:=0;

do while (Черга=1);

end;

C2:=1;

end;

end;

Критична ділянка Процесу 2;

C2:=0;

Черга:=1;

частина, Що Залишилася, Процесу 2;

end;

parend;

end.

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