Page 66 - 4868
P. 66

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

                     <await (!in2) in1 = true;>

                     Оскільки  процеси  симетричні  відносно  один-одного,  то  у  вхідному
               протоколі  процесу  CS2  використовується  аналогічна  умовна  неподільна
               операція.
                     Рішення даної задачі показано в лістингу 1.3.Дана програма задовольняє
               умові  взаємного  виключення.Взаємного  блокування  не  виникає,  оскільки
               якби  кожен  процес  був  заблокований  в  своєму  протоколі  входу,  то  обидві
               змінні  in1  та  in2,  мали  б  значення  «істина»,  а  це  суперечить  тому,  що  в
               даній точці коду обидві вони мають значення «хиба».Зайвих затримок також
               немає,  оскільки  один  процес  блокується,  тільки  якщо  інший  перебуває  в
               критичній секції, тому небажаних затримок під час виконання програми не
               виникає.

                     Лістинг 1.3– Задача критичної секції (крупномодульне рішення)

                     bool in1 = false, in2 = false;
                     process CS1 {
                       while (true) {
                         <await (!in2) in1 = true;> /* вхід */
                           критична секція;
                         in1 = false;/* вихід */
                         некритична секція;
                       }
                     }
                     process CS2 {
                       while (true) {
                         <await (!in1) in2 = true;> /* вхід */
                           критична секція;
                         in2 = false;/* вихід */
                         некритична секція;
                       }
                     }


                     10.2. Активні блокування у задачі критичної секції

                     У     крупномодульному           рішенні,     наведеному        в    лістингу      1.3,
               використовуються  дві  змінні.При  узагальненні  даного  рішення  для  n
               процесів  знадобиться  n  змінних.Однак  існує  тільки  два  цікавих  для  нас
               стани: 1)деякий процес знаходиться у своїй критичній секції; 2) усі процеси
               знаходяться поза межами критичної секції.Незалежно від числа процесів, для
               того, щоб розрізнити ці два стани, достатньо однієї змінної.
                     Нехай  lock  –  логічна  змінна,  яка  показує,  чи  знаходиться  процес  в
               критичній секції, тобтоlockмає значення «істина», якщо одна з змінних in1
               або  in2має  значення  «істина»,  в  іншому  випадку  lock  має  значення
               «хиба».Таким чином, отримаємо наступну умову:

                     lock == (in1 in2)
   61   62   63   64   65   66   67   68   69   70   71