Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпора UNIX.doc
Скачиваний:
29
Добавлен:
15.06.2014
Размер:
530.43 Кб
Скачать

Решение №1.

begin integer очередь;

очередь := 1;

parbegin

процесс 1: begin

L1: if (очередь = 2) then goto L1;

критический интервал 1;

очередь := 2;

остаток цикла 1;

goto L1;

end;

parend;

end;

процесс 2: begin

L2 if (очередь = 1) then goto L2;

критический интервал 2;

очередь := 1;

остаток цикла 2;

goto L2;

end;

Недостатки решения:

  • процессы могут входить в критический интервал строго последовательно

  • если кто-то из процессов останется в остатке цикла, то он затормозит и второй процесс

Решение №2.

begin integer С1,С2;

С1 := 1;

С2 := 1;

parbegin

процесс 1: begin

L1: if (С2 = 0) then goto L1;

С1 := 1;

критический интервал 1;

С1 := 0;

остаток цикла 1;

goto L1;

end;

parend;

end;

процесс 2: begin

L2 if (С1 = 1) then goto L2;

С2 := 0;

критический интервал 2;

С2 := 1;

остаток цикла 2;

goto L2;

end;

Недостаток: принципиально при развитии процессов строго синхронно они могут одновременно войти в критический интервал.

Решение №3.

begin integer С1,С2;

С1 := 1;

С2 := 1;

parbegin

процесс 1: begin

А1: С1 := 0;

L1: if (С2 = 0) then goto L1;

критический интервал 1;

С1 := 1;

остаток цикла 1;

goto А1;

end;

parend;

end;

процесс 2: begin

А2: С2 := 0;

L2 if (С1 = 1) then goto L2;

критический интервал 2;

С2 := 1;

остаток цикла 2;

goto А2;

end;

Недостаток: возникает другая проблема – может бесконечно долго решаться вопрос о том, кто первым войдет в критический интервал.

Решение №4.

begin integer С1,С2;

С1 := 1;

С2 := 1;

parbegin

процесс 1: begin

L1: С1 := 0;

if (С2 = 0) then begin

C1 := 0;

goto L1;

end;

критический интервал 1;

С1 := 1;

остаток цикла 1;

goto L1;

end;

parend;

end;

процесс 2: begin

L2: С2 := 0;

if (С1 = 0) then begin

C2 := 0;

goto L2;

end;

критический интервал 2;

С2 := 1;

остаток цикла 2;

goto L2;

end;

Решение №5.

begin integer С1,С2,очередь;

С1 := 1;

С2 := 1;

очередь := 1;

parbegin

процесс 1: begin

А1: С1 := 0;

L1: if (С2 = 0) then begin

if (очередь = 1) then goto L1;

C1 := 1;

B1: if (очередь = 2) then goto B1;

goto А1;

end;

критический интервал 1;

очередь := 2;

С1 := 1;

остаток цикла 1;

goto А1;

end;

parend;

end;

процесс 2: begin

А2: С2 := 0;

L2 if (С1 = 0) then begin

if (очередь = 2) then goto L2;

C2 := 1;

B2: if (очередь = 1) then goto B2;

goto А2;

end;

критический интервал 2;

очередь := 1;

С2 := 1;

остаток цикла 2;

goto А2;

end;

Для доказательства корректности задачи взаимного исключения необходимо проверить три положения:

  1. Решение безопасно в том смысле, что два процесса не могут одновременно оказаться в своих критических интервалах

  2. В случае сомнения, кому из двух процессов первому войти в критический интервал, выяснение этого вопроса не откладывается до бесконечности

  3. Остановка какого-либо из процессов в остатке цикла не вызывает блокировки другого процесса.