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

4.13 Пара "производитель-потребитель"

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

program парапроизводительпотребитель;

var исключительныйдоступ: семафор;

числозанесено: семафор;

буферчисла: целое;

procedure процесспроизводитель;

var следующийрезультат: целое;

begin

while истина do

begin

вычислениеследующегорезультата;

Р(исключительныйдоступ);

буферчисла := следующийрезультат;

V(исключительныйдоступ);

V(числозанесено)

end

end;

procedure процесспотребитель;

var следующийрезультат: целое;

begin

while истина do

begin

Р(числозанесено);

Р(исключительныйдоступ);

следующийрезультат := буферчисла;

V(исключительныйдоступ);

записать (следующий результат)

end

end;

begin

инициализациясемафора(исключительныйдоступ, 1);

инициализациясемафора(числозанесено, 0);

p

Рис. 4.11 Реализация взаимодействия в паре "производитель – потребитель" при помощи семафоров.

arbegin

процесспроизводитель;

процесспотребитель

parend

end;

Рассмотрим следующую пару (отношение) "производитель – потребитель". Предположим, что один процесс, источник, или производитель, генерирует информацию, которую другой процесс, получатель, или потребитель, использует. Предположим, что они взаимодействуют при помощи одной разделяемой целой перемен­ной с именем "буферчисла". Процесс-производитель производит некоторые вычисления, а затем заносит результат в "буферчисла";

процесс-потребитель читает "буферчисла" и печатает результат.

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

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

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

На рис. 4.11 показана параллельная программа, в которой для реализации взаимодействия в паре "производитель – потребитель" применяются операции над семафорами.

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