事务性内存起源于数据库理论,它为进程同步提供了另一种策略。
内存事务是原子的,是一系列内存读写操作。如果事务中的所有操作都已完成,则将提交内存事务。否则,必须中止操作并回滚。可以通过添加到编程语言中的功能来获得事务存储的便利性。考虑一个例子。假设我们有一个update()
修改共享数据的函数。传统上,此功能将使用互斥锁(或信号量)编写,如下所示:
void update (){ acquire(); /* modify shared data */ release(); }
但是,使用诸如互斥锁和信号灯之类的同步机制会涉及许多潜在的问题,包括死锁。另外,随着线程数量的增加,传统锁的伸缩性不太好,因为线程之间对锁所有权的争用程度变得很高。作为传统锁定方法的替代方法,可以将利用事务性内存的新功能添加到编程语言中。在我们的示例中,假设我们添加了atomic {S}构造,该构造确保S中的操作作为事务执行。这使我们可以update()
按以下方式重写函数−。
void update (){ atomic { /* modify shared data */ } }
使用这种机制而不是使用锁的优点在于,事务性内存系统(而不是开发人员)负责保证原子性。此外,由于不涉及任何锁,因此不可能发生死锁。此外,事务性存储系统可以标识原子块中的哪些语句可以并发执行,例如对共享变量的并发读取访问。当然,程序员可以识别这些情况并使用读写器锁,但是随着应用程序中线程数量的增加,任务变得越来越困难。事务性存储器可以用软件或硬件来实现。软件事务存储器(STM),该事务专用于软件中实现事务存储器-不需要特殊的硬件。它通过在事务块内插入检测代码来工作。该代码由编译器插入,并通过检查语句可以在何处并行运行以及在何处需要特定的低级锁定来管理每个事务。硬件事务性内存(HTM)使用硬件缓存层次结构和缓存一致性协议来管理和解决涉及驻留在单独处理器缓存中的共享数据的冲突。它不需要特殊的代码工具,因此比STM具有更少的开销。但是,HTM确实要求修改现有的缓存层次结构和缓存一致性协议以支持事务性内存。事务性内存已经存在了数年,没有得到广泛实施。然而,