Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
05_Konspkt_lektsy_OS / Лекции_ОС_07.doc
Скачиваний:
51
Добавлен:
02.04.2015
Размер:
69.12 Кб
Скачать

7

Операционные системы. Лекция 7. Павлов

Лекция 07. Пара «производитель—потребитель»

1.Реализация взаимодействия в паре «производитель—потребитель»

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

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

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

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

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

На рис. 1 показана параллельная программа, в которой для реализации взаимодействия в паре «производитель — потребитель» применяются операции над семафорами.

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

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

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

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

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

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

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

begin

while истина do begin

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

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

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

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

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

end

end;

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

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

begin

while истина do begin

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

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

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

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

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

end

end;

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

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

parbegin

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

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

end;

Рис. 1.Реализация взаимодействия в паре «производитель—потребитель» при помощи

семафоров.

2. Считающие семафоры

Считающие семафоры особенно полезны в случае, если некоторый ресурс выделяется из пула идентичных ресурсов. При инициализа­ции подобного семафора в его счетчике указывается количествен­ный показатель объема ресурсов пула. Каждая операция Р вызы­вает уменьшение значения счетчика семафора на 1, показывая, что некоторому процессу для использования выделен еще один ресурс из пула. Каждая операция V вызывает увеличение значения счет­чика семафора на 1, показывая, что процесс возвратил в пул ресурс и этот ресурс может быть выделен теперь другому процессу. Если делается попытка выполнить операцию Р, когда в счетчике семафора уже нуль, то соответствующему процессу придется ждать момента, пока в пул не будет возвращен освободившийся ресурс, т. е. пока не будет выполнена операция V.

Соседние файлы в папке 05_Konspkt_lektsy_OS