Двухпроцессное решение для задачи критического сечения - алгоритм 1
Я начал изучать Критическую Проблему Секции и ее различные решения. Чтобы объяснить мой вопрос, позвольте мне сначала кратко изложить его.
Общая структура двухпроцессного решения для задачи критического сечения - алгоритм 1:
turn = 0;
do
{
while (turn != 0) ; //if not P0's turn , wait indefinitely
// critical section of Process P0
turn = 1; //after P0 leaves critical section, lets P1 in
//remainder section
} while (1); //loop again
Проблема с этим алгоритмом состоит в том, что он не поддерживает необходимое требование прогресса. Это заставляет критическую секцию быть в равной степени принадлежащей P0 -> P1 -> P0 -> P1 -> ... Чтобы преодолеть эту проблему, используется алгоритм 2, где переменная витка заменяется массивом flag[]
, Общая структура алгоритма 2:
do
{
flag[0] = T ;
while (flag[1]);//if flag[1] is true wait indefinitely
// critical section of Process P0
flag [0] = F; //P0 indicated it no longer needs to be in critical section
//remainder section
} while (1); //loop again
Здесь процесс может выполнить свою критическую секцию повторно, если это необходимо. (Хотя этот алгоритм тоже не поддерживает прогресс)
Теперь мой вопрос, почему мы не можем использовать переменную turn внутри цикла do-while в алгоритме 1 так же, как мы используем переменную flag[]
в алгоритме 2? Ниже приведен код, объясняющий, что я имею в виду: для процесса 0:
do
{
turn = 0;
while (turn != 0) ; //if not P0's turn , wait indefinitely
// critical section of Process P0
turn = 1; //after P0 leaves critical section, lets P1 in
//remainder section
} while (1); //loop again
Для процесса 1:
do
{
turn = 1;
while (turn != 1) ; //if not P0's turn , wait indefinitely
// critical section of Process P0
turn = 0; //after P1 leaves critical section, lets P0 in
//remainder section
} while (1); //loop again
Разве приведенный выше код не позволит процессу многократно выполнять свою критическую секцию, если это необходимо, и, следовательно, решить проблему в алгоритме 1? Я знаю, что здесь что-то не так, иначе это решение использовалось бы вообще, не знаю точно, что это такое.
0 ответов
Критическая секция больше не защищена. Среди произвольных последовательностей планирования есть одна (одна строка = исключительное выполнение в течение этого времени процессом X):
process action contents of 'turn' critical section entered (by process)
0 "turn = 1;" 1 no
0 "} while(1);" 1 no
1 "while (turn != 1);" 1 no
1 "// critical section P1" 1 yes (1)
0 "do{" 1 yes (1)
0 "turn = 0;" 0 yes (1)
0 "while (turn != 0);" 0 yes (1)
0 "// critical section P0" 0 collision!