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
               споживач спочатку очікує заповнення буфера, а потім очищує його. Процес
   86   87   88   89   90   91   92   93   94   95   96