首页 > 其他分享 >【转帖】Cache一致性协议与MESI(2)

【转帖】Cache一致性协议与MESI(2)

时间:2024-02-05 09:01:20浏览次数:33  
标签:状态 Cache 转帖 MESI Write line 数据

http://www.valleytalk.org/2011/07/11/cache%E4%B8%80%E8%87%B4%E6%80%A7%E5%8D%8F%E8%AE%AE%E4%B8%8Emesi2/

 

Sina WeiboBaiduLinkedInQQGoogle+RedditEvernote分享
分享到: 新浪微博 腾讯微信 开心 人人 Live Digg FB Twitter


Write invalidate提供了实现Cache一致性的简单思想,处理器上会有一套完整的协议,来保证Cache一致性。比较经典的Cache一致性协议当属MESI协议,奔腾处理器有使用它,很多其他的处理器都是使用它的变种。

单核处理器Cache中每个Cache line有2个标志:dirty和valid标志,它们很好的描述了Cache和Memory(内存)之间的数据关系(数据是否有效,数据是否被修改),而在多核处理器中,多个核会共享一些数据,MESI协议就包含了描述共享的状态。

在MESI协议中,每个Cache line有4个状态,可用2个bit表示,它们分别是:

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

MESI状态

M(Modified)和E(Exclusive)状态的Cache line,数据是独有的,不同点在于M状态的数据是dirty的(和内存的不一致),E状态的数据是clean的(和内存的一致)。

S(Shared)状态的Cache line,数据和其他的Cache共享。只有clean的数据才能被多个Cache共享。

I(Invalid)表示这个Cache line无效。

E状态示例如下:

E状态

只有Core 0访问变量x,它的Cache line状态为E(Exclusive)。

S状态示例如下:

S状态

3个Core都访问变量x,它们对应的Cache line为S(Shared)状态。

M状态和I状态示例如下:

M状态和I状态

Core 0修改了x的值之后,这个Cache line变成了M(Modified)状态,其他Core对应的Cache line变成了I(Invalid)状态。
在MESI协议中,每个Cache的Cache控制器不仅知道自己的读写操作,而且也监听(snoop)其它Cache的读写操作。每个Cache line所处的状态根据本核和其它核的读写操作在4个状态间进行迁移。

MESI协议状态迁移图如下:

MESI协议状态迁移图

在上图中,Local Read表示本内核读本Cache中的值,Local Write表示本内核写本Cache中的值,Remote Read表示其它内核读其它Cache中的值,Remote Write表示其它内核写其它Cache中的值,箭头表示本Cache line状态的迁移,环形箭头表示状态不变。

MESI状态之间的迁移过程如下:

当前状态 事件 行为 下一个状态
I(Invalid) Local Read 从Memory中取数据,

 

状态变成E

E
Local Write 从Memory中取数据,在Cache中修改,

 

状态变成M

M
Remote Read 既然是Invalid,别的核的操作与它无关 I
Remote Write 既然是Invalid,别的核的操作与它无关 I
E(Exclusive) Local Read 从Cache中取数据,

 

状态不变

E
Local Write 修改Cache中的数据,

 

状态变成M

M
Remote Read 数据和其他核共用,状态变成了S S
Remote Write 数据被修改,本Cache line不能再使用,状态变成I I
S(Shared) Local Read 从Cache中取数据,

 

状态不变

S
Local Write 修改Cache中的数据,

 

状态变成M,

其他核共享的Cache line置无效

M
Remote Read 状态不变 S
Remote Write 数据被修改,本Cache line不能再使用,状态变成I I
M(Modified) Local Read 从Cache中取数据,

 

状态不变

M
Local Write 修改Cache中的数据,状态不变 M
Remote Read 这行数据被写到内存中,使其它核能使用到最新的数据,

 

状态变成S

S
Remote Write 这行数据被写到内存中,使其它核能使用到最新的数据,由于其它核会修改这行数据,

 

状态变成I

I

MESI状态迁移

AMD的Opteron处理器使用从MESI中演化出的MOSEI协议,O(Owned)是MESI中S和M的一个合体,表示本Cache line被修改,和内存中的数据不一致,不过其它的核可以有这份数据的拷贝,状态为S。

Intel的core i7处理器使用从MESI中演化出的MSEIF协议,F(Forward)从Share中演化而来,一个Cache line如果是Forward状态,它可以把数据直接传给其它内核的Cache,而Share则不能。

标签:状态,Cache,转帖,MESI,Write,line,数据
From: https://www.cnblogs.com/jinanxiaolaohu/p/18007355

相关文章

  • Java Integer包装类缓存(cache)
    ​ Java的Integer类有一个内部的缓存机制,主要用于优化自动装箱(autoboxing)和拆箱(unboxing)的性能。这个特性首次引入于Java5,旨在减少对频繁使用的小整数值的重复对象创建,从而提高性能和减少内存使用。 参数文档:JavaInteger包装类缓存(cache)-CJavaPy1、缓存范围默认情况下,I......
  • MyBatis整合第三方缓存EHCache
    EHCache缓存针对于MyBatis的二级缓存。MyBatis默认二级缓存是SqlSessionFactory级别的。添加依赖<!--MyBatis-EHCache整合包--><dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.1</vers......
  • 本地缓存Ehcache的应用实践 | 京东云技术团队
    java本地缓存包含多个框架,其中常用的包括:Caffeine、GuavaCache和Ehcache,其中Caffeine号称本地缓存之王,也是近年来被众多程序员推崇的缓存框架,同时也是SpringBoot内置的本地缓存实现。但是除了Caffeine之外,还有一款也不错的本地缓存框架Ehcache,具有快速、灵活,并支持内存和磁盘缓......
  • [转帖]彻底搞明白 GB2312、GBK 和 GB18030
    https://www.zhihu.com/people/lion-89 日常工作的过程中,关于字符编码的问题经常让人头疼不已,这篇文章就来捋一捋关于GB2312、GBK、GB18030相关的知识以及它们和Unicode的关系简介GB23121980年,中国发布了第一个汉字编码标准,也即GB2312,全称《信息交换用汉字......
  • [转帖]SQL SERVER--- 排序规则、数据类型
    https://zhuanlan.zhihu.com/p/162933497 一、排序规则有时候我们向数据库插入文本时,会出现乱码“?”,这时有可能是我们创建数据库没有设置好排序规则以Chinese_PRC_CI_AS为例前半部分Chinese_PRC指的是针对大陆简体字unicode的排序规则后半部分的含义为:_BIN二进......
  • opcache导致的RCE复现
    前言RCE得搭配着文件上传的点来进行利用环境搭建用docker搭个php7的环境,作者用的php7.0dockerrun-itd--namephp7-p8083:80php:7.0-apache安装opcache拓展进入docker容器:dockerexec-it容器id/bin/bash安装opcache:cd/usr/local/bin&&docker-php-ext-configure......
  • [转帖]Open JDK 8.0_152-b16 崩溃 : [libzip.so+0x12522] newEntry+0x62
    一.问题描述在执行spark任务的时候,JVM崩溃.崩溃dump日志:##AfatalerrorhasbeendetectedbytheJavaRuntimeEnvironment:##SIGBUS(0x7)atpc=0x00007f9adacb9522,pid=107874,tid=0x00007f9add417700##JREversion:Java(TM)SERuntimeEnvironme......
  • PHP5.6的安装及redis、memcache、mongo扩展
    系统版本:CentOSLinuxrelease7.4.1708(Core)PHP5.6下载地址:wgethttp://am1.php.net/distributions/php-5.6.37.tar.gz需要装好yum的epel-release,这上面有相对应的依赖包,否则依赖包没装好编译会报错!!!安装相关依赖关系包yum-yinstallgccgcc-c++phpphp-mysqbzip2-dev......
  • 【转帖】UTF-8编码发展历史
    https://www.jianshu.com/p/ea91ff32a3c0 1.美国人首先对英文字符编成ASCII码,用一个字节中的低7位表示英文128个字符,高1位统一为02.欧洲人字母上存在注音符,128位不够用,即采用高1位,最多可表示256位3.不同国家字符编码不一致,虽然0--127表示的符号是一样的,但是128--255的......
  • informer cache自定义索引
    informercache默认通过namespace/name作为key把对象保存到map中。条件查询时一般通过labels.Selector来过滤,但这需要遍历所有元素,informercache可以类似于MySQL那样建立索引,来提高查询速度。//map根据指定的key来给对象分类//IndexFuncknowshowtocomputethesetofind......