Próbuję zrozumieć algorytmy Petersona i Dekkera, które są bardzo podobne i wykazują wiele symetrii.
Próbowałem sformułować algorytmy w nieformalnym języku w następujący sposób:
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;
Różnica wydaje się być punktem, w którym "You can enter next."
występuje i faktem "if it's your turn I don't want to enter any more."
występującym w Dekker.
W algorytmie Petersona oba procesy wydają się dominujące. Wydaje się, że proces wkracza do krytycznej sekcji, chyba że przyszła kolej na drugą.
I odwrotnie, w algorytmie Dekkera oba procesy wydają się uległy i uprzejmy. Jeśli oba procesy chcą wejść do sekcji krytycznej, a przyszła kolej na drugą, proces decyduje, że nie chce już wchodzić. (Czy jest to potrzebne do wolności głodowej? Dlaczego?)
Czym dokładnie różnią się te algorytmy? Wyobrażam sobie, że kiedy oba procesy próbują wejść do sekcji krytycznej, u Petersona proces mówi „Wchodzę”, podczas gdy w Dekker proces mówi „Możesz wejść”. Czy ktoś może wyjaśnić zachowanie procesów w każdym algorytmie? Czy mój sposób wyrażenia tego w sposób nieformalny jest prawidłowy?