Page 72 - 4868
P. 72
Ошибка! Стиль не определен. 70
критичну секцію.
Розглянемо рішення задачі критичної секції для двох процесів (лістинг
1.3).Його недолік полягає в тому, що воно не визначає, який із процесів, що
намагаються увійти в критичну секцію, туди дійсно потраплять.Наприклад,
один процес може увійти в критичну секцію, виконати її, потім повернутися
до протоколу входу і знову успішно увійти в критичну секцію.Щоб рішення
було справедливим, повинна дотримуватися черговість входу в критичну
секцію, якщо декілька процесів намагаються туди увійти.
Алгоритм розриву вузла (алгоритм Пітерсона) – це варіант протоколу
критичної секції (лістинг 1.3), який «розриває вузол», коли два процеси
одночасно намагаються увійти в критичну секцію. Для цього
використовується додаткова змінна, яка фіксує, який із процесів увійшов в
критичну секцію останнім.
Алгоритм програми в лістингу 1.7 дуже близький до дрібномодульного
рішення, для якого не потрібні оператори await. Зокрема, якщо всі
оператори await задовольняють умові «не більше одного», то їх можна
реалізувати у вигляді циклів активного очікування. Нажаль, оператори await
в лістингу 1.7 звертаються до двох змінних, кожну з яких змінює інший
процес. Проте в даному випадку немає необхідності в неподільному
обчисленні умов затримки.
Лістинг 1.7– Алгоритм розриву вузла для двох процесів
(крупномодульне рішення)
bool in1 = false, in2 = false;
in1 last = 1;
process CS1 {
while (true) {
last = 1;
in1 = true; /* протокол входу */
<await (!in2 or last == 2);>
критична секція;
in1 = false; /* протокол виходу */
некритична секція;
}
}
process CS2 {
while (true) {
last = 2; in2 = true; /* протокол входу */
<await (!in1 or last == 1);>
критична секція;
in2 = false; /* протокол виходу */
некритична секція;
}
}
Оскільки умову закінчення затримки не обов’язково обчислювати