Что такое транзакционная память?
Я в замешательстве, потому что при чтении вики-страницы кажется, что у меня просто есть checkValidate и система коммитов для загрузки и хранения. Является ли целью решить проблемы синхронизации? Это программный продукт, построенный поверх современного оборудования, или аппаратная реализация через ISA? В чем разница между каждой (HW/SW) реализацией?
Благодарю.
3 ответа
Транзакционная память - это концепция использования транзакций, а не блокировок для синхронизации процессов, которые выполняются параллельно, и совместного использования памяти.
На очень упрощенном уровне для синхронизации с блокировками вы идентифицируете участки кода (называемые критическими разделами), которые не должны выполняться одновременно разными потоками, и получаете и снимаете блокировки вокруг критических разделов. Поскольку каждая блокировка может удерживаться только одним потоком за раз, это гарантирует, что, как только один поток войдет в критическую секцию, все операции секции будут завершены до того, как другой поток войдет в критическую секцию, защищенную такими же блокировками.
Вместо этого транзакционная память позволяет вам обозначать участки кода как транзакции. Затем система транзакционной памяти (которая может быть реализована аппаратно, программно или обоими способами) пытается дать вам гарантию, что любой запуск программы, в которой несколько потоков выполняют транзакции параллельно, будет эквивалентен другому запуску программы, в которой все транзакции выполняются одна за другой, никогда в одно и то же время.
Система транзакционной памяти делает это, позволяя транзакциям выполняться параллельно и отслеживая их доступ к переменным транзакций. Если система обнаружит конфликт между доступом двух транзакций к одной и той же переменной, это приведет к прерыванию одной из них и "откату" к началу транзакции, которую она выполняла; Затем он автоматически перезапустит транзакцию, и общее состояние системы будет таким, как если бы оно никогда не запускало предыдущий запуск.
Одной из целей транзакционной памяти является простота программирования и безопасность; правильно реализованная система TM, которая может обеспечить правильное использование транзакций, дает твердые гарантии того, что в программе нет ошибок параллелизма (взаимоблокировки, условия гонки и т. д.), и требует только, чтобы программист определял транзакции (и иногда переменные транзакции), если система не просто считает всю память неявно переменными транзакции), без необходимости точно определять, какие блокировки нужны, приобретать их в правильном порядке, чтобы предотвратить тупик и т. д., и т. д. "Трансакиты используются правильно", подразумевается что отсутствует обмен данными между потоками без прохождения через переменные транзакции, нет доступа к транзакционным данным, за исключением транзакций, и нет операций "без отката" внутри транзакций); основанные на библиотеках программные системы транзакционной памяти для императивных языков, таких как C, Java и т. д., как правило, не в состоянии реализовать все это, что может вновь представить возможность некоторых ошибок параллелизма.
Другая цель транзакционной памяти - увеличение параллелизма; если у вас есть целая куча параллельных операций, которые обращаются к некоторой структуре данных, все из которых могут писать в нее, но лишь немногие из них на самом деле это делают, то синхронизация на основе блокировки обычно требует, чтобы все операции выполнялись последовательно, чтобы избежать вероятности повреждения данных., Транзакционная память позволила бы почти всем операциям выполняться параллельно, теряя параллелизм, только когда какой-то процесс действительно записывает данные в структуру данных.
На практике (на момент, когда я исследовал свой проект с отличием несколько лет назад), аппаратная транзакционная память на самом деле не взлетела, и современные программные транзакционные системы памяти имеют значительные накладные расходы. Таким образом, программная транзакционная память больше нацелена на "разумную производительность, которая достаточно хорошо масштабируется с доступными процессорами и довольно легко кодируется", а не обеспечивает абсолютную максимальную производительность.
Между различными системами транзакционной памяти существует много различий; Я говорю на довольно абстрактном и упрощенном уровне здесь.
На уровне реализации транзакционная память является частью уровня кэша. Это позволяет программному обеспечению "пробовать" некоторые операции с памятью, а затем "фиксировать" их позже, только если никакие другие мультипроцессоры в системе не модифицировали какую-либо память, которая была прочитана или записана. В очень параллельных средах SMP, где большинство обращений не сталкиваются, это может быть быстрее, чем когда все потоки блокируют одни и те же (весьма конкурентные) примитивы синхронизации.
Однако это усложняет задачу прикладного программиста, поскольку программное обеспечение должно иметь возможность восстанавливать ("откатывать") транзакцию в случае неудачной фиксации.
Из gcc Wiki:
В общем случае реализации бывают двух видов: программная транзакционная память (STM) система использует замки или другие стандартные атомарные инструкции для своей работы. Система аппаратной транзакционной памяти (HTM) использует синхронизацию нескольких слов Операции процессора для реализации требований транзакции напрямую (например, см. процессор Rock). Потому что большинство систем HTM, вероятно, будут лучшими средства усилий (т. е. не все транзакции могут быть выполнены с использованием HTM), практические реализации TM, включающие HTM, также имеют компонент STM и, таким образом, называются гибридными системами транзакционной памяти.