Транзакційна пам'ять

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Транзакційна пам'ять — технологія синхронізації конкурентних потоків. Вона спрощує паралельне програмування, виділяючи групи інструкцій в атомарні транзакції. Конкурентні потоки працюють паралельно , поки не починають модифікувати одну і ту ж ділянку пам'яті. Підхід до управління конкурентністю з використанням транзакційної пам'яті називають оптимістичним: вважається, що потоки працюють незалежно один від одного і в рідкісних випадках змінюють одні й ті ж дані. У такому випадку більшість транзакцій закінчується успішно. На противагу цьому, підходи з використанням блокувань називають песимістичним: вважається, що потоки будуть конфліктувати завжди і завжди забороняється їм перебувати в критичній секції одночасно. Якщо відбувається конфлікт даних, транзакція скасовується. Скасування транзакції призводить до скасування дій, які здійснював потік за час транзакції. Після цього транзакція зазвичай перезапускається, або викликається функція, заздалегідь зазначена як «запасний вихід».[1]

Народження технології[ред.ред. код]

Транзакції в базах даних існують вже кілька десятиліть. Вперше ідея перенесення транзакцій зі світу баз даних в світ паралельного програмування виникла в 1980-х. Розвивали і популяризували цю технологію такі люди як Maurice Herlihy , Ravi Rajwar , Nir Shavit. Перші дослідження пропонували апаратні реалізації транзакционной пам'яті, яким не судилося народитися ще 30 років. У 1990-х з'явилися перші програмні реалізації технології, апаратні реалізації підтяглися до 2000-м.[2]

Переваги та недоліки транзакційної пам'яті[ред.ред. код]

Переваги транзакційної пам'яті:[ред.ред. код]

• відносна простота використання (укладення цілих методів у блок транзакції);

• повна відсутність блокувань і взаємних блокувань;

• підвищення рівня паралелізму, а отже, і продуктивності.

Недоліки транзакційної пам'яті:[ред.ред. код]

• при неправильному використанні можливе падіння продуктивності і некоректна робота;

• обмеженість застосування — в транзакції не можна виконувати операції, дію від яких неможливо скасувати;

• складність налагодження — поставити breakpoint в транзакції неможливо.

Програмні реалізації[ред.ред. код]

Серед безлічі реалізацій програмної транзакційної пам'яті можна виділити чотири.

• Clojure[ред.ред. код]

Clojure — єдина мова, ядро якого підтримує транзакційну пам'ять. Підхід до STM в Clojure називається управлінням конкурентним доступом за допомогою багатоверсійності, зберігаються множинні логічні версії даних, що використовуються в транзакціях. Протягом транзакції потік спостерігає знімок даних на момент її початку. Існують варіанти використання конкурентності, при яких середовищі дозволяється «розслабитися» для досягнення додаткової продуктивності.

• Haskell[ред.ред. код]

Транзакційна пам'ять в Haskell міститься в бібліотеці STM, яка входить до Haskell Platform. Некоректне використання транзакційних типів визначається на етапі компіляції програми. Haskell володіє потужною системою типів. Мова розділяє функції з побічними ефектами і чисті функції. Для виконання будь-якої дії атомарне в Haskell, дія передує словом atomically.

• Scala[ред.ред. код]

Реалізація STM для Scala (ScalaSTM) розроблялася під враженням від реалізацій в Haskell і Clojure. Крім Scala, ScalaSTM викликається з Java і Clojure. Реалізація використовується в популярному фреймворці для написання паралельних програм Akka. Для реалізації розділяється структури покажчики на наступний і попередній вузол роблять потокобезпечним.[3]

• C / C + +[ред.ред. код]

Починаючи з версії 4.7, GCC підтримує транзакціонної пам'ять. Реалізація являє собою бібліотеку часу виконання libitm, для компіляції вказується флаг-fgnu-tm (-mrtm,-mhle). Бібліотека розроблялася з оглядкою на чернетку транзакційних конструкцій для C + + (пропонується включення в стандарт мови). Більшість реалізацій апаратної транзакційної пам'яті використовують принцип найбільшого зусилля. Тож практичні реалізації використовують об'єднання технологій апаратурною і програмної транзакційної пам'яті. Такі системи називають системами «гібридної транзакційної пам'яті». До них належить, зокрема, реалізація GCC.

Примітки[ред.ред. код]