事务的原子性
文章目录
- 🧩 事务是什么?
- 🔧 RMW 指令(Read-Modify-Write)产生什么事务?
- 指令 和事务的关系
- 事务和总线交互的关系
- 事务的原子性
🧩 事务是什么?
“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的 事务开始结束 是重叠的
逻辑上的原子性