Рекс не в тупиковой ситуации.
(в качестве примечания: правильным термином будет сценарий голодания, поскольку для тупика необходимо как минимум два потока, которые необходимо «застрять», см. википедию: тупик и голод )
Когда процессы 2 и 1 переходят на уровень 0, для шага [0] устанавливается значение 1 или 2, и поэтому условие продвижения процесса 0 ложно, поскольку step[0] == 0
ложно.
Алгоритм Петерсона для 2 процессов немного проще и защищает от голода.
Алгоритм Петерсона для n процессов намного сложнее
Чтобы в ситуации, когда процесс голодает, условие step[j] == i and some_pos_is_big(i, j)
должно выполняться всегда. Это подразумевает, что ни один другой процесс не входит в тот же уровень (что делает step[j] == i
ложным) и что по крайней мере один процесс всегда находится на том же уровне или на более высоком уровне, что и i (чтобы гарантировать, что some_pos_is_big(i, j)
остается истинным)
Кроме того, только один процесс может быть заблокирован на этом уровне j
. Если бы два были заблокированы, то для одного из них step[j] == i
было бы ложным, и поэтому не было бы заблокировано.
Это означает, что ни один процесс не может войти на один и тот же уровень, и всегда должен быть процесс на уровне выше.
Поскольку ни один другой процесс не может присоединиться к вышеуказанным процессам (поскольку они не могут попасть на уровень j и, следовательно, не выше lelel j), по крайней мере, один процесс должен быть заблокирован слишком высоко или процесс в критическом разделе не освобождает критическая секция.
Если мы предположим, что процесс в критической секции завершится через конечное время, то только один из вышеуказанных процессов должен быть заблокирован.
Но для того, чтобы тот был заблокирован, другой выше должен быть заблокирован и т. Д.
Однако выше есть только конечные процессы, поэтому в конечном итоге верхний процесс не может быть заблокирован, так как он будет продвигаться после освобождения критической секции.
И поэтому алгоритм Петерсона для n процессов защищает от голодания!