
- •Конспект лекцій по дисципліні
- •Ос загального призначення
- •Мікроядерна архітектура
- •Переваги мікроядерної архітектури
- •Блокування пам'яті.
- •Перевірка й установка.
- •Семафори.
- •Поштові скриньки.
- •Програмні переривання
- •Системні виклики
- •Типи адрес
- •Алгоритми розподілу пам'яті
- •Забезпечення зручного логічного інтерфейсу між пристроями й іншою частиною системи
- •Підтримка широкого спектра драйверів і простота включення нового драйвера в систему
- •Динамічне завантаження й вивантаження драйверів
Блокування пам'яті.
Взаємне виключення реалізують апаратно, зробивши операції над пам'яттю неподільними, тобто якщо кожний із двох процесів намагається помістити якісь значення в ту саму осередок, то суперечка дозволяється апаратно: одному процесу дозволяється виконати операцію засилання негайно, а іншому доводиться чекати, поки перший не закінчить. Таке рішення називається блокуванням пам'яті.
Повернемося до розгляду приклада із двома паралельними процесами.
Оскільки швидкості обох процесів - довільні, зазначені вище умови повинні виконуватися які б ні минулого швидкості роботи кожного процесу щодо іншого.
Здавалося б, нічого простіше ні, як запропонувати наступне рішення:
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.
Тут уведена додаткова змінна - Черга, що вказує, чия черга спробувати ввійти, за умови, що обидва процеси хочуть виконати свої критичні ділянки. Це рішення має узагальнення для випадку довільного числа процесів, що конкурують через критичний ресурс.