У меня есть сценарий для обсуждения здесь для алгоритма Петерсона:
flag[0] = 0;
flag[1] = 0;
turn;
P0: flag[0] = 1;
turn = 1;
while (flag[1] == 1 && turn == 1)
{
// busy wait
}
// critical section
...
// end of critical section
flag[0] = 0;
P1: flag[1] = 1;
turn = 0;
while (flag[0] == 1 && turn == 0)
{
// busy wait
}
// critical section
...
// end of critical section
flag[1] = 0;
Предположим, что оба процесса запуска выполняются одновременно .P0 устанавливает флаг [0] = 1 и умирает. Затем начинается P1. Его условие while будет выполняться как флаг [0] = 1 (установленный P0 и turn = 0), и он будет застревать в этом цикле навсегда, что является мертвой блокировкой.
Итак, алгоритм Петерсона не учитывает этот случай?
В случае, если процесс анализа не учитывается при анализе таких алгоритмов, то в книге "Операционная система" Уильяма Столлинга в приложении A содержится серия алгоритмов для concurrency, начиная с 4 неправильного алгоритма демонстрации. Это доказывает их неверность, рассматривая случай смерти процесса (в дополнение к другим случаям) до завершения, но затем утверждает, что алгоритм Петерсона является правильным.
Я наткнулся на этот поток, который подсказывает, что существует проблема при рассмотрении N процесса (n > 2), но для двух процессов этот алгоритм отлично работает.
Итак, есть ли проблема в анализе алгоритма (предложенного одним из моих одноклассников, и я полностью его второй), как обсуждалось выше, или алгоритм Петерсона не требует взаимоблокировки с 2 процессами?
В этой статье Некоторые мифы о знаменитых алгоритмах взаимного исключения автор заключил Петерсон никогда не утверждал, что его алгоритм обеспечивает ограниченный обход.
Может ли неограниченный обход считаться бесконечным, как в случае тупика? В этом случае у нас может быть меньше проблем с принятием того, что алгоритм Петерсона может привести к тупиковой ситуации.