Задача «поставщик — потребитель»
Решение задачи «поставщик - потребитель» является характерным примером использования семафорных операций. Содержательная постановка этой задачи уже была нами описана в первом разделе данной главы. Разделяемыми переменными здесь являются счетчики свободных и занятых буферов, которые должны быть защищены со стороны обоих процессов, то есть действия по посылке и получению сообщений должны быть синхронизированы. Использование семафоров для решения данной задачи приведено в листинге 6.11.
Листинг 6.11. Решение задачи «поставщик — потребитель»
var 5_свободно,5_заполнено.5_вэаимоискл: semaphore; begin
InitSem(S_CBo6oflHO.N); 1пП5ет(5_залолнено.О): 1пН5ет($_взаимоискл,1); parbegin
ПОСТАВЩИК: while true do begin
{ приготовить сообщение } Р(5_свободно); Р(5_взаимоискл);
(послать сообщение } \К5_заполнено): У(5_взаимоискл); end and
ПОТРЕБИТЕЛЬ: while true do begin
Р(5_заполнено): Р(5_взаииоискл):
{ получить сообщение } V(S_ceo6oflHo): У(5_взаимоискл):
{ обработать сообщение } end pa rend end.
Здесь переменные 5_свободно, 5_заполнено являются числовыми семафорами, 5_взаиноискл - двоичный семафор. 5_свободно имеет начальное значение, равное N, где N - количество буферов, с помощью которых процессы связываются. Предполагается, что в начальный момент количество свободных буферов равно N; соответственно, количество занятых равно нулю. Двоичный семафор S вэаи-моискл гарантирует, что в каждый момент только один процесс сможет работать с критическим ресурсом, выполняя свой критический интервал. Семафоры 5_сво-бодно и 5_заполнено используются как счетчики свободных и заполненных буферов, i
Действительно, перед посылкой сообщения «поставщик» уменьшает значение 5_свободно на единицу в результате выполнения Р(5_свободно), а после посылки сообщения увеличивает значение 5_заполненО на единицу в результате выполнения У(5_эаполнено). Аналогично, перед получением сообщения «потребитель» уменьшает значение 5_заполнено в результате выполнения Р(5_заполнено), а после получения сообщения увеличивает значение 5_свободно в результате выполнения У(5_свободно). Семафоры 5_заполнено, 5_свободно могут также использоваться для блокировки соответствующих процессов. Если пул буферов оказался пустым и к нему первым обратится процесс «потребитель», он заблокируется на семафоре 5_заполнено в результате выполнения Р(5_заполнено). Если пул буферов заполнен и к нему в этот момент обратится процесс «поставщик», то он будет заблокирован на семафоре 5_свободно в результате выполнения Р(5_свободно). В решении задачи о «поставщике» и «потребителе» общие семафоры применены для учета свободных и заполненных буферов. Их можно также применить и для распределения иных ресурсов.
Дата добавления: 2015-01-18 | Просмотры: 908 | Нарушение авторских прав
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
|