Page 90 - 4868
P. 90

Ошибка! Стиль не определен.                                                                88

               які  покидають.  Як  і  при  вирішенні  задачі  критичної  секції,  семафори
               полегшують  реалізацію  бар’єрної  синхронізації.  Основна  ідея  полягає  у
               використанні  семафора  в  якості  прапорця  синхронізації.  Виконуючи
               операцію  V,  процес  встановлює  прапорець,  а  при  виконанні  операції  P  –
               очікує  установки  прапорця,  після  чого  скидає  його.  Якщо  кожен  процес

               паралельної  програми  виконується  на  власному  процесорі,  то  затримки  на
               бар’єрах  повинні  бути  реалізовані  за  допомогою  циклів  активного
               очікування, а не за рахунок блокування процесів. Таким чином, бажаною є
               саме реалізація семафорів з активним очікуванням.
                     Розглянемо  задачу  реалізації  бар’єру  для  двох  процесів.  Для  цього
               мають  виконуватися  дві  вимоги.  По-перше,  жоден  процес  не  повинен
               перейти бар’єр, поки до нього не підійшли обидва процеси. По-друге, бар’єр
               повинен допускати багаторазове використання, оскільки зазвичай одні і ті ж
               процеси синхронізуються після кожного етапу обчислень. Для рішення задачі
               критичної секції достатньо лише одного семафора, що виконує блокування,
               оскільки  потрібно  просто  визначити,  чи  знаходиться  процес  в  критичній
               секції.  Але  при  бар’єрній  синхронізації  необхідні  два  семафора  для
               сигналізації підходу процесу до бар’єра та відходу від нього.
                     Сигнальний семафорs – це семафор з нульовим (як правило) початковим
               значенням.  Процес  сигналізує  про  подію,  виконуючи  операцію  V(s).  При
               цьому  інші  процеси  очікують  події,  виконуючи  операцію  P(s).  Для
               двохпроцесного бар’єру, існує дві важливі події, які пов’язані  із прибуттям
               процесів до бар’єра. Отже, задачу реалізації бар’єру для двох процесів можна
               рішити за допомогою двох семафорів arrive1 та arrive2відповідно. Кожен
               процес повідомляє про своє прибуття до бар’єра, виконуючи операцію V для
               свого семафора, після чого очікує прибуття іншого процесу, виконуючи для
               його семафора операцію P. Дане рішення приведено в лістингу 1.17. Оскільки
               бар’єрна синхронізація симетрична, процеси працюють однаково – кожен із
               них  сигналізує  про  своє  прибуття  і  очікує  на  прибуття  інших.
               Використовувані таким чином семафори схожі на змінні у вигляді прапорців,
               оскільки  їх  застосування  повинне  відповідати  принципам  синхронізації  з
               прапорцями.

                     Лістинг 1.17 – Бар’єрна синхронізація з використанням семафорів

                     sem arrive1 = 0, arrive2 = 0;
                     process Worker1 {
                       ...
                       V(arrive1); /* сигнал про прибуття */
                       P(arrive2); /* очікування іншого процесу */
                       ...
                     }
                     process Worker2 {
                       ...
                       V(arrive2); /* сигнал про прибуття */
                       P(arrive1); /* очікування іншого процесу */
   85   86   87   88   89   90   91   92   93   94   95