Page 68 - 4868
P. 68

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

                     }

                     Використовуючи  інструкцію  TS,  можна  реалізувати  крупномодульний
               варіант  програми  з  лістингу1.4  за  алгоритмом,  наведеним  в  лістингу
               1.5.Умовні неподільні дії в програмі з лістингу1.4 замінюються відповідними
               циклами.Цикли  не  закінчуються,  доки  змінна  lock  не  набуде  значення
               «хиба»,  тобтоінструкція TS  повертає значення  «хиба».Оскільки всі  процеси
               виконують  одні  і  ті  ж  протоколи,  наведене  рішення  працює  незалежно  від
               числа процесів.Використання блокуючої змінної, як це показано в лістингу
               1.5, зазвичай називається циклічним блокуванням (spin lock), оскільки процес
               постійно повторює цикл, очікуючи при цьому зняття блокування.

                     Лістинг  1.5–  Критичні  секції  на  основі  інструкції  «перевірити-
               встановити»

                     bool lock = false;/* спільна змінна */
                     process CS[i = 1 to n] {
                       while (true) {
                         while (TS(lock)) skip;/* протокол входу */
                         критична секція;
                         lock = false;/* протокол виходу */
                         некритична секція;
                       }
                     }

                     Рішення задачі критичної секції, аналогічне наведеному в лістингу 1.5,
               може  бути  реалізовано  на  будь-якій  машині,  якщо  у  неї  є  інструкція,  що
               перевіряє  і  змінює  спільну  змінну  в  одній  неподільній  дії.Наприклад,  у
               деяких машинах є інструкція інкременту (нарощення), яка збільшує значення
               цілочисельної змінної і визначає умову, що використовується для досягнення
               позитивного  значення  цієї  змінної.Використовуючи  дану  інструкцію,  є
               можливим побудувати протокол входу, заснований на переході від нуля до
               одиниці.
                     Хоча рішення в лістингу 1.5 вірне, експерименти на мультипроцесорних
               машинах  показують  його  низьку  продуктивність,  якщо  декілька  процесів
               «змагаються»  за  доступ  до  критичної  секції.Причина  в  тому,  що  кожен
               призупинений  процес безперервно звертається до спільної змінної  lock.Ця
               «гаряча точка» породжує конфлікт під час звернення до пам’яті, який знижує
               продуктивність модулів пам’яті і шин, що зв’язують процесор та пам’ять.
                     До  того  ж  інструкція  TS  при  кожному  виклику  записує  значення  в
               змінну lock, навіть якщо воно не змінилось.Оскільки в мультипроцесорних
               машинах із роздільною пам’яттю, для зменшення числа звернень до основної
               пам’яті  використовуються  кеші,  то  інструкція  TS  виконується  набагато
               довше,  ніж  просте  зчитування  значення  спільної  змінної  (коли  змінна
               записується  одним  із  процесорів,  її  копії  потрібно  оновити  або  зробити

               недійсними в кешах інших процесорів).
                     Витрати на оновлення вмісту кеш-пам’яті і конфлікти при зверненні до
   63   64   65   66   67   68   69   70   71   72   73