Page 111 - 4868
P. 111

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

                     if (s == 0) wait(pos);

                     Монітор,  представлений  в  лістингу  1.25,  можна  модифікувати  таким
               чином, щоб він коректно працював при обох порядках запуску процесів (SC
               та SW), при цьому не  використовував  цикл while  та реалізував семафор  з
               порядком обслуговування FIFO.
                     Повернемося до програми в лістингу 1.25. Коли процес вперше викликає
               процедуру Psem, то він повинен призупинити своє виконання, якщо значення
               s дорівнює 0. Процес, що викликає процедуру Vsem, запускає призупинений
               процес, якщо такий існує. Різниця між виробленням сигналів в порядку SC та
               SW полягає в тому, що якщо процес-сигналізатор продовжує виконуватися,
               то уже збільшене на одиницю значення семафора s може зчитати не тільки
               запущений,  але  і  будь-який  інший  просес  із  черги.  Для  вирішення  даної
               проблеми процес, що викликає процедуру  Vsem повинен сигналізувати для
               змінної pos, при цьому не збільшуючи значення семафора s (у випадку, якщо
               існує  призупинений  процес),  інакше  збільшити  значення  семафора  s.
               Відповідно, якщо процес, що викликає процедуру Psem, повинен очікувати,

               то надалі він не зменшить значення семафора s, оскільки до того часу воно
               не буде збільшене процесом, що згенерував сигнал.

                     Монітор, що використовує описаний спосіб сигналізації, представлений
               в  лістингу  1.26.  Даний  метод  називається  передачею  умови,  оскільки,
               сигналізатор  неявно  передає  значення  умови  процесу(змінна  s > 0),  який
               він запускає. Умова є прихованою, тому жоден інший процес, окрім того, що
               виконує запуск операції signal, не побачить, що умова стала істинною і не
               припинить очікування.

                     Лістинг 1.26 –Реалізація семафора FIFO з передачею умови

                     monitor FIFOsemaphore {
                       int s = 0; ## s>= 0
                       cond pos; # отримує сигнал, коли s > 0
                       procedure Psem() {
                         if (s == 0) wait(pos);
                         else s = s-1;
                       }
                       procedure Vsem() {
                         if (empty(pos))s = s+1;
                         elsesignal(pos);
                       }
                     }

                     Даний  метод  передачі  умови  можна  використовувати  скрізь,  де  в
               процедурах з викликами wait та signal є дії, що доповнюють одна одну. У
               лістингу  1.26  такими  діями  є  збільшення  змінної  s  у  процедурі  Psem  та  її
               зменшення у процедурі Vsem.
                     З  лістингів  1.25  та  1.26  можна  побачити,  що  умовні  змінні  аналогічні

               операціям P та V у випадку використання семафорів. Операція wait, подібно
   106   107   108   109   110   111   112   113   114   115   116