Skip to content

Commit

Permalink
Update cache-coherence-and-memory-order-1.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Wizmann authored Mar 31, 2024
1 parent bb79ca2 commit 066c426
Showing 1 changed file with 20 additions and 8 deletions.
28 changes: 20 additions & 8 deletions content/Blog/cache-coherence-and-memory-order-1.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,41 @@ Title: CPU缓存一致性与C++ Memory Order (第一部分-MESI协议)
Tags: cpp, memory-barrier, multithread, thread, MESI
Slug: cache-coherence-and-memory-order

在对称多处理系统(Symmetric Multiprocessing System)中,一个变量(或一个内存位置)实际上可以被多个 CPU 的缓存所共享。从用户的角度看,我们期望能“原子地”修改多个缓存,也就是实现缓存之间的强一致性。然而,在实现层面,由于多个 CPU 之间通常通过总线进行通信,它们无法同时修改多个缓存。
在对称多处理系统(Symmetric Multiprocessing, SMP)中,一个变量(或内存位置)可以同时存在于多个CPU的缓存行中。为了提供完美的用户级抽象,任何对一个或多个变量的修改都应该被强制同步,以确保其它CPU的缓存得到更新。
然而,在实现上,由于CPU之间通常通过总线互联,它们不能同时对多个缓存进行写操作。

### 缓存一致性解决的问题
### 缓存一致性

缓存一致性解决的问题包括写传播(Write Propagation)和事务串行化(Transaction Serialization)。写传播要求每个 CPU 核心的写入操作能够传播到其他 CPU 核心,而事务串行化则保证所有 CPU 核心的写入操作顺序对所有 CPU 核心来说是一致的。
缓存一致性是指在一个多处理器系统中,确保当某个处理器修改了存储在共享资源(如主内存或缓存中的数据)时,其他处理器能够访问到最新的数据版本,从而保证数据的一致性。

为了达到这一目标,缓存一致性机制必须处理两个主要问题:写传播(Write Propagation)和事务串行化(Transaction Serialization)。

写传播确保一个处理器核心的写操作能被传播并被其他处理器核心所见。而事务串行化则确保所有处理器核心的写操作按照一定的顺序执行,对所有处理器核心而言这个顺序是一致的。这两个机制共同工作,确保了即使多个CPU可能并发地修改同一份数据,它们也能看到一致的数据视图。

### MESI协议

为了实现缓存一致性,多种协议和机制被设计出来,其中MESI协议是最广泛使用的一种机制。

> 实际上,AMD处理器使用的是MOESI协议,Intel处理器使用的是MESIF协议。这两种协议都是MESI协议的变种。这里不展开讨论。
MESI 协议通过定义缓存行的四种状态——修改(Modified)、独占(Exclusive)、共享(Shared)和无效(Invalid),管理多个处理器缓存之间的一致性。状态之间的转换受到缓存协议控制,以确保数据的一致性和同步。

- 独占(Exclusive, E):缓存行仅存在于当前缓存中,并且是干净的(即缓存数据与主存数据一致)。当其他缓存尝试读取该数据时,状态转变为共享;当前缓存写入数据时,转变为已修改状态
- 共享(Shared, S):缓存行同时存在于其他缓存中,并且是干净的。该缓存行可以在任意时刻被抛弃
- 已修改(Modified, M):缓存行的数据是“脏”的(即与主存的值不同)。如果其他 CPU 核心需要读取这块数据,该缓存行必须先回写到主存,然后状态转变为共享
- 无效(Invalid, I):表示该缓存行无效,即为空。上文提到的缓存策略会优先填充无效行

简单来说,MESI的设计目标在于:

1. 防止多个处理器核心同时对共享数据进行修改。任何需要修改共享数据的核心都会先发出RFO(Read For Ownership)请求来获取该缓存块的所有权,并使其他处理器核心中的相应缓存块变为无效。
2. 通过推迟写回操作来减少对内存的频繁修改,确保只有在必要时才将缓存中的更改写回内存。

### MESI 的状态转移

MESI 协议的状态转移如下:

![](https://raw.githubusercontent.com/Wizmann/assets/master/wizmann-pic/24-03-31/1711876193915_Diagrama_MESI.gif)

- 从无效(I)到独占(E):当 CPU 需要写入一个缓存行而该行当前状态为无效时,如果其他 CPU 缓存中没有该缓存行的副本,该行状态变为独占。这表明当前 CPU 缓存中的数据是最新的,且没有其他副本存在
- 从无效(I)到共享(S):当 CPU 需要读取一个缓存行而该行当前状态为无效时,如果其他 CPU 缓存中存在该缓存行的副本,则该行状态变为共享
- 从共享(S)到独占(E):当一个 CPU 想要写入一个处于共享状态的缓存行时,必须首先获取其他所有 CPU 上该缓存行的独占访问权,如果成功,该缓存行状态变为独占
Expand All @@ -31,11 +47,7 @@ MESI 协议的状态转移如下:

> 可以使用这个[简单的模拟器](https://www.scss.tcd.ie/Jeremy.Jones/VivioJS/caches/MESI.htm)来模拟MESI协议的工作状态
### MESI的核心目标

MESI 的核心目标包括防止多个核心同时修改共享数据和延迟回写。防止多个核心同时修改共享数据是通过广播 RFO(Read For Ownership)请求以获得缓存块的所有权,并将其他 CPU 核心中对应的缓存块置为无效状态实现的。延迟回写是指数据只有在必要时才被写回内存,以加速数据同步过程。

### MESI的优化:写缓冲区与失效队列
### MESI的优化

随着多核处理器的普及和系统复杂度的增加,MESI协议面临着性能瓶颈和效率问题。因此,为了提高系统性能和缩短响应时间,对MESI协议的优化变得非常必要。

Expand Down

0 comments on commit 066c426

Please sign in to comment.