CPU一致性的解决办法

博主微信:flm13724054952,不懂的有疑惑的也可以加微信咨询,欢迎大家前来指教共同探讨,谢谢!博主最近的工作是CPU集成设计,所以接下来的篇章将以CPU的学习讲解为主。最后再打个小广告,欢迎各位对数字IC设计感兴趣的博友来我们公司“众星微”,可以内推哦。

about Coherency

如下图所示,在芯片系统一般会有放OS程序的L2 Cache或者main memory。当系统是一个单主机的CPU处理器,那么系统便不会有一致性的数据问题。
当一个系统存在多个主机(多个CPU)的时候,当多个主机同时访问相同的MEM时候,如果一个或者多个CPU有自己的cache时候就会出现以下的问题:
(1)CPU0写数据到L2 Cache的地址Q,但是采用的是write-back缓存,导致数据写在他自己的L1 Cache里面,而当CPU1去读取L2 Cache的地址Q,这个时候读到的数据就是旧的数据。
(2)CPU1读L2 Cache的地址Q数据并缓存数据到自己的L1 Cache,然后CPU0继续写数据到L2 Cache的地址Q,采用write-through写缓存到L2 Cache,然后当CPU1继续读地址Q,但是读的数据是从自己的L1 Cache搬移,那么这个时候读取到的依然是旧的数据。

Coherency policy

当Cortex-R5在集成双核的时候,每一个CPU可以拥有自己的L1 Cache。而且Cortex-R5也可以与其他主机一起集成在同个系统里,只是这个时候难免会遇到一致性的问题,那这个时候就得考虑如何解决一致性的问题了。
下面就有五种办法:
(1)数据不共享:当确保多个CPU之间不会访问一样的地址数据即可,那么就不会出现一致性问题。
(2)数据共享但是不缓存:即对于共享区域的数据永远不会缓存到自己的L1-Cache里面去,确保实时共享数据为最新的。但是如果遇到CPU连上L2 Cache的时候,那么共享区域的数据就有可能会缓存到L2 Cache里面去,这个时候就要来配置一下L2 Cache的区域属性。
(3)数据共享但是仅仅缓存在share cache:即多个CPU共用分享一块L2 Cache,并且不会缓存数据到他们本身的L1 Cache里面去,确保L2 Cache的数据永远是一致性的。
(4)软件缓存维护操作:缓存维护操作可以用于操作cache当与其他CPU共享数据时。例如在第一个例子里面,如果CPU0采用write-through方式缓存就可以避免上面第一个例子的一致性问题;而对于第二个例子的一致性问题,如果CPU1执行缓存维护操作是使其本身的cache位置数据无效,那么就会去L2 Cache读取到正确的数据。也就是说可以通过软件方式执行invalidate operations跟barrier operations来规避一致性的问题。
(5)硬件一致性:CPU与本身L1 Cache之间增加一致性逻辑,通过执行适当的缓存操作来确保与其他CPU共享数据的一致性。一般来说在多核CPU里面都会有一致性逻辑电路cluste来共享核与核之间数据。在Contex-R5里面没有提供MP-cluster的一致性电路,只是简单提供了一致性的ACP接口。

MESI/MEOSI Protocol

MESI/MEOSI是现在一种使用广泛的协议,用来维护多核Cache一致性。我们可以将MESI看做是状态机。cache contronal会将每一个cache line进行状态标记,并且维护状态的切换。cache line的状态有M (Modified), O (Owned), E (Exclusive), S (Shared) or I (Invalid)。
1、Modified :代表当前Cache行的数据是修改过的(Dirty),并且只在当前CPU的Cache中是修改过的;此时该Cache line的数据与其他Cache中的数据不同,与内存中该行的数据也不同。
2、Owned:指示当前cache line的数据是dirty并且有可能其他CPU的cache也有。但是只有当前的这个CPU可以保持这个状态Owned,其他CPU只能显示为shared状态。
3、Exclusive:代表当前Cache line的数据是有效数据,其他CPU的Cache中没有这行数据;并且当前Cache line数据与内存中的数据相同。
4、Shared:代表多个CPU的Cache中均缓存有这行数据,并且Cache中的数据与内存中的数据一致;
5、Invalid:表示当前Cache line中的数据无效;
其中Owned是在MEOSI Protocal特有的,在ARM的CPU体系里面,Cortex-A9等系列用的就是MESI Protocal。这里讲基础的MESI Protocal为例。下图为MESI协议的状态机切换图:

继续以上面的问题(1)为例与这个MESI Protocal状态机结合做讲解:
(1)当CPU0采用write-back写数据到L2 Cache的地址Q,数据被缓存到CPU0的L1 Cache,此时L2 Cache还没有缓存到地址Q数据,所以cache控制器标记此cache line状态为Modified 。Modified 代表cache line对应的数据仅在数据只在CPU0的L1 Cache之中,并且其cache中的内容与L2 Cache的内容不一致。
(2)然后CPU1请求读地址Q数据之前,并发送消息给CPU0,发现数据被缓存到CPU1的L1 Cache。然后cache控制器将数据从CPU0 Cache传输到L2 Cache再返回给CPU1。此时CPU0和CPU1同时缓存地址Q数据,此时cache line状态从Modified 切换到Shared状态。Shared代表cache line对应的数据在"多"个CPU私有Cache中被缓存,并且其在缓存中的内容与主存的内容一致。
(3)CPU0继续写修改地址Q数据,发现地址Q内容所在cache line状态是Shared。CPU0发出invalid消息传递到其他CPU,这里是CPU1。CPU1接收到invalid消息。将地址Q所在的cache line置为Invalid状态。Invalid状态表示表明当前cache line无效。然后CPU0收到CPU1已经invalid的消息,修改地址Q所在的cache line中数据。并再次更新cache line状态为Modified。
(4)如果CPU0继续修改地址Q数据,此时发现其对应的cache line的状态是Modified。因此CPU0不需要向其他CPU发送消息,直接更新数据即可。

summary

多核CPU的Cache一致性是在CPU内部做硬件电路设计来保证,对软件来说是透明的。另外,现在CPU硬件采用的一致性协议一般是MESI协议的改进版MEOSI协议。例如最新ARM64架构采用的MOESI Protocol。多一种Owned状态。而多出来的状态也是为了更好的优化性能。

CPU一致性的解决办法相关推荐

  1. Windows10资源管理器占用CPU过高解决办法,非常有效

    使用下面两种方法后Windows10 资源管理器占用 CPU 依旧过高.Windows10资源管理器占用CPU过高解决办法_我欲修仙-CSDN博客_windows资源管理器内存占用过高 win10电脑 ...

  2. 谷歌浏览器占CPU非常高的解决办法

    谷歌Chrome浏览器是一款热门的浏览器,但是有用户在发现每次打开谷歌浏览器占用CPU非常高,其中还有个software reporter tool都会跟随谷歌浏览器的打开占用越来越高的CPU,有什么 ...

  3. Windows10资源管理器占用CPU过高解决办法

    升级 win10后,发现每次开机后发现CPU一下子就用了80% - 90%多,CPU占用过高一方面产热高,另一方面会导致系统速度变慢,这才是最让人难以忍受的地方.小编试过很多方法,最后才解决这个问题, ...

  4. Win7 svchost.exe LOCAL_SERVICE占用CPU高的解决办法

    使用环境(蓝色粗体字为特别注意内容) 1.软件环境:Windows7 32 bit 旗舰版 2.参考文献:①http://blog.sina.com.cn/s/blog_7bf0c30f0100sk2 ...

  5. eclipse打开js等文件CPU卡爆解决办法

    eclipse打开js等文件CPU卡爆有效解决办法: 修改eclipse.ini文件中的eclipse参数

  6. Glide 加载Gif 导致cpu居高不下的解决办法

    最近抽空整理成了Module方式 GitHub地址 GlideGifLibs 最近由于要所有图片上支持gif的展示,结果在界面上显示3张gif图后cpu飙升到了90%,一会手机就烫手了.想了很多种办法 ...

  7. 分布式事务一致性的解决办法

    分布式事务:如何保证多个系统间的数据是一致的?_腾讯新闻 (qq.com) 面试必问:分布式事务六种解决方案 - 知乎 (zhihu.com) 强一致性事务 1.2pc 第一阶段:准备阶段,协调者会给 ...

  8. VirtualBox 安装 Linux时 报错This kernel requires an X86-64 CPU,but only detected an i686 CPU错误的解决办法

    问题场景: 在自己的笔记本pc(64bit)上安装virtualbox 安装过程出现错误:This kernel requires an X86-64 CPU,but only detected an ...

  9. cpu占用100_Java项目服务器cpu占用100%解决办法

    1.使用命令top查看cpu进程,发现tomcat占用cpu使用率过高 可以看到服务器负载很高,tomcat CPU使用已达到接近300%,内存20%. 2.把进程的栈dump到文件里,以便后面的分析 ...

最新文章

  1. solr mysql 导入命令_(solr系列:四)将mysql数据库中的数据导入到solr中及删除solr中导入的数据...
  2. SignalR集成Autofac
  3. gdb+pwndbg使用初探
  4. java利用poi读取excel_java利用POI 读取EXCEL
  5. php ajax mysql 出错,php – 从mysql切换到mysqli后,Ajax的更新语句不能正常工作,但没有错误显示...
  6. 7-42 整型关键字的散列映射 (25 分)(思路加详解)兄弟们 来呀 写题呀
  7. [C#]自定义鼠标样式
  8. 认识和学习orchestrator之基本使用篇
  9. 【取词翻译软件】CopyTranslator(deepin20可用的复制即翻译的外文辅助阅读方案)
  10. 软件测试工程师企业级培训视频教程
  11. ★【博弈论】【贝蒂定理】取棋子游戏
  12. function函数封装
  13. Screw 整合Oracle 报错异常信息oracle.jdbc.driver.T4CConnection.isValid(I)Z
  14. 科技楼里面有三间计算机教室,中学计算机网络教室管理工作总结
  15. java实现文件夹的上传和下载
  16. Python 罗德里格矩阵的空间坐标转换——两组公共点求所属坐标系的旋转矩阵与平移矩阵
  17. 两张显卡在win10上如何使用
  18. Echarts + Web实现大屏展示效果
  19. 相对基址加变址寻址方式
  20. 安卓android按宽/高缩放图片到指定大小并进行裁剪得到中间部分图片

热门文章

  1. 面试总结:京东现场面试0917
  2. 用wampserver搭建html网站,网站搭建软件WampServer安装与常用基本配置介绍
  3. 中职计算机组装与维护课程标准,《计算机组装与维护》课程标准-20210412161624.pdf-原创力文档...
  4. VSO Downloader下载工具vso_downloader_setup.exe
  5. JAVA面向对象----封装
  6. 防扫描配置与弱口令利用,检测和防御
  7. c语言包头文件bts,c – 使用bts汇编指令和gcc编译器
  8. pytorch:DCGAN生成动漫头像
  9. el-upload使用http-request自定义上传和进度条实战
  10. 图解 6 种「树」,你心中有数吗。。。