博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CPU多级缓存与缓存一致性
阅读量:2430 次
发布时间:2019-05-10

本文共 2345 字,大约阅读时间需要 7 分钟。

cache的作用

随着现代半导体工艺的发展,CPU的频率越来远快,相对内存快了一个数量级,对于访存的操作CPU就需要等待主存,这样会导致资源的白白浪费。所以cache的出现是为了解决CPU与内存速度不匹配的问题。

cache的思想在我们日常的生活随处可见,我们周围的便利店就是个很好的例子。工厂把我们日常用品部分存储在便利店,省掉了直接从工厂购买所需要的时间开销,方便了我们的生活。

cache 的工作原理是基于“局部性”原理,它包含以下两个方面:

  • 时间局部性:如果某个数据被访问,那么不久将来它很可能再次被访问。
  • 空间局部性:如果某个数据被访问,那么与它相邻的数据也可能被访问。

现在的多核CPU的缓存一般都到了3级

这里写图片描述

cache中保存着cpu刚用过的数据或者是循环使用的数据,这时,从cache中读取数据就会很快,减少了cpu等待的时间,提高了系统的性能。

cache带来的问题

cache 给系统带来性能上飞跃的同时,也引入了新的问题“缓存一致性问题”。设想如下场景(cpu一共有两个核,core1和core2):

以i++为例,i的初始值是0.那么在开始每个核都存储了i的值0,当第core1块做i++的时候,其缓存中的值变成了1,即使马上回写到主内存,那么在回写之后core2缓存中的i值依然是0,其执行i++,回写到内存就会覆盖第一块内核的操作,使得最终的结果是1,而不是预期中的2。

缓存一致性

为了达到数据访问的一致,需要各个处理器在访问缓存时遵循一些协议,在读写时根据协议来操作,常见的协议有MSI,MESI,MOSI等。我们介绍其中最经典的MESI协议。

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

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

E状态:

这里写图片描述
只有Core 0访问变量x,它的Cache line状态为E(Exclusive)。

S状态:

这里写图片描述
3个Core都访问变量x,它们对应的Cache line为S(Shared)状态。

M状态和I状态:

这里写图片描述
Core 0修改了x的值之后,这个Cache line变成了M(Modified)状态,其他Core对应的Cache line变成了I(Invalid)状态。

协议时序图:

在MESI协议中,每个Cache的Cache控制器不仅知道自己的读写操作,而且也监听(snoop)其它Cache的读写操作。每个Cache line所处的状态根据本核和其它核的读写操作在4个状态间进行迁移。
这里写图片描述

在上图中,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再从内存中取数据,2个Cache 的Cache line状态都变成S;

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

E/S
Local Write
从内存中取数据,在Cache中修改,状态变成M;

如果其它Cache有这份数据,且状态为M,则要先将数据更新到内存;

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

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

参考资料

https://blog.csdn.net/muxiqingyang/article/details/6615199

你可能感兴趣的文章
5G精华问答 | 什么是5G?5G与LTE有什么关系?
查看>>
虎牙直播在微服务改造方面的实践和总结
查看>>
微服务精华问答 | 在使用微服务架构时,您面临哪些挑战?
查看>>
Kubernetes 调度器实现初探
查看>>
边缘计算精华问答 | 边缘计算有哪些应用场景?
查看>>
要闻君说:Synergy Research Group首发云基础设施数据,腾讯云v5一把;京东物流发力5G;厉害!阿里挖走贾扬清...
查看>>
数据中台精华问答 | 数据中台和传统数仓的区别是什么?
查看>>
这是一则计算机视觉顶级会议CVPR与腾讯的爆闻,啥?
查看>>
如何用30分钟快速优化家中Wi-Fi?阿里工程师有绝招
查看>>
【C语言】C语言中常用函数源代码【strncpy ,strncat ,strncmp】
查看>>
【Java】【算法练习】题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历的结果。如果是输出yes,不是输出no,数组任意两个数字不相同。
查看>>
【Java】给定一个二叉树和其中的一个节点,请找出中序遍历的下一个节点且返回, 注意:树中的节点不仅包含左右子节点,同时包含父节点的指针。
查看>>
【Java】【多线程】—— 多线程篇
查看>>
【计算机网络】—— TCP/IP篇
查看>>
【Java】【算法】——算法篇
查看>>
【Java】【数据库】知识重点——数据库篇
查看>>
【Java】知识重点——消息队列篇
查看>>
【Java】学习总结 —— HashMap之put()方法实现原理
查看>>
【计算机网络】【TCP】如何讲清楚Tcp的三次握手和四次挥手?
查看>>
【Java】-- Java核心知识点总结
查看>>