IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> MESI 缓存一致性协议 -> 正文阅读

[Java知识库]MESI 缓存一致性协议

MESI 缓存一致性协议

多核场景下,仅仅依靠CAS这一类硬件原语并不能实现同步,因为原子指令底层实现也可能包含多条微指令,而原子指令的原子性是相对于一个核而言的,多条原子指令在各自的CPU核上都是原子执行的。所以要解决这个问题就要先将总线锁住。例如在Go中Mutex的实现,在执行CMPXCHGL指令直线先LOCK总线。锁住总线就导致程序由并行变为串行,这必然会影响性能,现代CPU都拥有高速缓存,不再通过锁总线的方式实现多核间的同步,为了保证多核间高速缓存的一致性,引入了高速缓存一致性协议(MESI协议)。

单核CPU的cache中每个cache line有2个标志:dirty、valid标识,表示cache中的数据是否被修改、是否有效。而在多个核中每个CPU都有自己对应的cache,多个核共享内存中的数据,MESI协议就描述了数据的共享状态,分别是:

状态描述
M(Modified)该行数据有效、被修改,和内存中的数据不一致,该数据只存在于本Cache中。
E(Exclusive)该行数据有效、和内存中的数据一致,该数据只存在于本Cache中。
S(Shared)该行数据有效,和内存中的数据一致,该数据存在于多个Cache中。
I(Invalid)该行数据无效。

M与E的共同点是:都是本Cache所独有的;不同点是:M表示Cache中的数据与内存中的数据不一致。

在MESI协议中,每个Cache的Cache控制器不仅要知道自己的读写操作,还要监听其他Cache的读写操作(监听总线)。

状态变化如下,其中Local Read/Write表示对本CPU Cache的读写操作,Remote Read/Write表示其他CPU对自己Cache的读写操作。

当前状态事件行为下一个状态
I(Invalid)Local Read如果其它Cache没有这份数据,本Cache从内存中取数据,Cache line状态变成E; 如果其它Cache有这份数据,且状态为M,则将数据更新到内存,本Cache再从内存中取数据,2个Cache 的Cache line状态都变成S; 如果其它Cache有这份数据,且状态为S或者E,本Cache从内存中取数据,这些Cache 的Cache line状态都变成SE/S
I(Invalid)Local Write如果其它Cache没有这份数据,本Cache从内存中取数据并修改,Cache line状态变成M;如果其它Cache有这份数据,且状态为M,则要先将数据更新到内存,读取并修改,其他Cache的Cache line状态变为I;M/I
I(Invalid)Remote Read既然是Invalid,别的核的操作与它无关I
I(Invalid)Remote Write既然是Invalid,别的核的操作与它无关I
E(Exclusive)Local Read从Cache中取数据,状态不变E
E(Exclusive)Local Write写入Cache,状态变为MM
E(Exclusive)Remote Read数据和其它核共用,状态变成了SS
E(Exclusive)Remote Write数据被修改,本Cache line不能再使用,状态变成II
S(Shared)Local Read从Cache中取数据,状态不变S
S(Shared)Local Write修改Cache中的数据,状态变成M,其它核共享的Cache line状态变成IM
S(Shared)Remote Read状态不变S
S(Shared)Remote Write数据被修改,本Cache line不能再使用,状态变为II
M(Modified)Local Read从Cache中取数据,状态不变M
M(Modified)Local Write修改Cache中的数据,状态不变M
M(Modified)Remote Read写会内存,使其它核能使用到最新的数据,状态变为SS
M(Modified)Remote Write写会内存,使其它核能使用到最新的数据,数据被修改,本Cache line不能再使用,状态变为II
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:26:52  更:2022-01-25 10:29:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:37:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码