Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Взаимное исключение + семафоры.docx
Скачиваний:
1
Добавлен:
24.09.2019
Размер:
1.35 Mб
Скачать
  1. Решение:

Init: proc (var S: integer; value: integer); begin S:=value end;

PP: procedure (var S: integer);

common binary semaphore B1, B2;

Begin P(B1); S:=S–1; if S<0 then begin V(B1); P(B2) end

Else V(B1) end;

VP: procedure (var S: integer);

common binary semaphore B1, B2;

Begin P(B1); S:=S+1; if S<=0 then V(B2); V(B1 ) end;

//нет инициализации семафоров. Нужно изменить Init до:

Init: proc (var S: integer; value: integer);

common binary semaphore B1, B2;

begin B1:=1; B2:=0; S:=value end;

  1. Решение:

Init: proc (var S: integer; value: integer);

common binary semaphore B1, B2;

begin B1:=1; B2:=0; S:=value end;

PP: procedure (var S: integer);

common binary semaphore B1, B2;

Begin P(B1); S:=S–1; P(B2) end;

VP: procedure (var S: integer);

common binary semaphore B1, B2;

Begin P(B2); S:=S+1; V(B1 ) end;

//нету V(B2)

+ нет связи с переменной S.

Можно исправить до «а» с исправленной Init

  1. Решение:

Init: proc (var S: integer; value: integer); common binary semaphore B;

begin B:=1; S:=value end;

PP: procedure (var S: integer);

common binary semaphore B;

Begin if S>0 then begin P(B); S:=S–1; V(B) end end;

VP: procedure (var S: integer);

common binary semaphore B;

Begin P(B); S:=S+1; V(B) end;

//если S<=0 то PP ничего не делает

  1. Решение:

Init: proc (var S: integer; value: integer); begin S:=value end;

PP: procedure (var S: ); common binary semaphore B1, B2;

Begin P(B1); S:=S–1; if S<0 then P(B2) Else V(B1) end;

VP: procedure (var S: ); common binary semaphore B1, B2;

Begin P(B1); S:=S+1; if S<=0 then V(B2); V(B1 ) end;

Нет инициализации семафоров. Если переписать процедуру Init до:

Init: proc (var S: integer; value: integer);

common binary semaphore B1, B2;

begin B1:=1; B2:=1; S:=value end;

Если в какой то момент времени S стало равно 0, а B2=1, то, проходя процедуру PP, мы проходим «P(B2)» и B2 стало =0. В итоге прошли PP насквозь, ресурса как не было, так и нет, а должны были встать на ожидание.

  1. Решение:

Init: proc (var S: integer; value: integer);

common binary semaphore B1, B2;

begin B1:=1; B2:=1; S:=value end;

PP: procedure (var S: integer);

common binary semaphore B1, B2;

Begin P(B1); S:=S–1; if S<0 then P(B2) Else V(B1) end;

VP: procedure (var S: integer);

common binary semaphore B1, B2;

Begin P(B1); S:=S+1; if S>0 then V(B2); V(B1 ) end;

Если S=0, аналогично «d» в РР проходим все и выходим, не встав на ожидание.

  1. Задача “обедающие философы” формулируется следующим образом: “Пять философов садятся обедать за круглый стол, в центре которого стоит одно блюдо со спагетти. На столе имеется пять тарелок и пять вилок между ними. Философ может начать есть, если у него есть тарелка и две вилки, которые он может взять с двух сторон от своей тарелки. Философ может отдать одну вилку ближайшему соседу только после того, как он положит в свою тарелку спагетти, а вторую – после того, как закончит обед”. О соображениях гигиены мы здесь умалчиваем. Может ли описанный ниже на псевдокоде процесс представить алгоритм поведения философа за столом?