Составители:
печивает условие входа в критическую секцию (протокол входа):
вход в критическую секцию возможен лишь в случае, если наш но-
мер меньше всех ненулевых.
К сожалению, написанный алгоритм не реализуем непосред-
ственно на существующих ЭВМ, ибо для того, чтобы осуществить
присваивания переменной turn[i] требуется найти максимальное
из n значений разделяемого массива turn. Для реализации этой
операции неделимым образом необходимо использовать еще один
протокол критической секции (например, алгоритм раз рыва узла);
однако, такое усложнение является неэффективным.
Рассмотрим два процесса CS1 и CS2. Пус ть
turn1 = turn2 + 1;
while (turn2! = 0 and turn1 > turn2) skip;
— протокол входа для процесса CS1, а
turn2 = turn1 + 1;
while (turn1! = 0 and turn2 > turn1) skip;
— аналогичный протокол для процесса CS2. Каждый процесс при-
сваивает значение своей переменной turn в соответствии с упомя-
нутой программой (при n = 2). Однако, при таком решении оба про-
цесса могут одн овреме нн о оказаться в своей критической секции:
например, если процесс CS1 определит, что turn2 имеет значение
0, то он присвоит turn1 единицу и начнет входить в критическую
секцию. Но до присваивания единицы первым процессом второй
процесс может сделать присвавание turn2 = 0 + 1 и войти в свою
критическую секцию. Таким образом, хотя turn1 = 1 и turn2 = 1
оба процесса оказываются в своих критических секциях одновре-
менно, что недопустимо. В результате получается состояние “гонок”
и нарушение основного принципа: в критической секции единовре-
менно может находиться лишь один процесс.
Для того, чтобы не допустить состояния гонок каждый процесс
может присвоить единицу переменн ым turn1 и turn2 соответствен-
но в самом нач але протокола входа, а именно, для процесса CS1
turn1 = 1; turn1 = turn2 + 1;
while (turn2! = 0 and turn1 > turn2) skip;
58
Страницы
- « первая
- ‹ предыдущая
- …
- 55
- 56
- 57
- 58
- 59
- …
- следующая ›
- последняя »
