高速缓冲存储器(Cache)

2018-1-4

首先我们得知道,为什么会出现Cache?
是为了解决CPU与主存速度不匹配的问题。

其次,Cache主要是由高速的静态RAM组成的,价格较贵,容量较小。

还有,我们是如何使用Cache的?
根据局部性原理可以知道,CPU在执行某段程序的时候,他的访存是具有相对的局部性的,也就是说,大部分都是顺序执行或者说是循环执行。那么我们只要将CPU近期会使用到的程序和数据放在Cache中即可,那么CPU就可以实现在某一时间段内只访问速度较快的Cache,从而加快了速度。
当CPU想要读取主存中某个字的时候,他会先去Cache中寻找,如果它所需要的字已经在Cache里了,便可直接访问Cache(Cache与CPU之间通常每次只传送一个字),但是如果他想要的字并不在Cache中,那么他会将主存中那个字对应的一整个字块一次调入Cache中(Cache与主存之间通常每次传送一个字块)。如何该字块已经调入Cache块中,那么我们称主存块与缓存块建立了 对应关系。

再说一下基本结构示意图:
我们假设主存共有2^n个可编址的字,那么我们可以得到,主存地址一共有n位。
假设我们将主存的低b位作为块内地址,那么表明我们每一块有2^b个字。
那么剩下的n-b=m位就作为了主存块号,主存一共有2^m个块。
对于Cache而言,他每一块的大小和主存是保持一致的,所以他的块内地址的位数也是b位,每块的大小也是2^b个字。
假设他的缓存块号为c位,那么他一共有2^c个块。他的大小是远小于主存的块数的。

还有,根据我们的分析可知,一个缓存块不可能永久的只放那一个主存块(那么有的主存块岂不是无处可放),言外之意就是说,每一个缓存块位置上的主存块是不唯一的,所以我们的缓存块需要一个标记来标记是哪一个主存块放在了这里,这样我们每次需要根据标记来判断该缓存块中的内容。

接着我们再说一下几个比较重要的指标吧!
1.命中率:
h=Cache总命中次数/(Cache总命中次数+访问主存的总次数)
其中他们两个的和就表示我们对数据访问的总次数。
2.Cache-主存系统平均访问时间:
1-h为未命中率
t=h*(命中时访问Cache的时间)+(1-h)*(未命中时访问主存的时间)
3.Cache-主存系统访问效率
e=命中时访问Cache的时间/平均访问时间*100%

最后,我想说的是Cache-主存地址映射。
CPU给出一个他想要访问的主存地址,我们将他映射到对应的缓存块,进而判断是否命中了。
由主存地址映射到缓存地址叫做地址映射。
通常有三种方式:直接映射,全相联映射,组相联映射。
1.直接映射:
首先,我们将主存地址分成了三个部分:
t+c+b,其中b我们在上面已经有提到 ,就是用这b位地址作为块内地址,t+c=m在上面是主存块号,在这里:
i=jmod(2^c),其中2^c表示缓存块号,j表示主存块号,i表示对应的缓存块号,那么我们可以得到,主存里面的0,2^c,2^(c+1)……对应缓存里的第0块,主存里面的1,2^c+1,2^(c+1)+1……对应缓存里的第1块,我们根据中间的c位确定缓存块,剩下的t位就作为主存字块标记了,我们根据缓存里对应的标记与这里的t位进行比较,看是否在里面即可。
缺点是不够灵活,每个主存块必须对应某个缓存块。
2.全相联映射:
这就厉害了,主存中的每一字块可以映射到Cache中的任意位置,这样利用率比较高,但是我们的主存字块标记从t位增加到了t+c位,而且逻辑电路也比较复杂,成本比较高。
3.组相联映射:
我们增加了组这个概念。
这是一种折中,概括的说,就是从组间来说是直接映射,从组内来说是全相联映射。
假设我们一组内有两块,那么我们只需要r=1位就可以标记是组内的哪一块了(2^1=2),b还是原来的b,但是,对于Cache而言,他原来共需要2^c个地址,现在我们只需要有2^(c-1)个地址即可(因为我们两个块排成了一组也就是一排),我们使用c-r位作为组地址,根据这个找到对应的组,然后我们再根据t+r位的主存字块标记来判断该块是否是缓存中的字块,一组中某一字块的位置是随便放的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值