事务内存:它是什么以及这种并发控制机制如何工作

最后更新: 1月19,2024
事务内存

我们必须考虑当今计算机中使用的多核 CPU 系统所面临的性能挑战,因为 冯·诺依曼模型,它使用单个共享内存池。随着 CPU 中执行单元、核心和线程数量的增加,访问数据/指令以及管理内存地址和程序变量时会出现冲突。为了解决这些问题,可以使用所谓的 事务内存该技术用于解决多核系统中数据和指令访问冲突,我们将在这里进行解释。

内存问题

RAM

何时 编写了一个程序,实际上引入的是一组指令,这些指令表面上是按顺序执行的。也就是说,它们必须一个接一个地执行。然而,由于指令并行性、分支预测和 奥奥 (乱序执行)等,这些指令的执行顺序可以根据数据依赖性、数据可用性等进行改变。因此,在硬件级别需要一个重新排序缓冲区,这增加了内存访问的复杂性。

当有很多请求时 访问内存 (读或写)访问同一内存时会产生拥塞,如果考虑到内存本身的运行速度已经慢于 CPU,这种瓶颈会进一步加剧。这会导致延迟,严重影响性能,增加某些指令中内存和 CPU 之间的延迟,并影响 RAM-CPU 带宽。为了解决这个问题,有一些机制试图最大限度地减少内存访问冲突,允许进程以有序的方式访问内存。这可以避免内存层次结构中的数据修改问题,减少冲突,从而降低访问延迟。

实现这一目标的最简单方法是通过 使用锁,这些是我们指定的程序源代码片段,不应由不同的线程同时执行,以便 CPU 可以以不同的方式执行指令。换句话说,一次只有一个核心可以处理这部分代码,而其他核心将被阻塞,直到遇到释放锁的指令。这种情况发生在与除一个核心之外的所有核心隔离的代码段完成之后。

什么是事务内存?它是如何工作的?

事务内存

为了解决上一节中描述的问题,可以通过所谓的事务内存来实现,也可以表现为 STM(软件事务内存).

  HDL:用于设计电子电路的硬件描述语言

值得注意的是,事务内存本身不是一种内存或存储类型,因此它不是一个不同的硬件组件,但正如其名称所暗示的那样,它是 软件解决方案它的起源在于数据库领域中使用的事务概念,并实现为在 CPU 的加载-存储单元中执行的一组指令。

我的意思是, 表现 事务内存或STM基本上遵循以下步骤:

  1. 创建多个核心希望访问的内存部分的副本,为每个实例生成一个私有副本。
  2. 每个实例独立地修改自己的私有副本,而不会影响其他私有副本。
  3. 如果某条数据在一个私有副本中被修改,而在其他私有副本中没有被修改,则该修改将传播到其他私有副本。
  4. 如果两个实例同时修改同一数据,可能会造成数据不一致,则两个实例的私有副本都会被删除,并复制其他实例的私有副本。这一点至关重要,因为此时序列化特定代码片段的需求显而易见。这意味着其他实例停止修改其私有副本,并允许单个实例进行修改。一旦该实例完成修改,结果就会复制到其他实例的私有副本中。当标记为事务性的代码部分完全执行完毕,并且所有私有副本都包含相同的信息时,结果就会复制到相应的缓存行和内存地址。

优缺点

软件事务内存(STM)有一些 巨大的优势 值得实施的原因如下:

  • 性能显著提升。
  • 它简化了程序员对多线程程序的概念理解,也就是说,它使编程更加容易。每个事务都可以单独视为单线程执行。阻塞、活锁和其他问题由外部事务管理器预防或管理,程序员几乎无需担心。

基于锁的编程存在一些严重的问题,相比事务性内存,例如:

  • 锁定需要考虑远处且看似不相关的代码段中的重叠操作和部分操作,这是一项非常困难且容易出错的任务。
  • 它要求程序员采用锁定策略来防止死锁、活锁和其他程序运行故障。这些策略通常应用不规范,而且容易出错。一旦出现这些问题,重现和调试起来就极其困难。
  • 它可能导致优先级反转,即高优先级线程被迫等待对其所需资源具有独占访问权的低优先级线程的现象。
  VPU:这个与 AI 相关的处理单元是什么?它与 GPU 有何区别?

然而,事务内存也并非完美无缺。它并非全是优点,它也有 它的缺点因为需要中止失败的事务也对事务的行为施加了限制:它们无法执行任何不可撤消的操作,包括大多数输入/输出 (I/O) 操作。实践中,这些限制通常通过创建缓冲区来存储不可逆操作,并将其推迟到稍后在任何事务之外执行来克服。在某些情况下,这在运行时完成,在其他情况下,则由硬件实现,等等。

事务内存实现

事务内存

正如我之前提到的,这本身并非硬件解决方案,而是一个软件解决方案。具体来说,CPU 设计人员会在其 ISA 中添加额外的指令,程序员可以在编译软件时使用这些指令。例如, 两种技术案例 对于事务内存或实现是:

Intel TSX(事务同步扩展)

技术 英特尔TSX 指一组附加指令,旨在扩展 x86-64 ISA 并在 Intel CPU 上提供事务性内存支持。这些指令及其相关机制允许将特定代码段标识为事务性,从而使 Intel CPU 能够执行上述过程。然而,Intel 在这方面的实现略为复杂。如上所述,如果两段数据之间发生冲突,其中一个正在运行的实例将中止整个过程。

必须指出的是,目前 CPU控制单元 正如我提到的,它们基于微码,这意味着它们解码指令的方式以及这些指令的列表可以通过固件更新。英特尔有时会通过 Intel管理引擎 (ME),它允许英特尔在用户不知情的情况下以透明的方式远程管理 PC,这是另一个安全问题的来源,如果你一直关注这些案例……这些更新并不常见,但它们可以包括对某些指令执行的优化,甚至删除对其他指令的支持。

TSX/TSX-NI 由英特尔于 2012 年实施,是第一个 使用 Haswell 的微架构然而,他们的喜悦并没有持续多久,因为两年后,英特尔公布了一个与此实现相关的错误,影响了各种 Haswell 版本和首批 Broadwell 版本,因此他们不得不更新微代码来修复它。而且这还不是唯一的问题;后来,在 2016 年,还发现了另一个可以通过旁道定时攻击利用的漏洞,从而破坏了许多操作系统内核中的 KASLR。2021 年,由于严重的安全问题,英特尔终于发布了另一个微代码更新,禁用了 Skylake 到 Coffee Lake 一代中的 TSX/TSX-NI。然而,它们今天又重新浮出水面了……

  Intel 4 和 Intel 节点的未来

这种实现不需要对硬件进行太多修改,只需让解码单元知道如何解释它们即可。然而,它还涉及一种名为 事务缓存,其中对数据执行各种操作。事务性内存旨在减少内存访问冲突。虽然缓存通常可以处理比 RAM 更多的请求,但它们也存在局限性,尤其是在距离核心最远的层级。此外,它还通过使用内部内存和私有寄存器来补充,这些寄存器支持不同核心之间进行的私有复制。

Intel TSX 指令并不特别复杂。它们包括用于指示事务内存段开始的 XBEGIN 指令、用于标记其结束的 XEND 指令,以及用于在异常情况下退出事务的 XABORT 指令。

AMD ASF(高级同步工具)

高级同步设施(ASF) 它是 x86-64 指令集架构的一个扩展提案,旨在增加硬件级事务内存支持。它由 AMD 推出,最新规范可追溯到 2009 年 XNUMX 月。然而,该提案一直处于搁置状态,尚未在处理器中实现,或许是因为英特尔自身存在问题。

然而,ASF 已被记录在案,我们知道它提供了 开始、结束和中止事务执行的能力,以及在事务代码区域中标记用于受保护内存访问的 CPU 缓存行。

为了实现这一点,他们被创造出来 四条新指令:SPECULATE、COMMIT、ABORT 和 RELEASE。它还使以 LOCK 为前缀的 MOVx、PREFETCH 和 PREFETCHW 指令(这些指令通常无效)在事务代码区域内有效。最多支持 256 层嵌套的事务代码区域。

说明如下 相当简单易懂就像英特尔 TSX 的一样。例如,我们有 SPECULATE 和 COMMIT,它们分别标记事务代码区域的开始和结束。然后,事务中止(无论是由硬件生成还是明确请求的)都将使用 ABORT 执行,撤消对受保护缓存行的修改,并从 SPECULATE 指令之后的指令重新开始执行……