Составители:
а для процесса CS2
turn2 = 1; turn2 = turn1 + 1;
while (turn1! = 0 and turn2 >= turn1) skip;
В результате если процесс CS1 к моменту проверки в CS2 уже изме-
нил turn1 (так что turn1 положительно) и при этом присваивание
turn2 = turn1 + 1 вторым процессом оказалось позже упомянутого
изменения turn1, то второй процесс задержится на цикле while
до тех пор, пока первый процесс не пройдет свою критическую сек-
цию.
Замечание 1. Поскольку условия turn1 > turn2 и turn1 ≤
turn2 — взаимно исключающие и дополняющие друг друга, то обя-
зательно произойдет нарушение лишь одного из них, и поэтому
точно один процесс войдет в свою критическую секцию.
Замечание 2. Протоколы входа двух процессов несимметрич-
ны. Для того, чтобы им придать симметричный вид введем отно-
шение сравнения двух чисел формулой
(a, b) > (c, d) == true ⇔ (a > c) ∨ (a == c ∧ b > d),
(a, b) > (c, d) == false — в остальных случаях.
Тогда условия turn1 > turn2 и turn1 ≤ turn2 могут быть пред-
ставлены в виде
turn1 > turn2 ⇔ (turn1, 1) > (turn2, 2),
turn2 ≥ turn1 ⇔ (turn2, 2) > (turn1, 1).
Обобщим теперь алгоритм поликлиники для двух процессов:
каждый из процессов показывает, что он собирается войти в свою
критическую секцию, присваивая переменной turn чи сл о 1. Затем
он найдет максимальное значение из все х turn[i] и прибавит к нему
1. Далее он запускает цикл for, и так же, как в крупномодульном
решении, ждет своей очереди.
АЛГОРИТМ ПОЛИКЛИНИКИ: МЕЛКОМОДУЛЬНОЕ
РЕШЕНИЕ
int turn[1 : n] = ([n]0); # инициализация
process CS[i = 1 to n] {
59
Страницы
- « первая
- ‹ предыдущая
- …
- 56
- 57
- 58
- 59
- 60
- …
- следующая ›
- последняя »
