1、背景
多核处理器环境下如何保证高速缓存与主存数据保持一致,就引出了缓存一致性协议,该协议的目的就是确保各高速缓存与主存一致性。
为什么会发明缓存一致性协议,得从计算机结构说起,CPU和内存的交互是最频繁的,然后CPU读写速度远远超过内存的读写速度,如果CPU直接读写内存,则会造成CPU等待成本,即杀鸡焉用牛刀。为了不浪费CPU的处理速度,需要引入高速缓存(CPU>high speed cache>main memory)。
2、计算流程
2.1、带有缓存的CPU计算执行过程
- 程序以及数据被加载到主内存
- 指令和数据被加载到CPU的高速缓存
- CPU执行指令,把结果写到高速缓存
- 高速缓存中的数据写回主内存(刷新)
2.2、多级缓存
CPU的运算速度超越了1级缓存的数据I\O能力,CPU厂商又引入了多级的缓存结构。
3、MESI
状态 | 描述 | 监听任务 |
---|---|---|
M 修改 (Modified) | 该Cache line有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中。 | 缓存行必须时刻监听所有试图读该缓存行相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S(共享)状态之前被延迟执行。 |
E 独享、互斥 (Exclusive) | 该Cache line有效,数据和内存中的数据一致,数据只存在于本Cache中。 | 缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S(共享)状态。 |
S 共享 (Shared) | 该Cache line有效,数据和内存中的数据一致,数据存在于很多Cache中。 | 缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效(Invalid)。 |
无效 (Invalid) | 该Cache line无效。 | 无 |
状态转换图,这里重点弄清楚各状态间的转移路线。
状态M、E的cache line只要被远程读后,状态就会转换为S;
状态M、E、S的cache line只要被远程写后,状态就会转换为I;
有效状态M、E、S的本地读,状态维持不变;
有效状态M、E、S的本地写,状态转换为M;
无效状态I本地读写,状态转换为有效状态;
4、MOESI
MOESI协议引入了一个O(Owned)状态,并在MESI协议的基础上,进行了重新定义了S状态,而E、M和I状态和MESI协议的对应状态相同。同时操作相对于MESI多了几种(MESI操作有4种,本地读写、远程读写),MOESI操作有8种(数据拷贝读写、本地副本读写、本地副本读写无数据、从远程CPU获取副本读写)。
O位。O位为1表示在当前Cache 行中包含的数据是当前处理器系统最新的数据拷贝,而且在其他CPU中一定具有该Cache行的副本,其他CPU的Cache行状态为S。如果主存储器的数据在多个CPU的Cache中都具有副本时,有且仅有一个CPU的Cache行状态为O,其他CPU的Cache行状态只能为S。与MESI协议中的S状态不同,状态为O的Cache行中的数据与存储器中的数据并不一致。
S位。在MOESI协议中,S状态的定义发生了细微的变化。当一个Cache行状态为S时,其包含的数据并不一定与存储器一致。如果在其他CPU的Cache中不存在状态为O的副本时,该Cache行中的数据与存储器一致;如果在其他CPU的Cache中存在状态为O的副本时,Cache行中的数据与存储器不一致。
5、参考资料
https://www.cnblogs.com/yanlong300/p/8986041.html
https://blog.csdn.net/ZoeyyeoZ/article/details/51804647?locationNum=13