Page 127 - 6571
P. 127

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


                  Лістинг 23 – Крупномодульне рішення задачі про читачів та
            письменників

                  int nr = 0, nw = 0;
                  process Reader[i = 1 to M] {
                    while (true) {
                      ...
                      <await (nw == 0) nr = nr+1; >
                      зчитати базу даних;
                      <nr = nr-1; >
                    }
                  }
                  process Writer[i = 1 to N] {
                    while (true) {
                      ...
                      < await (nr == 0 and nw == 0) nw = nw+1; >
                      записати в базу даних;
                      <nw = nw-1; >

                    }
                  }

                  3. Рішення задачі про читачів та письменників через метод
            передачі  естафети.  Іноді  оператори  await  можна  реалізувати
            шляхом  прямого  використання  семафорів  або  інших  елементар-

            них операцій, але в загальному випадку це неможливо. Розгляне-
            мо дві умови захисту операторів await в лістингу 23. Дані умови

            перекриваються:  умова  захисту  в  протоколі  входу  письменника
            вимагає, щоб змінні nw та nr дорівнювали 0, а в протоколі входу
            читача – тільки щоб змінна nw дорівнювала 0. Жоден семафор не

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

                  У лістингу 23 присутні чотири неподільних оператора. Перші
            два (в процесах читача і письменника) мають вигляд:

                  <await (В) S; >




                                                        126
   122   123   124   125   126   127   128   129   130   131   132