Page 110 - 4868
P. 110

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

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

                     Лістинг 1.25 – Реалізація семафора за допомогою монітора

                     monitor Semaphore {
                       int s = 0; ## s>= 0
                       cond pos; # отримати сигнал, коли s > 0
                       procedure Psem() {
                         while (s == 0) wait(pos);
                         s = s-1;
                       }
                       procedure Vsem() {
                         s = s+1;
                         signal(pos);
                       }
                     }

                     У  лістингу  1.25  цілочисельна  змінна  s  представляє  собою  значення
               семафора. Процедура Psem, призупиняє процес, доки значення змінної s не
               стане  додатнім,  а  потім  зменшує  його  на  1.  Затримка  реалізується  за
               допомогою  циклу  while,  який  переводить  процес  в  режим  очікування  за
               умови,  що  змінна  s  дорівнює  0.  Операція  Vsem  збільшує  s  на  1  і  генерує
               сигнал для змінної pos. Якщо існують призупинені процеси, то запускається
               на виконання «найстарший» із них.
                     Програмаз  лістингу  1.25  коректно  працює  як  при  порядку
               «сигналізувати  і  очікувати»  (SW),  так  і  при  «сигналізувати  і  продовжити»
               (SC). Під коректністю роботи розуміється збереження істинності  інваріанта
               семафора  s >= 0.  Порядок  роботи  відрізняються  тільки  послідовністю
               виконання процесів. Викликаючи процедуру Psem, процес очікує доки змінна
               s дорівнює 0, а після запуску зменшує її значення. Викликаючи Vsem, процес
               спочатку збільшує змінну s, після чого запускає призупинений процес. При
               порядку SW призупинений процес виконується відразу та зменшує значення
               семафора s. При порядку SC призупинений процес виконується через деякий
               час після завершення процесу, що згенурував сигнал. Призупинений процес
               повинен  перевірити  значення  семафора  s  щоб  переконатися,  що  воно

               позитивне,  оскільки  можлива  ситуація  в  якій  інший  процес  з  черги  входу
               виконав процедуру Psem і зменшив значення s. Таким чином, код в лістингу
               1.25 забезпечує послідовність обслуговування FIFO для порядку SW, але не
               для порядку SC.
                     У  лістингу  1.25  представлена  ще  одна  відмінність  між  порядками
               вироблення  сигналів  SW  та  SС.  При  порядку  SW  цикл  while  в  процедурі
               Psem  можна  замінити  простим  оператором  if.  При  цьому  процес,  який
               отримав сигнал, відразу розпочне своє виконання.
   105   106   107   108   109   110   111   112   113   114   115