Page 90 - 6571
P. 90

критична секція;
                            in1 = false; /* протокол виходу */
                            некритична секція;
                          }

                        }
                        process CS2 {
                        while (true) {
                          last = 2; in2 = true; /* протокол входу */
                          while (in1 and last == 2) skip;
                          критична секція;
                          in2 = false; /* протокол виходу */
                          некритична секція;
                          }
                        }


                        У  даній  програмі  вирішується  проблема  критичних  секцій

                  для двох процесів. Таку ж основну ідею можна використовувати
                  для  вирішення  задачі  при  будь-якому  числі  процесів.  Зокрема,
                  для кожного з n процесів протокол входу повинен складатися з

                  циклу, який проходить n-1 етапів. На кожному етапі використо-
                  вуються екземпляри алгоритму розриву вузла для двох процесів,
                  щоб визначити, які процеси проходять на наступний етап. Якщо

                  гарантується, що всі n-1 етапів може пройти не більше, ніж один
                  процес, то в критичній секції одночасно буде знаходитися не бі-
                  льше одного процесу.
                        Нехай in[1: n] та last[1: n] – цілочисельні масиви. Зна-

                  чення елемента in[i] вказує на номер етапу, який виконує про-
                  цес CS[i]. Значення last[j] вказує на номер етапу, який остан-

                  нім почав виконувати етап CS[j]. Підхід з використанням даних
                  змінних представлено в лістингу 9. Зовнішній цикл for викону-
                  ється n-1 раз. Внутрішній цикл for процесу CS[i] перевіряє всі

                  інші процеси. Процес CS[i] очікує, якщо деякий інший процес
                  знаходиться на етапі з рівним або більшим номером етапу, а про-
                  цес CS[i] був останнім процесом, що досягнув етапу j. Як тіль-

                  ки етапу j досягне ще один процес, або всі процеси «перед» про-
                  цесом  CS[i]  вийдуть  із  своїх  критичних  секцій,  процес  CS[i]
                  отримає  можливість  виконуватися  на  наступному  етапі.  Таким

                  чином, не більше n-1 процесів можуть пройти перший етап, n-2




                                                              89
   85   86   87   88   89   90   91   92   93   94   95