Page 91 - 4868
P. 91
89 Ошибка! Стиль не определен.
...
}
За допомогою наведеного в лістингу 1.17 бар’єру можна реалізувати
бар’єр-метелик для n процесів, або бар’єр з розповсюдженням. В обох
випадках необхідний масив семафорів arrive. На кожному етапі і-й процес
спочатку повідомляє про своє прибуття, виконуючи операцію
V(arrive[i]), а потім очікує прибуття решти процесів, виконуючи
операцію P над їх елементами з масиву arrive. На відміну від ситуації із
змінними-прапорцями, в даному випадку потрібен тільки один масив
семафорів arrive, оскільки дія операції V «запам’ятовується», тоді як
значення змінної-прапорця може бути перезаписане.
3.Задача про виробників та споживачів (спільні двійкові
семафори).Розглянемо знову задачу про виробників та споживачів. У
попередньому прикладі передбачалося, що існує тільки один виробник і один
споживач. Узагальнимо ту ж саму задачу на декілька виробників і декілька
споживачів. Приведене нижче рішення демонструє ще один випадок
застосування семафорів в якості сигнальних прапорців і вводить важливе
поняття спільного двійкового семафора, що визначає ще один спосіб захисту
критичних секцій коду.
У задачі про виробників і споживачів виробники пересилають
повідомлення споживачам. Процеси спілкуються за допомогою спільного
буфера, що керується двома операціями: deposit (помістити) і fetch
(витягти). Виконуючи операцію deposit, виробники поміщають
повідомлення в буфер, а споживачі в свою чергу отримують повідомлення за
допомогою операції fetch. Для того, щоб повідомлення не перезаписувалося
і кожне з повідомлень могло бути прийняте споживачем тільки один раз,
виконання операцій deposit та fetch повинне чергуватися, причому
першою завжди повинна бути операція deposit.
Реалізувати необхідне чергування операцій можна за допомогою
семафорів. У даному випадку семафори використовуються або для
повідомлення про те, що процеси досягли критичних точок виконання, або
для відображення стану спільних змінних. Критичні точки виконання – це
початок і закінчення операцій deposit та fetch. Відповідні зміни у
спільному буфері пов’язані із його заповненням або очищенням. Оскільки
кількість виробників і споживачів не обмежена, то простіше виконати
зв’язування семафора із кожним з двох можливих станів буфера, а не з
точками виконання процесів.
Нехай empty (порожній) і full (повний) – два семафора, що
відображають стан буфера. У початковому стані буфер порожній, тому
семафор empty має значення 1 (тобто відбулася подія «спустошити буфер»),
a full – значення 0. Перед виконанням операції deposit виробник спочатку
очікує очищення буфера. Коли виробник поміщає в буфер повідомлення,
буфер стає заповненим. І, навпаки, перед виконанням операції fetch
споживач спочатку очікує заповнення буфера, а потім очищує його. Процес