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

Взаимодействие через переменные состояния

Исходные данные:

  1. Можно определять и формировать исходные процессы

  2. Процессы могут связываться друг с другом через общие переменные

  3. Имеются средства синхронизации

Замечания:

  1. При взаимодействии процессов могут возникать решения, которые касаются более чем одного процесса. Не всегда очевидно, какое решение будет принято. Если не найден какой-то руководящий принцип (например, критерии эффективности), то с целью определённости нужно установить некоторые ограничения.

  2. Если разрабатываются реально работающие системы, то требуется убедиться в корректности решения. При параллельном программировании использование проверяющих тестов затруднено, поэтому вопросы проверки правильности решения должны рассматриваться в самых начальных этапах проектирования системы.

Пример применения приоритетного правила

Рассматриваются производители, которые выдают порции информации различного размера и размер порции выражается в некоторых единицах. Потребитель обрабатывает последовательные порции из буфера и умеет обрабатывать порции, размер которых заранее не задан. Максимальный размер порции известен. Максимальный размер буфера определён в единицах информации, а не в количестве порций. Размер буфера  не менее максимального размера порции информации. Вопрос о возможности размещения в буфере определенной выработанной порции зависит от размера этой порции.

Если имеется более одного производителя и какой-то из них ждет из-за отсутствия достаточного места в буфере, то другие производители могут продолжать работу и достигнуть точки, когда они желают выдать выработанную порцию информации в буфер.

При принятии решения, кому первому поместить информацию в буфер, формируется требование: производитель, предлагающий большую порцию, имеет больший приоритет. Если порции равны, то не имеет значения, кто добавит информацию первым.

Дано: N  производителей; M  потребителей; RB  размер буфера.

begin

integer array желание[1:N], СП[1:N];

integer ЧПБ, ББ, РБ, ЧСЕБ, i;

for цикл:=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;

Для решения задачи вводится переменная состояния для каждого производителя  “желание”, обозначающая число единиц информации в буфере, необходимых для размещения порции, которая в текущий момент не может быть добавлена к буферу. Если для процесса-производителя эта переменная равна нулю, то производитель не имеет неудовлетворённых требований на добавление порций.

Для каждого производителя вводится двоичный семафор СемПр.

Для буфера вводится двоичный семафор РБ (работа с буфером), предназначенный для взаимного исключения при работе с буфером в широком смысле, т.е. не только взятие и добавление, но также проверка и модификация связанных с буфером переходных состояний.

Как только в буфер добавляется новая порция, она может быть обработана, т.к. безразлично, кто из потребителей её возьмёт, то для определения этого может быть использован общий семафор ЧПБ (число порций в буфере). О свободных областях в буфере производителям сообщается через целочисленную переменную состояния ЧСЕБ (число свободных единиц в буфере). Введена целочисленная переменная ББ (блокировка буфера), значение которой определяет, сколько производителей имеют желание добавить порцию в буфер.