CPU流水线

从之前的了解到我们执行一条指令需要如下步骤:

  1. 取址 (IF) 取出指令
  2. 译码 (ID) 将指令解析成二进制
  3. 执行 (EX)在取指令和指令译码阶段之后,接着进入执行指令
  4. 访存 (MEM)根据指令需要,有可能要访问主存,读取操作数
  5. 写回 (WB)执行指令阶段的运行结果数据“写回”到某种存储形式

为了解释流水线的这个问题。

我们先假设一个业务场景,淘宝购物。

如果一个用户去购买一个商品,然后第二个用户去排队等待第一个用户去完成订单。这样的场景显而易见的效率慢,那么我们就想出,如果每一个阶段执行完成,去通知下一个阶段去执行就行,我就去处理下一个用户的订单了。那么这样效率就提升上来了,这样我通知下一个阶段的的信息就需要一个地方存储。这个中间件就是消息中心,我把信息放到消息中心里,我当前阶段的任务已经完成了,下一个阶段是谁我不管了,谁需要这个数据就去消息盒子里面拿,即如下图:

每个阶段根据订单状态取到自己想要的数据,并处理完成再放回到消息盒子中。

那么在CPU中,如果这个五个阶段需要解耦实现流水线。那中间也需要一个介质来帮他存储消息。

而这个介质就是 锁存器。

在手册中我们还注意到奔腾处理器增加了一级缓存。提高访存速度。

但是这里就有一个问题,本来主存就是为了加速访问磁盘,但是CPU和主存的速度依旧不匹配,为了加快速度,这里又给主存缓存了一波数据即为一级缓存。

而on-chip 是 CPU的一个核心处理器。

这个时候就有个问题,如果一个CPU有两个核心,每一个核心都有自己的一级缓存,那么当一个 on-chip 使缓存的数据发生了变化,但是另一个 on-chip 不知道上一个 on-chip 已经将数据进行了修改,这个时候就出现了数据不一致的问题,而后我们看文档得知他是实现了 MESI。

MESI协议标准:这个标准叫缓冲一致性协议。

这里其实有两种实现方案:

  1. 双写:当一个核心修改了缓存的数据,我将自己的一级缓存的数据进行修改,并且将主存的数据也进行修改。这样保证数据一致。
  2. 写回:我只将我的一级缓存进行数据更新,剩下的刷新主存的数据,由另一个机制(MESI)将数据写回到主存中。而写回又有两种方式:
    1. 我刷新数据的时候,去通知另一个核,当前数据已经修改了,需要新的数据请到主存中重新获取。
    2. 由于MESI的统一管理,当一个核心对数据进行了修改,而另一个核心这时候需要对数据进行访问,这个时候MESI知道该数据是一个无效状态,这个时候就通知修改这数据的核将这个数据写回到主存中,另一个核再将这个数据加载回去。

那么这里就需要一个东西来实现这个沟通,这个东西就叫 Ring Bus 环形总线。

名词解释:

I-Cache:缓存指令

D-Cache:缓存数据

直写 write-through:双写

写回 write-back:只负责写到缓存中,由某个时机写回到主存中

on-chip branch table:分支预测器

APIC (8259A) : 高性能中断控制器

dual processor :一个芯片上封装多个处理器

MMX:单指令多数据流 (一个指令带多个数据并行计算)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值