Page 99 - 4868
P. 99

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

               база даних знаходиться  в несуперечливому стані. Кожна  окрема транзакція
               переводить  базу  даних  з  одного  несуперечливого  стану  в  інший.  Для
               запобігання взаємного впливу  транзакцій процес-письменник повинен мати
               винятковий доступ до бази даних. Якщо до бази даних не звертається жоден з
               процесів-письменників,  то  виконувати  транзакції  одночасно  може  будь-яка
               кількість читачів.
                     Задача про читачів та письменників – це ще один приклад вибіркового
               взаємного виключення. У задачі про філософів, що обідають пари процесів
               конкурували  за  доступ  до  вилок.  Тут  за  доступ  до  бази  даних  змагаються
               класи  процесів.  Процеси-читачі  конкурують  з  письменниками,  а  окремі
               процеси-письменники  змагаються  між  собою.  Задача  про  читачів  та
               письменників  –  це  також  приклад  задачі  спільної  умовної  синхронізації,
               оскільки процеси-читачі повинні очікувати, поки до бази даних має доступ
               хоча б один процес-письменник. Процеси-письменники у свою чергу повинні

               очікувати,  поки  до  бази  даних  мають  доступ  процеси-читачі  або  інший
               процес-письменник.
                     1.Рішення  задачі  про  читачів  та  письменників  як  задачівзаємного
               виключення.  Процесам-письменникам  потрібен  взаємовиключний  доступ  до
               бази  даних.  Доступ  процесів-читачів  як  групи  також  повинен  бути
               взаємовиключним  по  відношенню  до  будь-якого  процесу-письменника.
               Подамо дану задачу як окремий випадок задачі критичної секції. Очевидним
               додатковим  обмеженням  буде  забезпечення  вибіркового  доступу  до  бази
               даних кожного читача і письменника.
                     Нехай  змінна  rw  –  це  семафор  взаємного  виключення  з  початковим
               значенням 1, а змінна nr служить для підрахунку числа активних читачів. У
               протоколі  входу  для  процесів-читачів  значення  змінної  nr  спочатку
               збільшується  на  1,  а  потім  виконується  перевірка,  чи  вона  рівна  1.  Щоб
               уникнути взаємного впливу процесів-читачів, додавання і перевірка повинні
               виконуватися  як  критична  секція.  Аналогічно,  неподільним  чином  повинні
               також  виконуватися  операції  віднімання  і  перевірка  значення  змінної  nr  в
               протоколі виходу.
                     Для  повного  рішення  даної  задачі,  необхідно  за  допомогою  семафорів
               реалізувати неподільні дії для виконання описаних вище операцій. Кожна дія
               представляє собою критичну секцією, реалізація яких подана в лістингу 1.16.
               Нехай  mutexR  –  семафор,  що  забезпечує  взаємне  виключення  процесів-
               читачів у рішенні задачі про читачів та письменників поданого в лістинг 1.22.
               Семафор  mutexR  ініціалізується  початковим  значенням  1,  початок  кожної
               неподільної  дії  реалізується  операцією  P(mutexR),  а  кінець  –  операцією
               V(mutexR).

                     Лістинг  1.22  –  Рішення  задачі  про  читачів  та  письменників  з
               використанням семафорів

                     int nr = 0;     # число активних читачів
                     sem rw = 1;     # блокування доступу до бази даних
   94   95   96   97   98   99   100   101   102   103   104