Я пытаюсь понять алгоритмы Петерсона и Деккера, которые очень похожи и имеют много симметрий.
Я попытался сформулировать алгоритмы на неформальном языке следующим образом:
Peterson's: "I want to enter." flag[0]=true;
"You can enter next." turn=1;
"If you want to enter and while(flag[1]==true&&turn==1){
it's your turn I'll wait." }
Else: Enter CS! // CS
"I don't want to enter any more." flag[0]=false;
Dekker's: "I want to enter." flag[0]=true;
"If you want to enter while(flag[1]==true){
and if it's your turn if(turn!=0){
I don't want to enter any more." flag[0]=false;
"If it's your turn while(turn!=0){
I'll wait." }
"I want to enter." flag[0]=true;
}
}
Enter CS! // CS
"You can enter next." turn=1;
"I don't want to enter any more." flag[0]=false;
Разница, кажется, заключается в том, где "You can enter next."
происходит и что "if it's your turn I don't want to enter any more."
происходит у Деккера.
В алгоритме Петерсона эти два процесса кажутся доминирующими. Кажется, что процесс проталкивается в критическую секцию, если не очередь другого.
И наоборот, в алгоритме Деккера эти два процесса кажутся покорными и вежливыми. Если оба процесса хотят войти в критическую секцию, и теперь очередь другого, процесс решает больше не хотеть входить. (Это нужно для голода-свободы? Зачем?)
Как именно эти алгоритмы отличаются? Я полагаю, что когда оба процесса пытаются войти в критическую секцию, в системе Петерсона, процесс говорит: «Я вхожу», а в Деккере - «Вы можете войти». Может кто-то прояснить, как процессы ведут себя в каждом алгоритме? Правильный ли мой способ выразить это в неформальных терминах?