C语言 什么是事务内存



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

谢谢。

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

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

相反,事务内存允许您将代码段指定为事务。然后,事务内存系统(可以在硬件、软件或两者中实现)试图为您提供保证,即多个线程并行执行事务的任何程序运行将等效于程序的不同运行,其中事务都一个接一个地执行,而不是同时执行。

事务

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


事务

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

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

在实践中(截至几年前我研究我的荣誉项目时),基于硬件的事务内存还没有真正起飞,当前的软件事务内存系统有很大的开销。因此,软件事务内存更旨在"合理的性能,可以适度地随可用处理器扩展并且非常容易编码",而不是为您提供绝对的最大性能。

不过,不同的事务内存系统之间存在很多差异;我在这里讲的是相当抽象和简化的层次。

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

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

来自 gcc 维基:

通常,实现有两种形式: 软件事务内存(STM)系统使用锁或其他标准原子指令来完成其工作。硬件事务内存 (HTM) 系统使用多字同步CPU的操作直接实现事务的要求(例如,参见 Rock 处理器)。因为大多数 HTM 系统可能是最好的 努力设施(即,并非所有交易都可以使用 HTM 执行),包含 HTM 的实际 TM 实现也具有 STM 组件因此被称为混合事务内存系统。

最新更新