计算机组成原理5——存储器3

本系列文章是学习了网课《哈尔滨工业大学–计算机组成原理》之后,用以梳理思路而整理的听课笔记及相关思维拓展。本文涉及到的观点均为个人观点,如有不同意见,欢迎在评论区讨论。

高速缓冲存储器

为了解决CPU速度和内存读取速度不匹配的问题(内存速度太慢,会造成CPU空等),在CPU和内存之间加入了高速存储缓冲器结构,以缓解这种不匹配。

主存的速度提高始终跟不上CPU的发展,CPU速度平均每年改进60%,而主存的动态RAM平均每年改进7%,这造成动态RAM和CPU的速度平均每年差距增大50%,希望CPU和主存之间加入高速缓存Cache来解决速度不匹配的问题。

另外,在多体并行存储系统中,IO设备向主存请求的级别高于CPU访存,会出现CPU等待IO设备访存的情况,因此在CPU与主存之间加入一级缓存,主存将CPU要取的数据提前送至缓存,当主存与IO设备交换时,CPU可以直接从缓存中读取数据,不必空等而影响效率。

Cache的出现使得CPU可以不直接访问主存,而是与高速Cache交换信息,因为程序运行的局部性,将短时间内CPU用到的程序和数据放置在Cache中即可。

Cache、主存存储空间的基本结构

主存由 2 n 2^n 2n个可编址的字组成,每个字有自己唯一的n位地址。
为了和Cache映射。将主存分成字块,每个字块包含若干字:高m位表示主存的块地址,低b位表示块内地址,每个字块 2 b 2^b 2b个字(即块的大小)。

缓存没那么大,比主存的字卡ui数量要少得多,只有 2 m 2^m 2m个字块,每个字块 2 b 2^b 2b个字(即块的大小)。

在任意时刻,都有一些主存块在缓存块中,当CPU想读取主存的某个字时,有两种可能,第一种,需要的字已经在缓存中了,CPU直接访问Cache中的指定位置即可,这种情况叫做Cache命中;第二种,缓存中没有,那么就把该字所在的主存的整个字块一次调入Cache中,第二种情况叫做Cache不命中

缓存块不会一直只放一个主存块,因此其中会标记对应哪一个主存块,当CPU读取信息时,主存块的高m位与缓存块的标记进行比较,以此判断缓存是否命中,标记的内容相当于主存块的编号。
在这里插入图片描述

Cache命中率:
h = N c N c + N m h = \frac{N_c}{N_c+N_m} h=Nc+NmNc
N c N_c Nc为访问Cache的总命中次数, N m N_m Nm为访问主存的总次数。

Cache-主存的平均访问时间:
t a = h t c + ( 1 − h ) t m t_a = ht_c+(1-h)t_m ta=htc+(1h)tm
t c t_c tc为命中时的Cache访问时间, t m t_m tm为未命中时的主存访问时间,1-h表示未命中率。

Cache的容量和块长对命中率的影响:
1、Cache容量,一般来说,Cache容量越大,CPU的命中率就越高;但是当容量到达一定值时,命中率的提高速度就会变慢。
2、Cache块长,块长与命中率的关系取决于各程序的局部特性,一般来说,被访问的字附近,近期也可能被访问,因此增大块长,可将附近更多的有用的字装入缓存;但是另一方面,块增大,增加的字其离被访问的字越远,近期被访问的可能性减小。

Cache的基本结构

在这里插入图片描述
Cache存储体:以块为单位与主存交换信息,与主存之间进行信息调动,Cache访存的优先级最高。
地址映射变换机构:将CPU送来的主存地址转换成Cache地址。如果命中了,则CPU可以直接访问Cache存储体,如果没有命中,CPU就访问主存,并替换Cache(如果Cache没有装满,就将主存块调入Cache中;如果已经装满,就采用替换策略)。
替换机构:当Cache满了时,Cache内的替换机构按照替换算法确定从Cache中移出哪个块返回内存,而把新的主存调入Cache。

1、先进先出(First-In-First-Out,FIFO)算法。没有根据访存的局部性原理,不能提高Cache的命中率。
2、近期最少使用算法(Least Recently Used,LRU),需要记录最近的使用情况,命中率比FIFO高。
3、随机法,同样没有用到访存的局部性原理,不能提高Cache的命中率。

Cache的读写操作

读写流程:当CPU发出主存地址后,首先判断该存储字是否在Cache中。
若命中,直接访问Cache,将字送入CPU;
若未命中,一方面要访问主存将该字传入给CPU,与此同时,要将改字所在的主存块装入Cache,如果此时Cache装满,就要执行替换算法,将新的主存块调入。

写操作介绍以下两种方法
1、写直达法,写数据时,既向Cache写入数据也向主存写入数据,保持主存和Cache的数据一致,但是增加了访存次数。
Cache中的数据始终和主存保持一致,在写操作时,既要写入Cache也要写入主存,但是替换时,不必再将Cache中的数据再写入内存,因为数据一直是一致的。
2、写回法,写操作时先只把数据写入Cache而不写入主存,当Cache数据被替换出去的时候才写回主存,所以需要标记Cache块中的数据是否修改过,Cache中每一块都会增设一个标志位,表示是否修改过,没有修改过就不必重新写入内存中。
可以减少主存的写操作次数,但是读操作Cache被更改时需要数据替换,增加了Cache的复杂性。

在这里插入图片描述

Cache-主存地址映射

前面讲到Cache块保存主存中的部分块,也就是映射主存块到Cache中,有以下三种方式。

计组——彻底搞懂cache主存映射以及cache容量的计算:https://blog.csdn.net/vavid317/article/details/110946947

直接映射

每个主存块和缓存块的对应关系如下:

i i i = j j j mod C C C
i是缓存块号,j是主存块号,C是缓存块数。

主存地址高m位被分成两部分:低t位指的是Cache的字块地址,高t位是指主存字块标记
比如CPU送来主存地址,首先根据中间的c位(000···1)判断缓存块位置是Cache字块1,然后对比主存地址的t位标记和缓存中的t位标记是否一致,并且缓存块中的有效位是否为1。
如果有效位是1,表示数据有效,直接根据主存地址中的b位块内地址索引缓存块中的数据即可;
如果有效位是0,表示不符合,会重新替换Cache中的数据并标记。

直接映射,有个问题,一个内存块只对应一个缓冲块,但是一个缓冲块对应几个内存快。如果一直用一个内存块,缓冲区的其它空间得不到充分的应用;另外如果程序同时使用缓冲块对应的其它几个内存块,那么就要一直替换缓冲块,命中率会降低。

在这里插入图片描述

全相联映射

主存的每一个字块映射到Cache中的任何一块位置上。
相较于直接映射,主存标记需要扩充到t+c位(就是合并起来了),但是Cache中的t位标记位需要扩充到t+c位,因为直接映射主存直接就定位到指定的缓存块了,所以缓存块不需要这c位的信息。

全相联时,因为是任意映射,主存地址中需要Cache的块位置,同时缓存块也需要保存这部分信息。我的理解是主存块被缓存一次,也需要保存了缓存块的位置信息,因为缓存块会被其它的主存块占用,不保存相关信息的话,待会儿找不到是哪一个缓存块了;然后也将标记更新到缓存块中,后面内存块再次被调用时,还是会根据上一次的缓存块信息先去检索,和检索到的缓存块中的标记做对比。如果这个缓存块没有被替换,缓存块内的t+c位标记和主存内的t+c位标记会是一样的;否则,就将主存块加载到Cache中。
位数的增多,会造成逻辑电路的复杂,成本较高。

在这里插入图片描述

组相联映射

组相联相当好理解,它是上述两种方法的折中
直接映射太死板,容易造成其它缓存干瞪眼(如果一个内存块被重复调用);全相联太灵活,任意内存块可以对应任意Cache中的块,逻辑麻烦。
那么组相联映射采用一个折中的办法:缓存和主存分组,缓存组与主存组之间直接映射,缓存组中的块和主存组中的块全相联映射。

i = j mod Q(i是缓存的组号,j是主存的组号,Q是Cache分成的组数)
比如,缓存总共有32个字块,分成16组,每个组包含两块;那么内存就按照模16的方式也分成组。
那么内存的0,16,32···,就对应于缓存组0,缓存组0中有两个缓存块供这个内存块使用。
内存的1,17,33···,就对应于缓存组1,缓存组1中有两个缓存块供这个内存块使用。依次类推。
这个组与组之间的对应关系是一定的,是直接映射;但是内存组中的块和缓存组中的块之间的映射是任意的,当内存块需要加载到缓存块中,那个空闲用哪个。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值