Page 115 - 6571
P. 115
Лістинг 18 – Виробники та споживачі, що використовують
спільні двійкові семафори
typeT buf; /* буфер типу T */
sem empty = 1, full = 0;
process Producer[і = 1 to M] {
while (true) {
...
/* створити дані та помістити їх в буфер */
P(empty);
buf = data;
V(full);
}
}
process Consumer[j = 1 to N] {
while (true) {
/* отримати результат та обробити його */
P(full);
result = buf;
V(empty);
}
}
Рішення задачі про виробників і споживачів подане в
лістингу 18 ілюструє застосування спільних двійкових семафорів.
Кожен процес-виробник Producer по черзі виконує операції
P(empty) та V(full), а кожен процес-споживач Consumer –
операції P(full) та V(empty).
4. Задача кільцевих буферів (облік ресурсів). В останньому
прикладі продемонстровано синхронний доступ до одного буфе-
ра обміну. Якщо дані створюються та видаляються приблизно з
однаковою частотою, то процесу не доводиться довго чекати дос-
тупу до буфера. Проте зазвичай споживач і виробник працюють
нерівномірно. Наприклад, виробник може швидко створити від-
разу кілька елементів, а потім певний проміжок часу виконувати
обчислення перед створенням наступної серії елементів. У таких
випадках збільшення ємності буфера може істотно підвищити
продуктивність програми, зменшуючи число блокувань процесів.
Даний випадок є прикладом класичного компромісу між часом
обчислень і об’ємом пам’яті.
Розглянемо рішення задачі про кільцевий буфер, який
використовується в якості багатоелементного комунікаційного
114