Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачи по СППО.doc
Скачиваний:
4
Добавлен:
24.09.2019
Размер:
194.56 Кб
Скачать

3. Проблема взаимного исключения: использование семафоров

  1. Задача: написать процедуры, моделирующие семафорные примитивы для общего семафора (допускаются только неотрицательные значения целочисленной переменной, моделирующей считающий семафор). При написании процедур можно использовать бинарные семафоры. Ниже приведен код процедур PP и VP, которые моделируют работу семафорных примитивов для общего семафора в соответствии с поставленной задачей. Решена ли задача? Найти в приведенном ниже псевдокоде ошибки, объяснить и исправить их, если они есть.

    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(B2); P(B1); S:=S–1; if S>0 then V(B2); V(B1) end;

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

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

    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(B2); P(B1); S:=S–1; V(B1) end;

VP: procedure (var S: integer);

common binary semaphore B1, B2;

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

    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(B2); while S<=0 do; P(B1); S:=S–1; V(B1); V(B2) end;

VP: procedure (var S: integer);

common binary semaphore B1, B2;

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

    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 P(B); if S>0 then S:=S–1; V(B) end;

VP: procedure (var S: integer);

common binary semaphore B;

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

  1. Задача: написать процедуры, моделирующие семафорные примитивы для общего семафора (допускаются любые значения целочисленной переменной, моделирующей считающий семафор). При написании процедур можно использовать бинарные семафоры. Ниже приведен код процедур PP и VP, которые моделируют работу семафорных примитивов для общего семафора в соответствии с поставленной задачей. Решена ли задача? Найти в приведенном ниже псевдокоде ошибки, объяснить и исправить их, если они есть.

    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;

    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;

    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;

    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;

    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;