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

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, то он должен присоединиться к процессам, которые ожидают размещения порции в буфер.