【计算机组成原理】层次存储结构(一)


前言

最近在阅读《计算机组成与设计 硬件/软件接口(原书第5版)》这本书,它的讲解由浅入深,对计算机底层的硬软件进行了详细介绍,内容清晰且层次分明,是可以反复阅读的计算机书籍。

注意:这一版的《计算机组成与设计》是基于目前最火的开源指令集RISC-V编写的,也是与时俱进了。

本文的内容是阅读该书第5章——大而快:层次化存储 后,自己的简单记录,希望大家在阅读后能对计算机存储层次有初步的理解。


一、缓存Cache的基本概念

缓存是处于寄存器与内存之间的一层存储。

指令执行时需要从内存中读取或向内存写入数据(即流水线中的“访存”),这一过程需要耗费几十上百的时钟周期,为了加快存取数据的速度,引入缓存的概念。

缓存中存放内存的一部分数据,执行指令时先在缓存中查找,若缓存中有所需地址的数据(称为“命中”,同时把在cache中未找到目标块称为“失效”),就直接从缓存中读取即可。

缓存的读写速度很快,因此能提高速度。我们将地址连续的内存数据分成很多小块,向缓存中存放时以块为单位。

内存数据映射到缓存中的方式有三种,分别是直接映射、组相联和全相联。

1、 直接映射

直接映射是指内存中每个地址数据在缓存中都有唯一的存放位置,映射方式如下:

在这里插入图片描述

我们将上面取余的结果称为缓存的索引(即index),每个块都能找到确定的index存放。

但是当两个块地址的低几位相同时,就会出现这两个块地址映射的index相同的情况,这时就要在缓存中增加标签tag来区分当前的index中存放的到底是哪个块数据。这个tag其实就是块地址中未用于index的高几位地址,比如上图中块地址的前两位就是该块的tag。

为了方便指示cache中某块是否存有有效数据,我们给每个块增加一个有效位(valid)。当有效位显示无效时,就认为缓存的该块中没有数据(即前文所说的“失效”),进而会从内存中找到对应数据放过来。

index,tag,data和valid就是缓存中的核心内容

Cache的整体结构如下图所示,地址是64位,一个数据块中有32bit数据,即有四个字节,因此用地址的最低两位用来指示块中的字节偏移。index则用了地址中的第 2 − 11 2-11 211位这10bit,因此这个cache中有1024个数据块(即1024行)。

前文介绍了tag的作用是指示该数据块中存放的具体是哪个地址的块,因此其tag是除了index与块内偏移之外的其他地址位,即64位地址中的第 12 − 63 12-63 1263位这52bit。

Data这一列用于存放块内的数据:
在这里插入图片描述

这里插一句:计算机中一个地址只存储一个字节(8 bits),一个块中会存储连续几个地址的数据,而在读取数据时都是按块读取的,所以一次会读出多个字节,一般情况下RISC-V可以使用不同的指令来读出一个双字或一个字或一个字节(1字=4字节)。上图中一个块的数据大小就是1字。

Cache的命名规范中只考虑数据的大小,而不考虑valid、tag所占空间。比如上图中的cache的命名是4KiB cache( 2 10 × 2 2 2^{10}×2^2 210×22 Byte)。

2、组相联

为了降低失效率(具体为何能降低参看原书),提出了新的内存到cache的映射方式,即组相联。组相联是将cache中的块分组,给每个组一个编号index,在映射内存地址时按照直接映射的方式计算,将内存中一个块映射到cache中的对应组中,但是块在组内的位置是任意的,即内存块的组号为:
在这里插入图片描述

将每个数据块有n个位置可放置的组相联称为n路组相联。

这样的方式导致在cache中查找某块时,需要用该块的tag在对应组内和每个位置的tag进行比较,为了减少比较时间,一般会为每个cache表项配置一个比较器,以实现并行比较,但增加了硬件开销。

3、全相联

全相联是一种特殊的组相联,它将一个cache分成一个组,每个内存块都可以放在cache的任意位置。因此在找块时,需要将目标块的tag与cache中每个表项的tag都比较一遍,这样硬件开销会更大,但能降低失效率。直接映射也是一种特殊的组相联,相当于每个组中只有一个表项。三种映射方式对比如下:

在这里插入图片描述

二、分级cache

这里对分级缓存不做过多介绍,大家可以在网上搜相关文章,也有很多~

为了减少失效损失,通常会使用分级cache,即常见的L1 cache、L2 cache、L3 cache。

2级缓存更关注降低失效率,因此比1级缓存的块更大,且相联度更高;1级缓存更关注减小失效损失,因此缓存块较小。访问时,前一级缓存失效就会访问后一级缓存,如果最后一级缓存还是失效才会访问内存交换数据块。

三、写数据的两种策略

我们有时需要向内存写入数据,由于缓存的存在,我们对数据的修改都会先写到缓存中,之后再以某种方式更新内存中对应块的数据。一般有两种策略:

  1. 写穿透:即在修改cache中数据时,同时修改内存中的对应数据。为提高效率,会使用写缓冲来存放等待被写入内存的数据。数据写入cache时同时写入写缓冲,再从写缓冲向内存写入数据。
  2. 写回:即在数据写入时先只写入cache,直到cache中的块被交换出去时,才把这个块的数据写入内存。

请大家记住这两种策略的概念,在内存管理中很重要!

四、cache的两种类型

I-cache用来缓存指令,D-cache用来缓存数据。


总结

本文主要介绍了层次存储结构中缓存的的基本概念,相关文章的链接如下:

【计算机组成原理】流水线式指令执行

【计算机组成原理】层次存储结构(二)

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值