Page 122 - 6571
P. 122

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

                  процесом.  Таким  чином,  щоб  уникнути  взаємного  блокування,
                  досить       забезпечити          неможливість           виникнення          кругового
                  очікування. Для цього можна змусити один з процесів, скажімо,

                  Philosopher[4],  спочатку  взяти  праву  виделку.  Це  рішення
                  представлено у лістингу 21. Можливий також варіант рішення, в
                  якому  філософи  з  парним  номером  беруть  виделки  в  одному
                  порядку, а з непарним – в іншому.


                        Лістинг 21 – Рішення задачі про філософів, що обідають з ви-
                  користанням семафорів

                        sem fork[5] = (1, 1, 1, 1, 1);
                        process Philosopher[i = 0 to 3] {
                          while (true) {
                            P(fork[i]);
                            P(fork[i+1]);
                            # взяти ліву виделку, потім праву і поїсти;
                            V(fork[i]);
                            V(fork[i+1]);
                            поміркувати;
                          }
                        }
                        process Philosopher[4] {

                          while (true) {
                            P(fork[0]);
                            P(fork[4]);
                            # взяти праву виделку, потім ліву і поїсти;
                            V(fork[0]);
                            V(fork[4]);
                            поміркувати;
                          }
                        }


                        14.2 Задача про читачів та письменників



                        Задача  про  читачів  та  письменників  –  це  ще  одна  класична
                  задача синхронізації. Як і задачу про філософів, що обідають, її



                                                             121
   117   118   119   120   121   122   123   124   125   126   127