
- •Взаимодействие процессов
- •Void p0()
- •Void p1()
- •Void main()
- •Integer очередь;
- •V(свободно);
- •Решение «спящий парикмахер»
- •Integer чпб, рб, зп;
- •Integer чпб, чпп, рб;
- •Взаимодействие через переменные состояния
- •Integer array желание[1:n], сп[1:n];
- •Integer чпб, бб, рб, чсеб, I;
- •Integer рп, I, max, nmax;
- •V(сп[nmax]);
- •Монитороподобные средства синхронизации Введение
- •3.1.12.2 Механизм типа «критическая область»
- •Var r: shared t1;
- •Var m: shared t;
- •Var m: shared t;
- •Распределение ресурсов. Проблема тупиков
- •4.1.2 Алгоритм банкира
- •Integer Св_Деньги;
- •4.1.3 Применение алгоритма банкира
Integer array желание[1:n], сп[1:n];
Integer чпб, бб, рб, чсеб, I;
for i:=1 step 1 until N do begin
желание[i]:=0;
СП[i]:=0;
end;
ЧПБ:=0; ЧСЕБ:=RB;
ББ:=0; РБ:=1;
parbegin
производитель 1: begin ... end;
. . . . . . . . . . . . . . . .
производитель n: begin integer РП;
цикл n: производство новой порции и установка размера порции (РП);
P(РБ);
if ( (ББ=0) and (ЧСЕБ ≥ РП) ) then
ЧСЕБ:=ЧСЕБ-РП;
else
begin
ББ:=ББ+1;
желание[n]:=РП;
V(РБ);
P(СП[n]);
P(РБ);
end;
добавление порции к буферу;
V(РБ);
V(ЧПБ);
goto цикл n;
end;
... ... ...
производитель N: begin ... end;
потребитель 1: begin ... end;
... ... ...
потребитель m: begin
Integer рп, I, max, nmax;
цикл m: P(ЧПБ);
P(РБ);
взятие порции из буфера и установка РП;
ЧСЕБ:=ЧСЕБ+РП;
проверка: if (ББ>0) then
begin
max:=0;
for i:=1 step 1 until N do
begin
if (max<желание[i]) then
begin
max:=желание[i];
nmax:=i;
end;
end;
if (max ≤ ЧСЕБ) then
begin
ЧСЕБ:=ЧСЕБ-max;
желание[nmax]:=0;
ББ:=ББ-1;
V(сп[nmax]);
goto проверка;
end;
end;
V(РБ);
обработка взятой порции;
goto цикл m;
end;
Для решения задачи вводится переменная состояния для каждого производителя - “желание”, обозначающая число единиц информации в буфере, необходимых для размещения порции, которая в текущий момент не может быть добавлена к буферу. Если для процесса-производителя эта переменная равна нулю, то процесс-производитель не имеет неудовлетворённых требований на добавление порций.
Для каждого производителя вводится двоичный семафор СП (семафор производителя).
Для буфера вводится двоичный семафор РБ (работа с буфером), предназначенный для взаимного исключения при работе с буфером в широком смысле, т.е. не только взятие и добавление, но также проверка и модификация связанных с буфером переходных состояний.
Как только в буфер добавляется новая порция, она может быть обработана. Так как безразлично, кто из потребителей её возьмёт, то для определения этого может быть использован общий семафор ЧПБ (число порций в буфере). О свободных областях в буфере производителям сообщается через целочисленную переменную состояния ЧСЕБ (число свободных единиц в буфере). Введена целочисленная переменная ББ (блокировка буфера), значение которой определяет, сколько процессов-производителей имеют желание добавить порцию в буфер, но не смогли разместить свои порции в буфере и она уведомляет производителя в том, что уже есть процессы, которые обнаружили, что ББ>0, то он должен присоединиться к процессам, которые ожидают размещения порции в буфер.