事务的原子性

发布于:2025-07-07 ⋅ 阅读:(14) ⋅ 点赞:(0)

🧩 事务是什么?

“We refer to a write operation as a write transaction and a read operation as a read transaction, implying that each operation has to be atomic with respect to one another.”

这句话的含义是:

  • “读”和“写”不仅仅是一个CPU的操作指令,还包括:

    • 在cache中查找
    • 与总线交互(广播、监听)
    • 与其他缓存交互(snoop)
    • 与主存交互(读写)
  • 整个“操作”是一个 复合动作的集合,这就是所谓的一个 transaction(事务)

并且:

  • 要求这个事务是“原子的”:不能被打断、不能被看到一半完成一半没完成。
  • 要求多个事务之间“串行化”:多个处理器发出的事务必须能定义出一个总顺序,大家都能一致地观察到。

🔧 RMW 指令(Read-Modify-Write)产生什么事务?

RMW(Read-Modify-Write)操作,比如:

  • LOCK XCHG(x86)
  • LDREX/STREX(ARM)
  • atomic_add, compare-and-swap

这些操作看起来像一个复合指令:它从内存中读取数据,修改它,然后再写回去。但 对系统一致性而言,它必须是一个原子事务。可以称为 RMW事务

RMW 指令产生的不是两个独立的读事务 + 写事务,而是一个“复合的原子事务”。
这个事务内部可能包含如下步骤:

步骤 描述
1. PrRd 处理器先读取该地址的 cache line
2. BusRd/BusRdX 若 miss,则发起总线读取(或读-独占)
3. 获得独占访问权限(exclusive) 通过总线协议,将其他 cache line 置为 Invalid
4. PrWr 执行写入(如是 write-through,还会触发 BusWr)

指令 和事务的关系

  • 只要是会仿存动作的指令(无论普通还是原子操作),都只会产生一个事务,且这个事务是原子的。
  • 这个事务中,访存动作的次数是指令决定的.

事务和总线交互的关系

  • 一条访存指令产生的事务 = 若干个总线交互(和cache状态转移)的集合
  • 但从 一致性语义角度看,这个集合是 一个逻辑原子单元
  • CpuWr / BusRd 一般被理解为 请求类型(Request Type),或者 事务子动作(Transaction Subaction)

事务的原子性

一致性模型实现中的核心细节:逻辑原子性 vs 物理原子性。

只要是事务,在逻辑上一定是原子性的。
在物理上是否可以交错穿插要看情况.
读事务和写事务的执行在物理上(时刻上)可以交错穿插 ,在逻辑上是原子的.

读事务和写事务在物理上是可以被穿插的,因为它们通常不要求物理原子性,只要求逻辑一致性(即最终行为符合一致性模型)。

RMW事务的执行在物理上必须是不可穿插的,在逻辑上是原子的.

物理上的穿插很好理解,即 对同一个地址
	core 0 的 事务开始和结束 和 core1的 事务开始结束 是重叠的
逻辑上的原子性