整理一下一些计算机的基础概念。

概念

  • MESI(Modified, Exclusive, Shared, Invalid) 也称 Illinois 协议, 由美帝UIUC(University of Illinois at Urbana Champaign, 本人表弟目前就读的学校, 计算机系美帝5th, 刚知道...)提出, 是一种被广泛使用的支持回写策略的缓存一致性协议。
  • 回写高速缓存可以节省很多通常在写入缓存上浪费的带宽, 但其中会存有脏状态(缓存中数据与主存储器中的数据不同) 。
  • 相对于MSI(不是微星协议哈)协议减少了主存储器事务的数量, 从而获得了性能上的提升。
  • 缓存行(Cache line): 缓存存储数据的单元。

MESI 协议中的状态

  • CPU中每个缓存行(cache line) 使用4种状态进行标记(用额外的两位(bit)表示):

    • M: Modified(被修改过)

      • 该缓存行有效, 但是数据有脏状态(和内存中的数据不一致, 数据只存在于本Cache中)
      • 缓存行必须时刻监听所有试图读该缓存行相对旧主存的操作, 该操作必须在缓存中将缓存行写回主存中并将状态改为共享的(Shared)状态之前被延迟执行
    • E: Exclusive(被排除的, 独占的)
      • 该缓存行有效, 数据和内存中的数据一致, 数据只存在于本缓存中
      • 缓存行也必须监听其他缓存读主存中该缓存行的操作, 一旦有该操作, 该缓存行需要变成共享转态
    • S: Shared(共享的)
      • 该缓存行有效, 数据和内存中的数据一致, 数据存在于很多缓存中
      • 缓存行也必须监听其他缓存使该缓存行无效或者独占该缓存行的请求, 并将该缓存行变成无效的(Invalid)。
    • I: Invalid(无效的)
      • 此缓存行无效(未被使用)

MESI转态转化图

  • 状态之间的转换关系表(当成临接矩阵来看)

    M(Modified) E(Exclusive) S(Shared) I(Invalid)
    M(Modified) × × ×
    E(Exclusive) × × ×
    S(Shared) × ×
    I(Invalid)
  • 缓存(cache)分类

    • 分类前提: 所有的cache共同缓存了主内存中的某一条数据。
    • local cache(本地缓存): 指当前cpu的缓存
    • action cache(触发缓存): 触发读写事件的缓存
    • other cache(其他缓存): 除以上外其他缓存
    状态 触发本地读取 触发本地写入 触发远端读取 触发远端写入
    M状态(修改) 本地cache: M 触发cache:M 其他cache:I 本地cache:M 触发cache:M 其他cache:I 本地cache:M→E→S 触发cache:I→S 其他cache:I→S 同步主内存后修改为E独享,同步触发、其他cache后本地、触发、其他cache修改为S共享 本地cache:M→E→S→I 触发cache:I→S→E→M 其他cache:I→S→I 同步和读取一样,同步完成后触发cache改为M,本地、其他cache改为I
    E状态(独享) 本地cache:E 触发cache:E 其他cache:I 本地cache:E→M 触发cache:E→M 其他cache:I 本地cache变更为M,其他cache状态应当是I(无效) 本地cache:E→S 触发cache:I→S 其他cache:I→S 当其他cache要读取该数据时,其他、触发、本地cache都被设置为S(共享) 本地cache:E→S→I 触发cache:I→S→E→M 其他cache:I→S→I 当触发cache修改本地cache独享数据时时,将本地、触发、其他cache修改为S共享.然后触发cache修改为独享,其他、本地cache修改为I(无效),触发cache再修改为M
    S状态(共享) 本地cache:S 触发cache:S 其他cache:S 本地cache:S→E→M 触发cache:S→E→M 其他cache:S→I 当本地cache修改时,将本地cache修改为E,其他cache修改为I,然后再将本地cache为M状态 本地cache:S 触发cache:S 其他cache:S 本地cache:S→I 触发cache:S→E→M 其他cache:S→I 当触发cache要修改本地共享数据时,触发cache修改为E(独享),本地、其他cache修改为I(无效),触发cache再次修改为M(修改)
    I状态(无效) 本地cache:I→S 或者I→E 触发cache:I→S或者I →E 其他cache:E、M、I→S、I 本地、触发cache将从I无效修改为S共享或者E独享,其他cache将从E、M、I 变为S或者I 本地cache:I→S→E→M 触发cache:I→S→E→M 其他cache:M、E、S→S→I 既然是本cache是I,其他cache操作与它无关 既然是本cache是I,其他cache操作与它无关

MESI缓存一致性协议的更多相关文章

  1. 多线程之:MESI-CPU缓存一致性协议

    MESI(Modified Exclusive Shared Or Invalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议,该协议被应用 ...

  2. 并发研究之CPU缓存一致性协议(MESI)

    CPU缓存一致性协议MESI CPU高速缓存(Cache Memory) CPU为何要有高速缓存 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU.这就造 ...

  3. CPU缓存一致性协议—MESI详解

    MESI(也称伊利诺斯协议)是一种广泛使用的支持写回策略的缓存一致性协议,该协议被应用在Intel奔腾系列的CPU中. MESI协议中的状态 CPU中每个缓存行使用的4种状态进行标记(使用额外的两位b ...

  4. C和C++中的volatile、内存屏障和CPU缓存一致性协议MESI

    目录 1. 前言2 2. 结论2 3. volatile应用场景3 4. 内存屏障(Memory Barrier)4 5. setjmp和longjmp4 1) 结果1(非优化编译:g++ -g -o ...

  5. MESI-CPU缓存一致性协议

    转http://blog.csdn.net/realxie/article/details/7317630 http://en.wikipedia.org/wiki/MESI_protocol MES ...

  6. 一篇文章让你明白CPU缓存一致性协议MESI

    CPU高速缓存(Cache Memory) CPU为何要有高速缓存 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU.这就造成了高性能能的内存和硬盘价格及 ...

  7. Java内存模型(二)volatile底层实现(CPU的缓存一致性协议MESI)

    CPU的缓存一致性协议MESI 在多核CPU中,内存中的数据会在多个核心中存在数据副本,某一个核心发生修改操作,就产生了数据不一致的问题,而一致性协议正是用于保证多个CPU cache之间缓存共享数据 ...

  8. 缓存一致性协议(MESI)

    在目前主流的计算机中,cpu执行计算的主要流程如图所示: 数据加载的流程如下: 1.将程序和数据从硬盘加载到内存中 2.将程序和数据从内存加载到缓存中(目前多三级缓存,数据加载顺序:L3->L2 ...

  9. 关于缓存一致性协议、MESI、StoreBuffer、InvalidateQueue、内存屏障、Lock指令和JMM的那点事

    前言 事情是这样的,一位读者看了我的一篇文章,不认同我文章里面的观点,于是有了下面的交流. 可能是我发的那个狗头的表情,让这位读者认为我不尊重他.于是,这位读者一气之下把我删掉了,在删好友之前,还叫我 ...

随机推荐

  1. mysql视图初探

    mysql视图初探 官方例子如下,从官方的例子就可以看出来视图就是提供一种快捷查询.用视图来查询一些常用的结果. mysql> help create view; Name: 'CREATE V ...

  2. emWin 模拟器环境搭建

    转载http://www.nxpic.org/module/forum/thread-609329-1-1.html 这个模拟器工程在Segger官网下载:https://www.segger.com ...

  3. stm32CubeMx工程使用GCC编译

    软件: STM32CubeMx 5.0 GCC编译器 STM32 ST Link Utility 下载器:ST Link V2 1  安装gcc编译器 能编译ARM Cortex M核的GCC编译器下 ...

  4. 分享Linux CentOS7 VMware 系统目录结构、 ls命令 、文件类型、alias命令——笔记

    一. 系统目录结构 生成目录树结构: tree -a 显示所有 tree -d 仅显示目录 tree -L n n代表数字..表示要显示几层... tree -f 显示完整路径.. yum insta ...

  5. java 学习地址

    数组 JAVA中数组排序小结 Java中ArrayList和LinkedList区别    在往里面插入数据时.LinkedList会比ArrayList快很多,因为前者仅仅做了一个类型的插入,而后者 ...

  6. Linux安装nginx的环境要求

    # Linux下切记不能乱删东西!我把pcre强制删除后,什么命令都不能使用了,系统奔溃,血的教训! nginx是C语言开发,建议在linux上运行,本教程使用Centos6.4作为安装环境. 一.  ...

  7. Maven 使用Nexus搭建Maven私服

    Maven学习 (四) 使用Nexus搭建Maven私服 为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找 ...

  8. 三 Road

    3—5年程序员的发展和出路在哪里? 是继续做技术人,还是向管理者发力?是继续留在大公司,还是转投潜力小公司?如果没有核心竞争力,入行一两年的新程序员朋友是可以替代你大部分工作的,而且薪资还低,要怎么办 ...

  9. Python中的*可变参数与**关键字参数

    1.定义了一个需要两个参数的函数 def print_str(first, second): print first print second if __name__ == "__main_ ...

  10. Vue中 v-for 绑定key和不绑定key的区别

    首先,它们区别主要在于 虚拟DOM的复用,绑定key可以更好的复用,下面来详细讲一下 假如我们有一个数组 arr = [1,2,3,4],我们要在2后面插入一个值9: 如果绑定了key值,那么会是这样 ...