Заказать курсовые, контрольные, рефераты...
Образовательные работы на заказ. Недорого!

Решение проблемы producer-consumer с помощью семафоров

РефератПомощь в написанииУзнать стоимостьмоей работы

Одной из типовых задач, требующих организации взаимодействия процессов, является задача producer-consumer (производитель-потребитель). Пусть два процесса обмениваются информацией через буфер ограниченного размера. Производитель закладывает информацию в буфер, а потребитель извлекает ее оттуда. На этом уровне деятельность потребителя и производителя можно описать следующим образом. Легко… Читать ещё >

Решение проблемы producer-consumer с помощью семафоров (реферат, курсовая, диплом, контрольная)

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

Producer: while (1) {.

produce_item;

put_item;

}.

Consumer: while (1) {.

get_item;

consume_item;

}.

Если буфер заполнен, то производитель должен ждать, пока в нем появится место, чтобы положить туда новую порцию информации. Если буфер пуст, то потребитель должен дожидаться нового сообщения. Как можно реализовать эти условия с помощью семафоров? Возьмем три семафора: empty, full и mutex. Семафор full будем использовать для гарантии того, что потребитель будет ждать, пока в буфере появится информация. Семафор empty будем использовать для организации ожидания производителя при заполненном буфере, а семафор mutex — для организации взаимоисключения на критических участках, которыми являются действия put_item и get_item (операции «положить информацию» и «взять информацию» не могут пересекаться, так как в этом случае возникнет опасность искажения информации). Тогда решение задачи на C-подобном языке выглядит так:

Semaphore mutex = 1;

Semaphore empty = N; /* где N — емкость буфера*/.

Semaphore full = 0;

Producer:

while (1) {.

produce_item;

P (empty);

P (mutex);

put_item;

V (mutex);

V (full);

}.

Consumer:

while (1) {.

P (full);

P (mutex);

get_item;

V (mutex);

V (empty);

consume_item;

}.

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

Показать весь текст
Заполнить форму текущей работой