В общем о семафорах! см.билет№32
В задаче о поставщиках и потребителях поставщики посылают сообщения, получаемые
потребителями. Процессы общаются через разделяемый буфер, выполняя либо операцию
«поместить» либо операцию «извлечь». Операцию «поместить» выполняет процесс -поставщик,
операцию «извлечь» - процесс потребитель.
Необходимо запрограммировать работу процессов так, чтобы сообщения не перезаписывались без
прочтения, и каждое из них могло бы быть прочитано только один раз.
Семафоры и семафорные примитивы можно использовать и как счетчики ресурсов. Рассмотрим это
применение на примере задачи «поставщик-потребитель».
Постановка задачи:
П1 – поставщик; создает информацию (процесс П11) и помещает ее (П12) в общий буферный пул.
Емкость буферного пула – N буферов.
П2 – потребитель; считывает информацию (процесс П21) из буферного пула и выводит ее на печать
(процесс П22).
e – переменная, означающая число свободных буферов.
f – переменная, означающая число занятых буферов.
Необходимо обеспечить взаимодействие процессов так, чтобы в текущий момент времени к
буферному пулу имел доступ только 1 из процессов; также необходимо предотвратить си туацию, когда
процесс-поставщик пытается записать информацию в несуществующий буфер или процесс -потребитель
пытается считать информацию из несуществующего буфера.
Решение:
П1: {L1: П11; P(e); P(S); П12; V(f); V(S); goto L1}
П2: {L2: P(f); P(S); П21; V(e); V(S); П22; goto L2}
Теперь при отсутствии свободного ячейки буфера процесс П1 остановится на примитиве Р(е), не
заблокировав критическую секцию работы с буферным пулом. Следовательно, процесс П2 сможет без
помех обратиться к буферному пулу и освободить буфер.
Представленное решение справедливо для любого числа процессов-поставщиков и процессов-потребителей