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

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

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

Системи транзакційної пам'яті реалізують високорівневу абстракцію, на противагу низькорівневим примітивам синхронізації потоків виконання. Така абстракція дозволяє координувати рівночасні записи і зчитування спільних даних у паралельних обчислювальних системах.[1]

Завдання

[ред. | ред. код]
Атомарність між двома паралельними транзакціями з конфліктом

Рівночасне програмування потребує синхронізації у випадку, коли паралельні потоки виконання намагаються отримати доступ до спільного ресурсу. Така синхронізація досягається за допомогою спеціальних примітивів (як правило, низькорівневих), які є «песимістичними»[уточнити], і не дозволяють потокам за межами критичної секції робити будь-які зміни. До того ж, процес заволодіння (acquire) і звільнення (release) примітивів може спричиняти додатковий overhead[уточнити], особливо у випадках, коли конфліктів між потоками відносно небагато. Транзакційна пам'ять забезпечує optimistic concurrency control[en], дозволяючи потокам паралельно виконуватися з мінімальною інтерференцією.[2]

Метою системи транзакційної пам'яті є прозора підтримка регіонів коду, відмічених як «транзакції», шляхом обов'язкового застосування атомарності, узгодженості та ізоляції.

Транзакція — це набір дій, що виконуються і записують зміни до того, як станеться конфлікт. У випадку виявлення конфлікту транзакція повертається до свого початкового стану (тобто до того стану, коли не було зроблено ніяких змін), і запускається повторно, аж допоки всі конфлікти не буде усунено. Перед тим, як завершено комміт[en], порядок операцій усередині транзакції є довільним — це контрастує з методом синхронізації, заснованому на примітивах lock/unlock, де операції відбуваються послідовно. Таким чином, якщо модифікація спільних ресурсів відбувається нечасто, транзакції уможливлюють додатковий паралелізм. У транзакційному підході програміст не повинен явно вказувати критичні секції — як наслідок, програми з застосуванням транзакційної пам'яті не можуть призвести до взаємного блокування.[2]

Джерела

[ред. | ред. код]
  1. Harris, Tim; Larus, James; Rajwar, Ravi (2 червня 2010). Transactional Memory, 2nd edition. Synthesis Lectures on Computer Architecture (англ.). 5 (1): 1—263. doi:10.2200/S00272ED1V01Y201006CAC011. ISSN 1935-3235.
  2. а б Transactional Memory: History and Development. Kukuruku Hub (англ.). Процитовано 16 листопада 2016.