【408】【计算机组成原理】03 存储系统(中)

这篇博客主要讲cache

一、cache的作用

cache是基于程序的局部性原理来设计的,也就是曾经访问的过的数据在未来也有可能被访问,因此不如我们把这些访问过的数据存储起来。但是问题也随之而来,存储多少数据最为合适,以及cache存满了该让谁滚粗cache?众所周知,cpu的一切数据都来自于内存,但是访问内存的时间相当的长,甚至处理数据的时间都远没有从内存中读数据的时间长,所以设计第二个内存的意义不大(没有从根本上减少访问时间)。

因此不如设计一个高速的缓冲专门用来存储那么之前访问过的数据(因为有可能再次被访问)。cache在cpu内部,因此cache的容量不可能大。cache主要考虑两个方面的问题:怎么找到想要的数据,怎么移除大概率没用的数据。而这两个问题要和之后学到的页表、快表对比学习(一定要注意cache和页表、快表是两个层面的硬件处理的问题是不一样的,但是处理问题的方法是相通的)。

二、cache的工作流程

铺垫了这么多,该讲讲cache如何工作的。首先要回答一个问题,什么时候要访问cache?(同义句就是什么时候要访存!)

首先,在获取要指令的指令时要访存。cpu根据PC读取指令时,要根据PC(PC里存放的是指令存放在内存中的地址,不是指令本身)去读取要执行的指令(这里要注意PC里存放的其实是虚拟地址,要根据页表转化为物理地址,再根据物理地址去寻找)。这里要注意,有的机器在拿到地址后会同时去访问cache与内存,有的机器是先访问cache再访问内存(考研默认后者)。cpu将虚拟地址解析为物理地址后,将物理地址分为几个部分:tag+组号(或者是块号,如果是全相联映射就没有这部分)+块内偏移量。下面按照先访问cache再访问内存的方式讲解。

在匹配cache内容时,会先根据组号(或者是块号,如果是全相联映射就遍历整个cache去找匹配的tag)找到某个具体的cache块,再看看这个块中的有效位是否为1同时tag是否完全匹配。如果均满足,那么就命中数据,cpu直接读取cache行中的数据,如果未命中就去读取内存。

其次,在读取一般的数据时要访问内存(比如访问数组的某个数据),这种情况和读取指令是完全一样,指令对于cpu来说也是数据。

第三,在修改数据后想要写数据也要访存(比如修改数组中的某个数据),这个时候要先去根据数据的地址先找到这个数据的位置(找的方式与上面讲的一致),只不过写的方式比较特殊,因为cache里的数据是内存中的副本,为了让数据一致,cache与内存的数据都要修改,只是修改的时间不太一致。分为直写法(同时修改内存与cache)与回写法(等会修改内存中的数据,先修改cache,要注意回写法中要增加一位“脏位”用于表示哪些数据修改过了,之后一起将修改的数据写入内存)。

三、cache映射(以下内容全部都考过,如果有你没见过的可以去看考研真题)

了解完cache的整体工作流程之后,接下来具体到细节。cache的映射规则分为三种全相联映射、直接映射、组相联映射。

提示:一定要看好按照什么方式编址,是否为字节!

名词解释:cache行包含了 tag字段+有效位1位(无论题目是否明确说明都要有)+数据块(如64B的块大小有64*8位)+替换算法位(取决于用何种替换算法,一般要题目明确说明了替换算法才考虑,一般都是LRU替换算法)+1位脏位(明确说明了回写法时才考虑)

全相联映射:就是数据可以随便放,物理地址会被划分为tag+块内偏移量。块内偏移量的位数如何确定呢?直接找一个cache块的大小,如一个块的大小为64B,按字节编址,那么块内偏移量为6位(2^{6}B),这个方法在其他映射中是一样的。

直接映射:每个数据存放的位置是固定的。物理地址会被解析为:tag+块号+块内偏移量。在考虑块号字段时,要先去除块内偏移量再数最低的几位。如物理地址 11110 001 11001 ,块大小为32B,cache中有8个块,按照字节编址 ,因此后5位为块内偏移量,中间3位(001)为块号,剩下的就是tag位。

组相联映射:多个cache块会在逻辑上变为一个组,组内按照全相联映射的方式存放。物理地址的划分:tag+组号+块内偏移量。由于组内是全相联映射,因此确定了某个地址所在的组后要遍历组内所有tag,去找匹配的块。如果一个组内有K个块,叫这种组相联为k路组相联映射,同时k路组相联映射对应着k个比较器(比较器是去比较tag字段是否匹配的)。组号的确定方式与上面直接映射的确定方式是一样的,看cache中有几个组。

提示:

1.题目中 若说cache数据区容量为64MB,一个cache块为64B,那么可以得出一共有64MB/64B=1M个块,假如题目又说明了为2路组相联,那么将1M/2=0.5M个组,之后就可以划分地址了。

2.cache块的大小与内存块大小一般是一致的,一定要注意如果不一致会出现什么情况!如果cache块小与内存块,那么一个内存块的数据会被放到多个cache块,不能充分利用程序的局部性来提高效率。如果cache块大与内存块,那么会造成资源浪费,使得cache的data字段有些部分没有被利用到。

3.cache块、内存块、页、页框的区别:cache块与内存块是一个体系。页大小与页框大小是一个体系。一定要注意页大小与cache块大小实际上没有必然联系,只是为了简便计算有的题目会让这两个体系在数值上相同。页大小是指一个虚拟页的大小,页框是针对内存的实际物理内存一个块的大小。cache与内存、虚拟页系统与内存的交换都是以块为单位,但是这个块是独立在两个体系之中的块,要注意区分。

今天就先写到这里,明天再继续。

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值