Page 83 - 6571
P. 83

вертає збережене попереднє значення змінної lock. Результат дії
            інструкції TS описується наступною функцією:

                  bool TS(bool lock) {
                    <bool  initial  =  lock;/*  зберегти  початкове  значення
            */
                      lock = true;/* встановити lock */
                      return initial;> /* повернути початкове значення */
                  }

                  Використовуючи інструкцію TS,  можна реалізувати крупно-
            модульний варіант програми з лістингу 4 за алгоритмом, наведе-

            ним в лістингу 5. Умовні неподільні дії в програмі з лістингу 4
            замінюються відповідними циклами. Цикли не закінчуються, до-
            ки змінна lock не набуде значення «хиба», тобто інструкція TS

            повертає значення «хиба». Оскільки всі процеси виконують одні і
            ті  ж  протоколи,  наведене  рішення  працює  незалежно  від  числа
            процесів. Використання блокуючої змінної, як це показано в ліс-

            тингу 5, зазвичай називається циклічним блокуванням (spin lock),
            оскільки  процес  постійно  повторює  цикл,  очікуючи  при  цьому
            зняття блокування.


                  Лістинг 5 – Критичні секції на основі інструкції «перевірити-
            встановити»

                  bool lock = false;/* спільна змінна */
                  process CS[i = 1 to n] {
                    while (true) {
                      while (TS(lock)) skip;/* протокол входу */
                      критична секція;
                      lock = false;/* протокол виходу */
                      некритична секція;
                    }
                  }


                  Рішення задачі критичної секції, аналогічне наведеному в лі-
            стингу 5, може бути реалізовано на будь-якій машині, якщо у неї

            є інструкція, що перевіряє і змінює спільну змінну в одній непо-
            дільній дії. Наприклад, у деяких машинах є інструкція інкременту
            (нарощення),  яка  збільшує  значення  цілочисельної  змінної  і  ви-

            значає умову, що використовується для досягнення позитивного
            значення цієї змінної. Використовуючи дану інструкцію, є мож-

                                                        82
   78   79   80   81   82   83   84   85   86   87   88