ВУЗ:
Составители:
9
while b2 do ;
b1:= true;
Критический интервал 1;
b1:=false;
Оставшаяся часть процесса;
end;
процесс 2: begin
while b1 do ;
b2:= true;
Критический интервал 2;
b2:=false;
Оставшаяся часть процесса;
end;
coend;
Условие 3 взаимного исключения выполняется, но здесь возможны два случая:
1. Процессы входят одновременно в свои критические интервалы, при этом b1:=false
,
b2:=false, следовательно, оба процесса изменят значения переменных b1 и b2 на true, и ни
один, ни другой не сработают , то есть это решение не отвечает 1-му правилу взаимного ис-
ключения.
2. Допустим, что процессы входят не одновременно в свои критические интервалы.
Процессы обладают разными скоростями. В этом случае: процесс 1 проверил условие
b2, но ещё не успел изменить значение b1, вышедши из цикла. Если в это время процесс 2
осуществит проверку b1 (которая является false), то он сможет войти в свой критический ин-
тервал без препятствий. Приведённое решение является неудовлетворительным. Попробуем
улучшить это решение. Проверяем возможность входа в критический интервал, а потом ус-
танавливаем указатель.
Cobegin
Процесс 1: begin
b1:=true;
while b2 do ;
Критический интервал 1;
b1:= false;
Оставшаяся часть процесса 1;
end;
Процесс 2: begin
b2:=true;
while b1 do ;
Критический интервал 2;
b2:= false;
Оставшаяся часть процесса 2;
end;
coend;
В рассматриваемом случае конкурирующему процессу запрашивается вход в его кри-
тический интервал ещё до проверки возможности выполнения критического интервала рас-
сматриваемого процесса. Это гарантирует нам блокировку другого процесса заранее. Однако
в приведённой программе оба процесса могут одновременно начать выполняться и, изменив
значения переменных b1 и b2, попасть в цикл ожидания. Такая ситуация является тупиковой
(так называемый дедлок).
while b2 do ; b1:= true; Критический интервал 1; b1:=false; Оставшаяся часть процесса; end; процесс 2: begin while b1 do ; b2:= true; Критический интервал 2; b2:=false; Оставшаяся часть процесса; end; coend; Условие 3 взаимного исключения выполняется, но здесь возможны два случая: 1. Процессы входят одновременно в свои критические интервалы, при этом b1:=false, b2:=false, следовательно, оба процесса изменят значения переменных b1 и b2 на true, и ни один, ни другой не сработают , то есть это решение не отвечает 1-му правилу взаимного ис- ключения. 2. Допустим, что процессы входят не одновременно в свои критические интервалы. Процессы обладают разными скоростями. В этом случае: процесс 1 проверил условие b2, но ещё не успел изменить значение b1, вышедши из цикла. Если в это время процесс 2 осуществит проверку b1 (которая является false), то он сможет войти в свой критический ин- тервал без препятствий. Приведённое решение является неудовлетворительным. Попробуем улучшить это решение. Проверяем возможность входа в критический интервал, а потом ус- танавливаем указатель. Cobegin Процесс 1: begin b1:=true; while b2 do ; Критический интервал 1; b1:= false; Оставшаяся часть процесса 1; end; Процесс 2: begin b2:=true; while b1 do ; Критический интервал 2; b2:= false; Оставшаяся часть процесса 2; end; coend; В рассматриваемом случае конкурирующему процессу запрашивается вход в его кри- тический интервал ещё до проверки возможности выполнения критического интервала рас- сматриваемого процесса. Это гарантирует нам блокировку другого процесса заранее. Однако в приведённой программе оба процесса могут одновременно начать выполняться и, изменив значения переменных b1 и b2, попасть в цикл ожидания. Такая ситуация является тупиковой (так называемый дедлок). 9
Страницы
- « первая
- ‹ предыдущая
- …
- 7
- 8
- 9
- 10
- 11
- …
- следующая ›
- последняя »