Java硬件基础(一)-高速缓存模型及MESI协议

     Java硬件基础:

    (一)、高速缓存模型及MESI协议

    (二)、处理器针对消息交互的性能优化及带来的并发问题

    (三)、如何解决并发问题及volatile、synchronized等关键字实现

 

    本文主要讲解多线程程序的硬件基础,后期将介绍volatile、synchronized等关键字实现。我们所对应的多线程在硬件层面即多核处理器并发处理的一种情况,那么在并发编程情况下对共享变量进行操作时必定需要考虑并发安全问题,这个大家肯定都有所了解,但是底层如何实现,更值得我们去关注。

一、高速缓存模型

                                          

    上图所示:Processor0、Processor1分别代表两个处理器;cache是每个处理器中都存在一个,即高速缓存;DRAM代表共享内存(这边的共享内存大家可以去思考这一块具体是什么,我理解为jvm内存以及堆外内存,如果理解错误请大家指出);上图中的黑色加粗线我们称为总线,Processor0、Processor1、DRAM之间的信息交互即通过该总线。

    设计高速缓存的原因相信很多人从其他的缓存设计中能够体会出来,主要针对处理器Processor0、Processor1处理速度与DRAM处理 速度不匹配的问题,处理器Processor0、Processor1处理速度远远高于DRAM。

二、高速缓存Cache模型

                             

    上图所示的即cache的内部结构,大家可以看到存储结构类似hashmap,我们从共享内存DRAM中读取的数据就是存储在缓存条目中。缓存条目主要包含三个信息:Data Block(数据区,称为缓存行)、Tag(主要存储对应缓存行的内存地址,该内存地址在处理器读取进来之后会进行内存地址解码,确定相应的桶以及在该桶下的偏移量)、Flag(表示相应缓存行的状态,后面讲解的MESI协议将介绍)

    相信大家看完高速缓存一定会想会不会高速缓存也存在不同类型,那是当然,处理器存在不同类型的高速缓存,其相应的处理速度都不同,我个人认为就是作为一个缓冲区吧,比如一个人跑步,都是慢慢提升速度,不是一次性提升起来的。

三、缓存一致性协议(MESI

    本章讲解多线程情况下多个处理器是如何交互,如何实现变量的共享。MESI代表者四种状态,即上文缓存行的状态Flag,更直接的说就是:对应的处理器高速缓存中所缓存的共享变量的状态,下面通过定义以及实例详细介绍,大家就明白了:

    MESI是由4个单词组成:

    Modified(更改过的,M):该状态表示相应缓存行包含对应内存地址所做的更新结果数据,对于多个处理器中存在该更新值的不同缓存条目,只允许存在一个处于该状态

    Exclusive(独占的,E):该状态表示相应缓存行包含对应内存地址所对应的缓存副本数据,该状态所代表的值在其他缓存条目中都不存在副本

    Shared(共享的,S):该状态表示相应缓存行包含对应内存地址所对应的缓存副本数据,该状态所代表的值在其他缓存条目中可能存在副本

    Invalid(无效的,I):该状态表示相应缓存行包含对应内存地址所对应的缓存副本数据是无效的

    以上对应缓存行的状态,MESI协议还定义了一组消息用于处理器之间的信息交互:

消息名

消息类型

描述

Read

请求

通知其他处理器、共享内存处理器准备读取某个数据,消息中包含内存地址

Read Response

响应

返回被请求读取的数据,可能是共享内存提供的,也可能是其他缓存条目提供的,默认情况下先去读取其他缓存条目,如果不存在即去共享内存

Invalidate

请求

通知其他处理器将相应的高速缓存中相同内存地址的数据Flag置为无效I

Invalidate Acknowledge

响应

接收到无效消息I回复,并将该数据置为无效I

Read Invalidate

请求

该消息由Read、Invalidate组合而成,主要作用用于通知其他处理器当前处理器准备更新数据,请求其他处理器将相应的缓存数据置为无效I

Writeback

请求

主要包含写入共享内存的数据以及对应的内存地址

 

    通过以上的概念介绍,相信大家由一定的了解,下面通过实例介绍:

    1、MESI实现读操作:

            

    Processor0: 若该处理器需要读取某个内存地址的值,因为当前状态为无效的I,因此需要发送Read消息,因为默认先从其他处理器的缓存条目中查找,此时Processor1中存在,则回复Read Response消息,Processor0在接收到消息之后更新状态为 S

    2、MESI实现写操作: 

          

    场景1:    

     Processor0此时读取的状态的S,即多个处理器的缓存中都存在该变量的副本数据,需要先通知其他处理器本处理器需要更新变量,此时发送Invalidate消息给其他处理器,Processor1接收到Invalidate删除副本数据并回复Invalidate Ack,Processor0接收到Invalidate Ack消息先更新变量状态为E(独占),此时便可将新数据写入缓存条目,并更新状态为M

    场景2:

     Processor0此时读取的状态的I,因为是无效状态,所以需要先读取数据再更新数据,因为发送Read Invalidate消息(读消息,无效消息),等待收到Read Response和Invalidate Ack消息,此时才能更新数据。

 

结束语:

    本文主要介绍高速缓存的基本模型以及MESI协议,阐述多处理器之间如何消息交互,下面将讲述该处理方式的性能优化以及性能优化之后带来的并发问题。

    谢谢大家阅读,请大家多多指教文章中的不足,互相学习!!

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值