Основные задачи параллельного программирования. Конспект лекций. Степанов Б.М. - 9 стр.

UptoLike

Составители: 

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