MESI学习

MESI学习

一、出现MESI的原因
  1. 计算机模型
    • 目前现有的计算机都是基于–冯诺依曼计算机模型 。等待运行的程序以及数据都是存放在主内存上,在计算的时候,按照程序执行的顺序首先会从主内存中取出数据,然后通过控制器的翻译执行指令的要求,然后在将计算的结果写回内存。一直计算知道程序被执行完成。
    • 在这样的计算机模型中的核心组件
      • 控制器:是整个计算机的控制中心,负责将程序规定的信息进行解释,然后根据要求进行控制,调度程序、数据、地址、协调计算机每一个部分之间的工作
      • 计算器:在接受到控制器的指令对指定的数据进行各种算术运算和逻辑运算,简单来说就是对数据按照指定的需求进行加工处理。
      • 存储器:存储程序、数据和和各种信号以及命令等各种运算所需要的信息。
      • 输入:输入和输出称之为外部设备,输入是将程序、符号等这个信息转换为计算机可以识别的电信号。
      • 输出:和输入一样同属于外部设备,将计算的中间结果或者是最终结果以及在计算机内部的各种数据展出出来。
      • 冯诺依曼计算机模型:在这里插入图片描述
  2. 现代计算机硬件架构
    • 现代计算计算机硬件架构原理图
    • CPU内部划分
      • CPU与主内存进行数据交换的原理图:在这里插入图片描述

      • 控制单元:控制单元是整个CPU的控制中心,由指令寄存器(IR)、指令译码器(ID)、和操作控制器(OC)等组成。控制单元对电脑进行有条不紊的调度保证电脑有序的工作。根据预先编写好的程序,将指令从主内存将指令出来来之后放入到指令寄存器,然后指令译码器分析这个指令是执行何种操作,然后在由控制器按照一定的顺序向对应的部件发出控制信息。

      • 运算单元:对数据进行算数操作和逻辑运算,收到控制单元的控制。也就是运算单元进行的所有的运算都是在操作控制器下的控制下进行的。

      • 存储单元:存储单元包括在CPU内存的缓存一级内部的寄存器组,存放的是等待计算的数据或者是计算数据的最终结果也可能是计算数据的中间结果。CPU访问寄存器所花费时间要不访问内存的时间短很多。由于是在CPU内部的原因,把需要计算的数据缓存在内存存储单元中这样可以有效提高CPU的使用率。

    • 多CPU架构
      • 出现多CPU的原因:

        • 现有单CPU已经不能满足要求。因为假如需要在一个计算机上运行多个多个进程,在单个CPU的计算中就需要设计到进程的切换。为何会出现上下文的切换呢?一个CPU不是可以有多个核心吗?这是因为除了CPU之外其他的外部设备等这些都是共享的,在计算机中进程是资源分配的最小单位,但是在不同的进程之间切换的时候必然需要保存之前的各种信息也就是线程的上下文,这样的代价是非常昂贵的,基于这样的原因就出现了多个CPU架构。
      • 多CPU的架构图:在这里插入图片描述

      • 在多个CPU架构中读取存储器数据的过程

        • CPU首先去寄存器去获取这个值,假如命中这个数就直接获取,没有命中执行如下操作
        • 从L1缓存中去获取这个数据,假如在L1中命中了这个数据,首先会对缓存行进行加锁,获取到数据之后在对数据解锁。没有命中执行如下的操作
        • 从L2缓存中获取这个数据。在L2中命中这个数据,首先也会对缓存行加锁然后将数据从L2复制到L1然后执行上述的两步操作最后解锁。在L2没有命中这个数据的时候从L3中获取这个数。
        • 从L3中获取这个的执行步骤也是和上述的步骤是一样。是不是有点递归的感觉。
        • 最后在L3也没有命中数据才会从主内存中去获取这个数据。从主内存获取数据流程非常复杂简单可以描述如下:通知内存控制器占用总线带宽,通知内存加锁,发起内存读请求, 等待回应,回应数据保存到L3(如果没有就到L2),再从L3/2到L1,再从L1到CPU,之后解 除总线锁定。
      • 上述从主内存获获取数据在单个CPU计算机没有任何问题,但是在多个CPU会出现数据不一致的问题。就拿两个CPU的场景来说。在主内存中存在一个数据x的初始值是0。cpu1和cpu2同时将这个数据拷贝到自己的缓存中然后加一。最后将数据写回主内存。实际上我们期望值是2,但是可能由于某种时序执行问题导致最后的执行结果是一个随机值。出现这样的原因就是CPU1并不知道其他的CPU已经对这个数据修改最终导致计算结果被覆盖。

      • 要解决在多个CPU中数据一致性问题,就引出今天的主角MESI缓存一致性算法。和MESI功能相近的算法有很多如MSI、MOSI、Synapse、Firefly及DragonProtocol。今天主角是MESI那这种算法是如何解决多个CPU缓存一致性问题,以及MESI之间的各个状态是如何转换的请看下文。

二、MESI各个状态之间的转换
  1. 缓存行中缓存是基于四种状态。MESI就是这四种状态的缩写:修改(Modified)、独占(Exclusive)、共享(Shared)和无效(Invalid)。每一种状态的解释如下:

    • 无效:表示的是一个无效状态。需要查询的数据不在缓存或者是在缓存中数据的副本与主内存中数据不一致,因为有处理器已经把主内存中的数据更新。
    • 共享:表示的是共享并且是没有被修改的状态。多个处理器同时把数据从主内存拷贝到缓存中。并未对数据做任何更改。
    • 独占:表示的是独占为被修改状态。这个数据只有一个副本,这个数据在缓存中只存在一个数据副本。
    • 更改:表示的是独占修改状态。内存副本中的数据已经被修改。主内存中的数据已经失效。
  2. 状态转换:在这里插入图片描述

  3. 那在不同的cpu中是如何知道其他的cpu数据已经变化了呢。其实是通过一个总线嗅探机制实现数据变化的监听。当某个变量启用了MESI机制。cpu会监听总线数据变化机制实现数据状态的变化:在这里插入图片描述

  4. 上述状态看似非常完美解决缓存一致性问题,假如我两个CPU同时有处于M状态的变量需要写回内存那咋处理呢。这个时候根据不同的架构设计的CPU会在一个指令周期进行裁决那个时 有效的那个是无效的。至于是如何实现裁决的和具体的硬件建构有关系。

三、MESI可以解决哪些问题
  1. MESI解决了在多个CPU架构下多个线程数据共享时数据一致性问题。实际上只是解决了可见性问题。
四、MESI解决不了哪些问题
  1. MESI这种机制只对单个缓存行可以保证数据可见性。假如数据长度已经超过一个缓存行。MESI就不能保证数据的可见性。那就存在一个问题就是我数据超过一个缓存行那如何处理呢?
  2. 在数据超过一个行存行的时候,那只能采用最古老的方法就是通过锁总线实现多个线程之间数据的可见性。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值