什么是交易记忆?

时间:2012-06-29 03:23:25

标签: c memory transactional-memory

我很困惑,因为从阅读维基页面看起来好像只有一个checkValidate并提交加载和存储系统。解决同步问题的目的是什么?它是构建在当前硬件之上的软件编程事物,还是通过ISA实现的硬件实现?每个(HW / SW)实现之间有什么区别?

感谢。

3 个答案:

答案 0 :(得分:27)

事务性内存是使用事务而不是锁来同步并行执行并共享内存的进程的概念。

在非常简化的级别上,为了与锁同步,您可以识别不同线程不能同时执行的代码段(称为关键段),并获取和释放关键段周围的锁。由于每个锁一次只能由一个线程保持,这可以保证一旦一个线程进入临界区,所有该部分的操作将在另一个线程进入受同一个锁保护的临界区之前完成。

事务性内存允许您将代码段指定为事务。事务存储器系统(可以在硬件,软件或两者中实现)然后尝试保证多个线程并行执行事务的程序的任何运行将等同于程序的不同运行。交易全部一个接一个地执行,从不同时执行。

事务性内存系统通过允许事务并行执行并监视它们对事务变量的访问来实现此目的。如果系统检测到两个事务对同一变量的访问之间存在冲突,则会导致其中一个事件中止并“回滚”到它正在运行的事务的开头;然后它会自动重启事务,系统的整体状态就好像它从未启动过早期运行一样。


交易记忆的一个目标是易于编程和安全;一个正确实现的TM系统,能够强制执行正确的事务,给予硬保证程序中没有并行错误(死锁,竞争条件等),只需要程序员指定事务(有时是事务变量,如果系统不只是将所有内存都隐含地视为事务变量),而不需要确切地确定需要哪些锁,以正确的顺序获取它们以防止死锁等。 “正确使用交易”意味着线程之间没有共享数据而没有经过事务变量,除事务中没有访问事务数据,并且事务中没有“不可回滚”操作);用于C,Java等命令式语言的基于库的软件事务存储系统通常无法强制执行所有这些,这可能会重新引入一些并行错误的可能性。

事务内存的另一个目标是增加并行性;如果你有一大堆并行操作访问某些数据结构,所有可能写入它但其中很少有实际操作,那么基于锁的同步通常要求所有操作都是串行运行的避免数据损坏的可能性。事务性内存将允许几乎所有操作并行运行,只有当某些进程 写入数据结构时才会失去并行性。

在实践中(几年前我研究我的荣誉项目时),基于硬件的事务存储器还没有真正起飞,并且当前的软件事务存储器系统具有显着的开销。因此,软件事务内存更多的目标是“合理的性能,可以很好地扩展可用的处理器并且很容易编码”,而不是给你绝对的最大性能。

不同的事务存储系统之间存在很多差异;我在这里以非常抽象和简化的方式发言。

答案 1 :(得分:4)

来自 gcc Wiki:

In general, implementations come in two forms: a Software Transactional Memory 
(STM) system uses locks or other standard atomic instructions to do its job. 
A Hardware Transactional Memory (HTM) system uses multi-word synchronization 
operations of the CPU to implement the requirements of the transaction directly 
(e.g., see the Rock processor). Because most HTM systems are likely to be best
 effort facilities (i.e., not all transactions can be executed using HTM), 
practical TM implementations that incorporate HTM also have a STM component 
and are thus termed Hybrid Transactional Memory systems. 

答案 2 :(得分:3)

在实现级别,事务性内存是缓存层的一部分。它允许软件尝试"尝试"对内存进行一些操作,然后" commit"只有当系统中没有其他多处理器修改了任何读取或写入的内存时,它们才会出现。在非常并行的SMP环境中,大多数访问都不会发生冲突,这比让所有线程锁定相同(高度竞争)的同步原语更快。

这使得应用程序员的任务更加困难,因为如果提交失败,软件必须能够恢复("回滚")事务。