在当前的计算领域中,交易性记忆(Transactional Memory)正在被视为一种具有潜力的技术,旨在简化并行程式设计。交易性记忆试图通过允许一组载入和储存指令以原子方式执行,来消除传统锁的复杂性。这一概念类似于数据库中的交易,用以控制并行计算中共享记忆体的访问。
交易性记忆系统提供高层抽象,作为低层执行绪同步的替代方案,从而在并行系统中协调共享数据的并行读写。
在并行程式设计中,当多条执行绪试图访问共享资源时,必须进行同步。传统的锁同步机制往往采用悲观的方式,这限制了在临界区外的执行绪运行。因此,在低冲突的工作负载中,应用和释放锁所产生的额外开销会影响系统的表现。
交易性记忆提供了乐观的并行控制,允许执行绪在最小干扰的情况下并行运行。
交易性记忆的目的在于通过强制原子性、一致性和隔离性来透明支持标记为交易的代码区域。当检测到冲突时,一个交易将会恢复到其初始状态,并重新执行直至消除所有冲突。在成功提交之前,交易内的任何操作结果都是投机性的,这与基于锁的同步方式形成鲜明对比。
以这种方式,程序员无需明确识别锁或购买锁的顺序,利用交易性记忆所编写的程式不会导致死锁的问题。这不仅提高了程式的执行效率,还保障了数据的安全性。
程序的正确实现可以确保数据不会在不通过交易的情况下被执行绪共享,并产生可序列化的结果。
不过,使用大量交易的程序中仍可能存在与并行操作相关的错误,特别是在那些语言库无法正确实施的情况下。由于交易中的断点无法设置,这使得通过交易引入的错误往往难以调试。
交易性记忆的局限之一在于它需要共享记忆体的抽象。尽管交易性记忆程序无法产生死锁,但仍可能遭受活锁或资源饥饿的问题。例如,较长的交易可能因为多个较小的交易重复恢复而浪费时间和能源。
交易性记忆中的原子性抽象需要硬体机制来检测冲突并撤销对共享数据所做的任何更改。硬体交易性记忆系统可能包括对处理器、快取和总线协议的修改,以支持交易。交易中的投机性值必须缓冲并在提交时对其他执行绪保持不可见。
至今仍在讨论的问题是,最佳的缓冲区大小如何定义,因为目前商业程式中交易的使用相对有限。
在硬件实现中,存储队列或快取等不同结构用于缓存投机性值,这些结构的距离处理器越远,可以持有的投机性值越多。虽然硬体交易性记忆提供了比软体解决方案更优越的性能,但目前的应用实际仍然有限。
软体交易性记忆则提供了在软体运行时库或编程语言中的交易性记忆语义,对硬体依赖最小。尽管如此,这种软体实现通常伴随着与硬体解决方案相比的性能损失。
交易性记忆的早期实现之一是Transmeta的Crusoe和Efficeon处理器中使用的门控储存缓冲器。这项技术主要用于促进二进制翻译的投机性优化,而并非直接暴露给程式设计师。随着时代的推移,各种硬体和软体的交易性记忆解决方案不断发展,各大科技公司如IBM、AMD和Intel等都投入资源,以研究其潜力。
随着交易性记忆的技术进步,我们是否能够看到更高效、更易用的并行编程模型出现?
这项技术是否将引领我们进入一个全新的程式设计领域,并改变我们如何看待并行运算的问题呢?随着科技的不断进步,交易性记忆未来将会为我们的程式设计带来怎样的变化呢?