JDS*_*JDS 11 c memory transactional-memory
我很困惑,因为从阅读维基页面看起来好像只有一个checkValidate并提交加载和存储系统.解决同步问题的目的是什么?它是构建在当前硬件之上的软件编程事物,还是通过ISA实现的硬件实现?每个(HW/SW)实现之间有什么区别?
谢谢.
Ben*_*Ben 28
事务性内存是使用事务而不是锁来同步并行执行并共享内存的进程的概念.
在非常简化的级别上,为了与锁同步,您可以识别不同线程不能同时执行的代码段(称为关键段),并获取和释放关键段周围的锁.由于每个锁一次只能由一个线程保持,这可以保证一旦一个线程进入临界区,所有该部分的操作将在另一个线程进入受同一个锁保护的临界区之前完成.
事务性内存允许您将代码段指定为事务.事务存储器系统(可以在硬件,软件或两者中实现)然后尝试保证多个线程并行执行事务的程序的任何运行将等同于程序的不同运行.交易全部一个接一个地执行,从不同时执行.
事务存储器系统通过允许事务并行执行并监视它们对事务变量的访问来实现这一点.如果系统检测之间的两笔交易的访问同一个变量发生冲突,就会造成其中的一个中止和'回退’到它运行的事务的开始; 然后它会自动重启事务,系统的整体状态就好像它从未启动过早期运行一样.
事务存储器的一个目标是易于编程和安全; 一个能够强制执行正确使用事务的正确实现的TM系统可以确保程序中没有并行错误(死锁,竞争条件等),并且只需要程序员指定事务(有时候是事务变量) ,如果系统不只是将所有内存都隐含为事务变量),而不需要确切地确定需要哪些锁,以正确的顺序获取它们以防止死锁等,等等."正确使用转换"暗示没有通过事务变量就没有线程之间的共享数据,除了事务之外没有对事务数据的访问,并且在事务内没有"不可回滚"的操作); 用于C,Java等命令式语言的基于库的软件事务存储器系统通常无法强制执行所有这些,这可能会重新引入某些并行错误的可能性.
事务性内存的另一个目标是增加并行性; 如果你有一大堆并行操作访问某些数据结构,所有这些操作都可以写入,但很少有实际操作,那么基于锁的同步通常要求所有操作都串行运行以避免数据损坏的可能性.事务内存将使几乎所有的操作的并行运行,既不失并行当一些过程实际上也写入数据结构.
在实践中(就在几年前我研究我的荣誉项目时),基于硬件的事务存储器还没有真正起飞,并且当前的软件事务存储器系统具有显着的开销.因此,软件事务内存更多的目标是"合理的性能,与可用的处理器适度扩展,并且非常容易编码",而不是给你绝对的最大性能.
不同的事务存储系统之间存在很多差异; 我在这里讲的是一个非常抽象和简化的层面.
在实现层面,事务内存是缓存层的一部分。它允许软件“尝试”对内存进行某些操作,然后仅当系统中的其他多处理器没有修改任何已读取或写入的内存时才“提交”这些操作。在大多数访问不会发生冲突的非常并行的 SMP 环境中,这可能比让所有线程锁定相同(高度竞争的)同步原语更快。
然而,它使应用程序程序员的任务变得更加困难,因为如果提交失败,软件必须能够恢复(“回滚”)事务。