并发编程实战-MESI缓存一致性协议
大家好,最近呢我对并发编程展现出了兴趣(没办法,别人都会你不会说不过去啊),然后我就要奋发图强学好并发编程,那么接下来让我们一起进入学习吧。我们在学习并发编程实战之前,应该先要了解一下我们的cpu缓存的运行原理,必不可少的就是MESI缓存一致性协议了。
1、CPU缓存
1.1 Cache 的产生
在我们的计算的世界中,在最开始的时候,PC-AT/XT和286时代,CPU 是没有缓存这个概念的,386时代,CPU速度开始和内存速度不匹配了。为了能够加速内存访问,芯片组增加了对快速内存的支持,这也是在电脑上第一次出现Cache(尽管IBM 360 model系统上已经出现很久了),也是L1(一级Cache)的雏形。这个Cache是可选的,低端主板并没有它,从而性能受到很大影响。而高级主板则带有64KB,甚至高端大气上档次的128KB Cache,在当时也是可以笑傲江湖了。当时的Cache都是Write-Through,即Cache内容的更新都会立刻写回内存中。
那么Cache的产生,我们可以总结为因为cpu运算的比内存快所以频繁的读取内存会造成大量的性能损耗,当然一个存储器离cpu越远,那么他的性能损耗也就越严重,那么cpu运算的是信号,信号是以光速传输的。既然光速那么快,为什么还会有延迟呢,其实不是这样的。例如时钟信号是1GHz的CPU,1G代表10亿,那么时钟周期就是1/10亿秒。光速是3*10的8次方米每秒。那么在一个时钟周期内,光速只能前进30cm。所以因为这样的问题,不能一个存储器搞定所有存储问题。那么也就诞生了存储器的分级存储策略。
1.2 存储器分级策略
既然我们不能用一块存储,来解决我们现实世界中的所有问题,那就必须对存储分级别。
一种可行的方案,也就是利用材料的不同制作不同的存储,高频使用的数据,读写越快越好,因使用最贵的材料,放到离cpu最近的位置。使用频率越低的数据,我们放到离cpu越远的地方。
具体来说呢,通常我们把存储器分成几个级别:
- 寄存器
- L1-Cache
- L2-Cache
- L3-Cache
- 内存
- SSD/硬盘
1.3 CPU 缓存模型
1.3.1 单核CPU
当CPU运作的时候,它首先去L1寻找它所需要的数据,然后去L2寻找,如果L2没有的话,则会去主存中寻找。
L1 Cache大概几十K ,L2 Cache 大概几百kb,缓存是很小的,但是造价很昂贵。
1.3.2 多核CPU
那么多核处理区相比于单核处理器多出来一个L3 Cache,L1和L2是各个核心独有的。但是L3缓存是多个核心公有的。
CPU存储模型大致可以分为:
- L1 Cache
- L2 Cache
- L3 Cache
当CPU运作的时候,它首先去L1寻找它所需要的数据,然后去L2,然后去L3。如果三级缓存都没有找到它需要的数据,则从内存里获取数据。寻找的路径越长,耗时也就越长。所以如果要非常频繁的获取某些数据,保证这些数据在L1Cache里面,这样速度就会非常非常快。
缓存的存储的最小单元是缓存行,缓存大小为64字节。
1.3.3 CPU 多级缓存架构
那么我们的CPU缓存是一部分,也就是SARM ,当然我们还有一个主内存也就是Main Memery,他和CPU缓存交互的时候需要有一个总线来进行综合管控。
2、MESI协议详解
我们可以看一下上述的这个问题,cpu1 要对x这个变量执行x +1 操作,同时 cpu2 也要对x 进行操作。
这个时候他们都会把内存中的数据拉取到缓存中,所以他们拿到的x的值都是0,那么加1之后也就会导致都是1啊,而不是2.那么这个就是缓存一致性问题。
我们应该如何解决这个问题呢。
第一种方案也就是给bus总线加锁,谁访问内存的数据,就给bus加上lock,这个时候不处理完谁也不能加载和改变内存的数据,也就会导致cpu间的阻塞。这个问题可以解决但是性能太低了。
第二种方案也就是MESI 缓存一致性协议了。他是对单个缓存行来进行加锁,不会影响内存中其他的数据的读写操作。
2.1 MESI协议简介
MESI中每个缓存行都有四个状态,分别是M(modified)、E(exclusive)、S(shared)、I(invalid)。
M(修改):该Cache line有效,数据被修改了和内存中的数据不一致,但是仅存在本cache中。
E (独享):该Cache line有效,数据和内存一致,仅存在本cache中。
S (共享):该Cache line有效,数据存在多个缓存中。
I (无效):该Cache line无效。
因为有这四个状态,所以每个缓存行都有2个bit来进行表示当前Cache line的状态。
首先我们来看看状态的表示在cpu中是怎样的。
M 修改态 和无效态
M 状态表示当前核心修改了这个缓存行,那么标志位需要修改为M,首先其他的core 缓存没有这个缓存行的话,那么就修改当前核心的状态就好了。那么假如其他的core 也有这个缓存行,他们就得修改为I状态也就是失效的状态,那么他们怎么知道的这个你修改了呢。
在mesi协议中每个cache的cache 控制器,他不仅知道自己的操作还会监听其他的核心的缓存的操作。那么当前缓存行的状态就可以根据其他核心和本核心的读写操作来确定缓存行的状态。
E 独享态
独享态也就是说我和内存的数据一致,并且就我自己有这个缓存行,那么就是独享态。
S 共享态
共享态的意思是,数据和内存一致,并且多个核心都有这个缓存行,那么这个就是共享态。
2.2 MESI 状态流转
我当初第一次看这个的时候有点懵逼,没关系,我们来详细理解一下这个过程。
我们分状态理解一下这个过程:
2.2.1 E 独享态
local read
因为我是独享的,整个缓存中就我自己有,我自己读自己就完事了,状态不会变化。
local write
因为我是独享的,整个缓存中就我自己有,我自己修改自己就完事了,状态修改为M 修改态就可以。
remote read
因为我是独享的,整个缓存中就我自己有,其他人要读取我的缓存行,那说明以后不只是我自己有了其他人也有,所以需要把状态修改为S 共享态
remote write
因为我是独享的,整个缓存中就我自己有,内存数据被修改了,所以我需要将状态修改为I
2.2.2 S 共享态
local read
因为缓存是共享的,所以直接读自己就完事了
local write
因为缓存是共享,这一份数据很多缓存都有,我们先写本地缓存行,然后更改状态为M ,其他的副本缓存行修改状态为I
remote read
因为是共享的状态不需要变化,读就完了。
remote write
其他缓存中的这个缓存被修改了,所以我的状态需要修改为I
2.2.3 M 修改态
local read
因为缓存是修改状态,而且数据是最新的,那就直接读就可以。
local write
因为是修改的状态而且是最新的
remote read
因为我本地是最新的,其他的核心缓存需要读取这个缓存,但是我们需要做的是将数据写入内存,让其他核心可以收到最新的状态。
remote write
其他缓存中的这个缓存被修改了,所以我的状态需要修改为I
2.2.4 I 无效态
local read
1、如果其他缓存没有这个缓存行,则从内存中将数据读取出来,状态修改为E
2、如果其他缓存有这个缓存行,并且为E或者S状态,则直接共享,状态修改为 S
3、如果其他缓存有这个缓存行,并且状态为M,则将M状态的数据写入内存,从总线获取其他缓存的数据。
local write
1、如果其他缓存中有这份数据,且状态为E或S,那么就获取到这个缓存行,然后进行修改,其他缓存行修改为I
2、通知总线获取数据,如果其他缓存中有这个行,并且状态为M,则M状态的数据写入内存,然后从总线获取数据,修改数据,并且其他缓存行状态修改为I。
remote read
没有影响。
remote write
没有影响。
3、总结
今天我们介绍了 cpu chache的产生,就是因为速率不匹配的问题,而产生了三级缓存。还有就是操作都是在三级缓存中操作的,其实很多数据库都借鉴了这个思想,例如mysql的buffer pool等。接下来我们又讲解了存储器的分级策略,也就是将整个计算机的数据分级存储,离cpu越远的造价越便宜,也就越慢。也介绍了cpu的缓存模型,以及bus总线,缓存嗅探机制。
接下来我们就了解了一下MESI缓存一致性协议,有四个状态分别是M 、E、S、I。
好了,各位大佬,今天我分享到这里,谢谢大佬们的观看,如有错误的地方,希望不吝斧正。
并发编程实战-MESI缓存一致性协议相关推荐
- 4.什么是MESI缓存一致性协议?怎么解决并发的可见性问题?
MESI一致性协议 小陈:老王,上一章你让我看看MESI一致性协议,我大概了解了一下. 老王:哦,来说说你对MESI一致性协议的理解 小陈:MESI协议也叫做缓存一致性协议,主要是用来进行协调多核CP ...
- MESI 缓存一致性协议
本文目录 场景再现 1.总线锁 2.MESI 缓存一致性协议 1.MESI 协议概念 2.通过例子来介绍 MESI 协议 1.MESI 场景 2.MESI 协议下,执行步骤 3.MESI协议失效问题 ...
- MESI缓存一致性协议详解
MESI缓存一致性协议详解 1.CPU为何要有高速缓存 CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题. 带有高速缓存的CPU执行计算的流程 程序以及数据被加载到主内存 ...
- MESI缓存一致性协议
每个处理器,在自己的高速缓存中都有变量副本,这就有了缓存不一致问题,因此有了MESI协议. MESI协议将缓存行状态flag分为4种: invalid:无效的,标记为I,当前cache entry无效 ...
- 简述Intel的MESI缓存一致性协议
①M:modified--与主存的内容相比,有改动就标记为M.我改过,那么对于别人来说就是i了. ②E:exclusive--内容为我锁独占,标记为E. ③S:shared--与此同时别人也在读,标记 ...
- 两个例子详解并发编程的可见性问题和有序性问题,通过volatile保证可见性和有序性以及volatile的底层原理——缓存一致性协议MESI和内存屏障禁止指令重排
1. 并发编程的可见性问题 2. 并发编程的有序性问题 3. 使用volatile关键字解决可见性问题 4. 可见性问题的本质--缓存不一致 因为cpu执行速度很快,但是内存执行速度相对于CPU很慢, ...
- “了解高并发底层原理”,面试官:讲一下MESI(缓存一致性协议)吧
目录 前言: 1.什么是(Who): 2.为何来(How): 2.1缓存不一致带来的后果 2.2解决方法: 3.是什么(What) 3.1数据在缓存中的四种状态: 3.2MESI的六种消息(请求消息和 ...
- Java并发编程实战_一线大厂架构师整理:java并发编程实践教程
并发编程是Java语言的重要特性之一, 在Java平台上提供了许多基本的并发功能来辅助开发多线程应用程序.然而,这些相对底层的并发功能与上层应用程序的并发语义之间并不存在一种简单而直观的映射关系.因此 ...
- 并发编程中的可见性——缓存一致性协议MESI
一.应用场景展示--多线程计数 1.全局原子操作计数的数据流图 核心问题就是不同CPU如何在同一时刻看到同样的全局变量值. 2.每线程自增计数的数据流图 二.cache原理和实现 1. cache g ...
最新文章
- java 数组越界异常_数组越界异常 求解决!!!
- 600度近视眼恢复方法_近视眼了怎么办?试试这几种方法,或许能奏效
- 目标检测--Focal Loss for Dense Object Detection
- OpenFlow Switch — 1.3 规范
- 菜鸟学SSH(八)——Hibernate对象的三种状态
- Serial.println()和Serial.print() (Arduino编程)
- 95-090-020-源码-bin脚本-CLI提交Job
- Python机器学习、深度学习库总结(内含大量示例,建议收藏)
- U盘安装系统 从此告别光盘
- 北京市昌平区卫星地图离线包下载
- laravel 下载文件
- 怎么用计算机算钱,亚马逊fba费用计算器要怎么使用?
- 天雁计算机TY-82MS-4说明书,怎样用天雁TY-82MS-4计算器做一次和二次函数,跪谢!...
- 马赛克效果,通过PS把迪丽热巴制作成马赛克效果
- K8S kube-proxy- iptable模式实现原理分析
- Python---Excel文件xls格式转为xlsx格式
- 北京计划以环球影城为核心,开发文化旅游精品线路
- 自动驾驶中基于地图的视觉定位方法
- php相册管理插件,相册插件-ZBLOGPHP插件-鸟儿网络
- 什么是 ML.NET?应该如何理解机器学习基础知识?
热门文章
- 控件的基本使用-iOS—UI笔记
- 生物信息:三维基因组,转录组,重测序,chip-seq 视频课程 24节全
- STM32串口中断不能进入
- 《程序员养成记》第7集 珍爱生命远离编程
- 《孵化皮克斯》读书第一天
- Idea新建Spring Initializr项目文件哪些可删
- 程序员刷 leetcode 经常陷入刷了忘忘了刷的尴尬局面怎么办?
- 初中经典几何题,95%的同学都不会做,高手请进来 2016-03-21 16:25 几何是初中数学最主要的内容,对大多数孩子来说也是比较难的内容。而我们想要战胜这一比较难的题型,我们就需要多多练题
- vue组件间常用的几种通信方式
- Redis-全面详解(学习总结---从入门到深化)