Page 114 - 6571
P. 114

досягли критичних точок виконання, або для відображення стану
                  спільних  змінних.  Критичні  точки  виконання  –  це  початок  і
                  закінчення  операцій  deposit  та  fetch.  Відповідні  зміни  у
                  спільному буфері пов’язані із його заповненням або очищенням.

                  Оскільки  кількість  виробників  і  споживачів  не  обмежена,  то
                  простіше  виконати  зв’язування  семафора  із  кожним  з  двох
                  можливих станів буфера, а не з точками виконання процесів.

                        Нехай empty (порожній) і full (повний) – два семафора, що
                  відображають стан буфера. У початковому стані буфер порожній,
                  тому  семафор  empty  має  значення  1  (тобто  відбулася  подія

                  «спустошити  буфер»),  a  full  –  значення  0.  Перед  виконанням
                  операції  deposit  виробник  спочатку  очікує  очищення  буфера.

                  Коли  виробник  поміщає  в  буфер  повідомлення,  буфер  стає
                  заповненим.  І,  навпаки,  перед  виконанням  операції  fetch
                  споживач  спочатку  очікує  заповнення  буфера,  а  потім  очищує
                  його.  Процес  очікує  на  подію,  виконуючи  операцію  P  для

                  відповідного  семафора,  і  повідомляє  про  подію,  виконуючи
                  операцію V. Отримане рішення показано в лістингу 18.

                        Змінні  empty  та  full  в  лістингу  18  є  двійковими
                  семафорами.  Разом  вони  утворюють  так  званий  спільний
                  двійковий  семафор,  оскільки  в  будь-який  момент  часу  тільки
                  один  з  них  може  мати  значення  1.  Термін  «спільний  двійковий

                  семафор»  зумовлений  тим,  що  змінні  empty  та  full  можуть
                  розглядатися  як  єдиний  двійковий  семафор,  розділений  на  дві

                  частини.  У  загальному  випадку  спільний  двійковий  семафор
                  може бути утворений будь-яким числом двійкових семафорів.
                        Роль спільних двійкових семафорів особливо важлива під час
                  реалізації  взаємного  виключення.  Припустимо,  що  один  з

                  двійкових  семафорів  ініціалізований  значенням  1  (відповідно,
                  інші  мають  значення  0).  Припустимо,  що  в  процесах,  які
                  використовують семафори, кожна виконувана гілка починається

                  операцією P для одного із семафорів і закінчується операцією V
                  для  будь-якого  іншого  семафора.  Тоді  всі  оператори  між  P  і
                  найближчою  операцією  V  виконуються  із  взаємним  винятком,

                  тобто  якщо  процес  знаходиться  між  операціями  P  та  V,  то  всі
                  семафори  рівні  0,  і,  отже,  жоден  процес  не  зможе  завершити

                  операцію P, поки перший процес не виконає операцію V.


                                                             113
   109   110   111   112   113   114   115   116   117   118   119