![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Задача производитель-потребитель.
Если в обычной последовательной программе одна процедура вызывает другую и передает ей какие-то данные, никаких проблем не возникает. Эти процедуры являются частью одной программы и выполняются последовательно.
Однако задача существенно усложняется в случае передачи данным одним
процессом другому. Это один из вариантов межпроцессной коммуникации.
Рассмотрим задачу о производителе-потребителе. Предположим, что некий
процесс-производитель производит некую информацию, которую потребляет другой процесс – потребитель. Для простоты будем считать, что информация – это
натуральные числа, а обмен между ними происходит с помощью буфера, хранящего одно значение. Производитель что-то вычисляет и помещает результат вычислений в буфер. Потребитель берет числа из буфера и что-то с ними делает,
например, печатает на экране.
В случае, если скорость работы производителя и потребителя совпадают, то
эта пара будет работать превосходно, и на экране будет формироваться поток данных от производителя. Однако в случае существенной разницы скоростей между
производителем и потребителем все становится хуже.
Если потребитель работает гораздо быстрее производителя, то потребитель
может распечатать одни и те же данные несколько раз. Если производитель работает быстрее, это может привести к потере данных – число в буфере перепишется
несколько раз, и потребитель возьмет только последнее из серии.
Этот пример демонстрирует использование семафоров для синхронизации
двух процессов, что позволяет избежать описанных выше проблем.
program producer_consumer_relationship;
var number_buffer: integer;
number_deposited: semaphore;
number_retrieved: semaphore;
procedure producer_process;
var next_result: integer;
Begin
Дата публикования: 2015-01-26; Прочитано: 200 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!