Page 147 - 6571
P. 147

Лістинг 29 – Інтервальний таймер з пріоритетним очікуван-
            ням
                  monitor Timer {
                    int tod = 0;
                    cond check; # отримує сигнал, коли minrank(check) <=
            tod
                    procedure delay(int interval) {

                      int wake_time;
                      wake_time = tod + interval;
                      if (wake_time > tod) wait(check, wake_time);
                    }
                    procedure tick() {
                      tod = tod+1;
                      while (!empty(check) && minrank(check) <= tod)
                      signal(check);
                    }
                  }


                  16.3 Задача про сплячого перукаря



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

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

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

                  Формулювання задачі про сплячого перукаря має наступний
            вигляд: у тихому містечку існує перукарня з двома дверима і де-
            кількома  кріслами.  Відвідувачі  входять  через  одні  двері  і  вихо-

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

            кріслі. Коли відвідувач приходить і бачить сплячого перукаря, він
            будить його, сідає в крісло і спить, поки той зайнятий стрижкою.
            Якщо перукар зайнятий, коли приходить відвідувач, то той сідає


                                                        146
   142   143   144   145   146   147   148   149   150   151   152