Ограниченное ожидание в решении Петерсона - PullRequest
0 голосов
/ 09 июня 2018

Процесс 0

do{
flag[0] = TRUE;
turn = 1; 
while (flag[1] && turn == 1);
    critical section
flag[0] = FALSE;
remainder
}while(1)

Процесс 1

do{
flag[1] = TRUE;
turn = 0; 
while (flag[0] && turn == 0);
    critical section
flag[1] = FALSE;
remainder
}while(1)

Где flag[] и turn - общие переменные.Предположим, процесс 0 начинает выполняться первым и останавливает цикл на while.Затем процесс 1 также останавливается на while.Затем процесс 0 возобновляет выполнение, в то время как условие нарушается, и он выполняет свою критическую секцию.Хорошо.
Мой вопрос: как гарантировано ограниченное ожидание?В этом сценарии я не могу разобраться:
Процесс 0 выходит из набора критических разделов flag[0] = FALSE;, но затем Процесс 1 не возобновляет выполнение, а Процесс 0 запускается снова, устанавливает flag[0] = TRUE; и может повторно войти в критическийКод раздела.Чего мне не хватает?

1 Ответ

0 голосов
/ 09 июня 2018

Процесс 0 выходит из флага установки критической секции [0] = ЛОЖЬ;но затем Процесс 1 не возобновляет выполнение, а Процесс 0 запускается заново, устанавливает флаг [0] = ИСТИНА;

Да, вы правы, но когда Процесс 0 запускается снова и пытаетсяповторно войдите в критическую секцию, он снова выполнит следующие два оператора:

flag[0] = TRUE;
turn = 1;

, поэтому поворот будет 1 , и, как мы знаем, Процесс 1 еще невошел в критическую секцию, из-за которой флаг [1] по-прежнему true и, следовательно, условие цикла

 while (flag[1] && turn == 1);

будет true , Это означает, что процесс 0 не сможет дважды войти в критическую секцию. Это удовлетворяет условию Ожидание с ограничением. Также всякий раз, когда процесс 1 возобновляет выполнение, условие

while (flag[0] && turn == 0);

станет ложным, поскольку ход - 1 , и он действительно войдет в критическую секцию.

...