MESI协议

转载自:http://blog.csdn.net/unei66/article/details/25738977

目录(?)[-]

  1. Cache的写策略
    1. 1Write through写通
    2. 2 Write back写回
  2. Cache一致性
    1. 1一致性问题的产生-信息不对称导致的问题
    2. 2Cache一致性的底层操作
    3. 3 Cache一致性协议

1.Cache的写策略:

1)Write through(写通)

每次CPU修改了cache中的内容,Cache立即更新内存的内容

2) Write back(写回)

内核修改cache的内容后,cache并不会立即更新内存中的内容,而是等到这个cache line因为某种原因需要从

cache中移除时,cache才会更新内存中的内容。

Write through(写通)由于有大量的访问内存的操作,效率太低,大多数处理器都使用Writeback(写回)策略。

Cache如何知道这行有没有被修改?需要一个标志-dirty标志。Dirty标志为1,表示cache的内容被修改,和内存的

内容不一致,当该cache line被移除时,数据需要被更新到内存,dirty标志位0(称为clean),表示cache的内容

和内存的内容一致。

有dirty标志的cache结构:

程序cache不会被修改,不需要dirty标志,数据cache需要dirty标志。

2.Cache一致性

1)一致性问题的产生-信息不对称导致的问题

在多核处理器中,内存中有一个数据x,值为3,被缓存到core0和core1中,如果core0将x修改为5,而core1

不知道x被修改,还在使用旧事,就会导致程序出错,这就是cache的不一致。

2)Cache一致性的底层操作

为了保证cache的一致性,处理器提供了两个保证cache一致性的底层操作:Writeinvalidate和Write update。

Write invalidate(置无效):当一个内核修改了一份数据,其他内核上如果有这份数据的复制,就置成无效。

Write update(写更新):当一个内核修改了一份数据,其他地方如果有这份数据的复制,就都更新到最新值。

Write invalidate是一种简单的方式,不需要更新数据,如果core1和core2以后不再使用变量x,这时候采用

write invalidate就非常有效,不过由于一个valid标志对应一个Cache line,将valid标志置成invalid后,这个

cache line中其他的有效的数据也不能使用了。Write upodate策略会产生大量的数据更新操作,不过只用更

新修改的数据,如果core1和core2会使用变量x,那么writeupdate就比较有效。由于Writeinvalidate简单,

大多数处理器都是用Writeinvalidate策略。

3) Cache一致性协议

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


状态


描述


M(Modified)


这行数据有效,数据被修改了,和内存中的数据不一致,数据只存在于本cache中


E(Exclusive)


这行数据有效,数据和内存中的数据一致,数据只存在于本cache中。


S(Shared)


这行数据有效,数据和内存中的数据一致,数据存在于很多cache中


I(Invalid)


这行数据无效

E状态(独占):

S状态(共享):

M状态和I状态:

MESI协议状态迁移图:

Local Read表示本内核读本Cache的值,Local Write表示本内核写Cache中的值,Remote Read表示其他内核

读其他Cache中的值,Remote write 表示其他内核写其他Cache的值,箭头表示本Cache line状态的迁移,唤

醒箭头表示状态不变。

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


当前状态


事件


行为


下一个状态


I(Invalid)


Local Read


如果其他Cache没有这份数据,本Cache从该内存中取数据,Cache line状态变成E;

如果其他Cache有这份数据,且状态为M,则将数据更新到内存,本Cache再从内存中取数据,两个Cache的Cache line状态都变成S;

如果其他Cache有这份数据,且状态为S或者E,本Cache从内存中取数据,这些Cache的Cache line状态都变成S。


E/S


Local Write


从内存中取数据,在Cache中修改,状态变成M;如果其他Cache有这份数据,切状态为M,则要先将数据更新到内存;

如果其他Cache有这份数据,则其他Cache的Cache line状态变成1


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状态变成I


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

参考资料:

1.《大话处理器》

时间: 2024-07-28 21:44:16

MESI协议的相关文章

J.U.C JMM. pipeline.指令重排序,happen-before(续MESI协议)

缓存(Cache)       CPU的读/写(以及取指令)单元正常情况下甚至都不能直接访问内存——这是物理结构决定的:CPU都没有管脚直接连到内存.相反,CPU和一级缓存(L1 Cache)通讯,而一级缓存才能和内存通讯.大约二十年前,一级缓存可以直接和内存传输数据.如今,更多级别的缓存加入到设计中,一级缓存已经不能直接和内存通讯了,它和二级缓存通讯——而二级缓存才能和内存通讯.或者还可能有三级缓存.   缓存是分“行”(cache line)的,一个行对应一块存储空间,大小是32.64或12

volatile关键字?MESI协议?指令重排?内存屏障?这都是啥玩意

一.摘要 三级缓存,MESI缓存一致性协议,指令重排,内存屏障,JMM,volatile.单拿一个出来,想必大家对这些概念应该有一定了解.但是这些东西有什么必然的联系,或者他们之间究竟有什么前世今生想必是困扰大家的一个问题.为什么有了MESI协议,我们还需要volatile?内存屏障的由来?指令重排带来的问题?下面我们通过分析每一个技术的由来,以及带来的负面影响,跟大家探讨一下这些技术之间的联系.具体每个关键词相关文章也很多不再赘述,只谈个人理解. 二.三级缓存篇 1,三级缓存的由来 CPU的发

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

MESI(Modified Exclusive Shared Or Invalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议,该协议被应用在Intel奔腾系列的CPU中,详见“support the more efficient write-back cache in addition to the write-through cache previously used by the Intel 486 processor” MESI

多核程序设计——缓存一致性协议MESI

MESI协议 在MP系统中,每个CPU都有自己独立的cache,缓存之间的一致性很很容易受到破坏的,所以缓存一致性协议就应运而生了.MESI是一种使用非常广泛的缓存一致性协议. MESI存在"modified","exclusive","shared"和"invalid"四种状态,协议可以在一个指定的缓存中应用这四种状态.因此,协议在每一个缓存行中维护一个两位的状态"tag",这个"tag&quo

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

CPU高速缓存(Cache Memory) CPU为何要有高速缓存 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU.这就造成了高性能能的内存和硬盘价格及其昂贵.然而CPU的高度运算需要高速的数据.广州SEO为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题. 在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理. **时间局部性(Tempora

缓存一致性协议MESI

1. 缓存一致性协议的由来: 计算机的存储设备速度与cpu的运算速度之间是数量级的差距,现代计算机不得不加入一层读写速度尽可能接近cpu运算速度的高速缓存来作为内存和cpu之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样cpu就无须等待缓慢的内存读写了. 基于高速缓存的存储交互很好地解决了cpu与内存的速度矛盾,但是也引入了新的问题:缓存一致性.在多cpu系统中,每个cpu都有自己的高速缓存,而它们又共享同一主内存,当多个cpu的运算任务

《大话处理器》Cache一致性协议之MESI【转】

转自:https://blog.csdn.net/muxiqingyang/article/details/6615199 Cache一致性协议之MESI          处理器上有一套完整的协议,来保证Cache一致性.比较经典的Cache一致性协议当属MESI协议,奔腾处理器有使用它,很多其他的处理器都是使用它的变种. 单核Cache中每个Cache line有2个标志:dirty和valid标志,它们很好的描述了Cache和Memory(内存)之间的数据关系(数据是否有效,数据是否被修改

伪共享 FalseSharing (CacheLine,MESI) 浅析以及Java里的解决方案

起因 在阅读百度的发号器 uid-generator 源码的过程中,发现了一段很奇怪的代码: /** * Represents a padded {@link AtomicLong} to prevent the FalseSharing problem<p> * * The CPU cache line commonly be 64 bytes, here is a sample of cache line after padding:<br> * 64 bytes = 8 by

就是要你懂Java中volatile关键字实现原理

原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用. 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好.更正确地地