存储器(五)

来源:互联网 发布:永恒之塔3.0数据库 编辑:程序博客网 时间:2024/05/18 03:57

1,为什么要使用Cache?

这些年存储器存储容量虽然增长的非常快速, 但是访问速度却增长的却没有CPU那么明显;而CPU执行的指令和数据都来自于内存, 结果也要保存到内存当中去,如果存储器的速度很慢CPU再快也无法提高电脑速度, CPU得不到需要的指令和数据就只能“空等”, Cache就是解决这种问题的方法之一;

在CPU与主存之间加入一级Cache, 将主存中经常用到的数据和指令放在Cache中, 由于Cache的高速性就可以提高CPU与主存之间交换数据的时间。 要达到这点就要使用程序的局部性原理;

程序的局部性原理包含两方面:一方面是时间的局部性原理,意思是当前正在使用的数据和指令将来也会使用到, 那么这些指令和数据就应该放在Cache里面; 将来再次使用时就直接从Cache中取出来。 另一方面是空间局部性:当前正在使用的数据和指令旁边的数据和指令将来也可能会使用到; 因此需要将当前使用的数据和指令以及旁边的数据和指令都放在Cache里面去。 这样可以看出数据交换的最小单位是块, 这个块有多大需要根据实验得到。


2,Cache的工作原理

(1)主存与Cache的编址

将主存和Cache的存储空间进行分块, 主存一共M块, Cache一共C块, 显然 M>>C。 主存与Cache的地址都为块号+块内地址。

由于Cache与主存数据交换的最小单位是块, 所以快内地址是不变的。注意到Cache旁边有一个“标记”, 这个“标记”是干嘛的呢?

“标记”里面是用来保存主存的块号的, CPU如果从主存里面取数据发送的是主存的地址, 那怎么判断Cache里面有没有CPU需要的

东西呢? 就是通过“标记”来判断的, 如果CPU取主存里面某块地址的数据, 而Cache里面恰好有这块的内容并且这个Cache块是有效

的, 那么就可以直接从Cache里面访问这些信息, 这样可以提高速度。 注意Cache - 主存这个层次里面是按块来进行存储的,按块来

进行访问的, 块的大小相同。

(2)命中与未命中

前面已经说到过主存里面的块是远远大于Cache里面的块的, 如果Cache恰好存在CPU需要的指令或者数据, 那么称为命中。

反之则为未命中。 如果命中了, Cache就和主存建立了一种对应关系, 这种对应关系就可以利用“标记”来进行标识, 用“标记”记录

与某Cache块建立对应关系的主存块号。由此可见, Cache的命中率非常重要, 因为如果Cache命中了, 那么CPU与主存之间访问的

速度就会大大加快。


(3)Cache命中率

Cache命中率与许多因素有关, 这里主要介绍两个; 一个是存储容量, 一个是块长。 对于存储容量, 如果Cache的容量与主存一样大, 那么CPU需要的指令与数据都可以在Cache里面找到, 这样就可以大大提高速度, 但是这个是不可能的。 对于块长, 如果块长过短, 那么CPU还没执行几条指令这一块就用完了, 就需要再去主存里面取下一条指令, 所以这样不行 ,当然块长太长也不行, 过长那么Cache里面存放的块就会过少, 命中率也会降低。一般块取 4 - 6 个字。实际上块长与一个存取周期从主存中调出信息

的长度有关。


(4)Cache - 主存系统的效率

e = (访问Cache的时间)/ (访问的平均时间) * 100%e表示效率。从上面这个式子可以看出, e 与Cache命中率的关系很大。


3, Cache基本结构

如上所示, CPU如果需要访问内存, 那么需要给出内存地址(包括块号和快内地址两部分), 由于主存和Cache传输的基本单位是块, 所以块内

地址可以直接送到Cache中, 块号通过主存Cache地址映射变换机构确认是否发生命中, 如果命中需要给出当前内存块保存在那个Cache块中,如果没有

命中, 那么查看Cache里面是否有足够的空间让该地址块装入, 如果有将该地址块装入Cache中, 如果没有启用Cache替换机构,由Cache的替换机构根

据替换算法决定, Cache里面哪一个块可以 重新写回到主存或者作废并且将当前访问的块放入Cache中。

主存Cache地址映射变换机构其实是两个功能:主存Cache地址映射(map)和变换机构, 主存Cache地址映射给出的是一个规则:主存中的一个块

可以放在Cache中的哪个块或哪几个块的位置, 这就是映像规则; 所谓变换就是将主存块号转换为Cache块号。

主存与Cache之间有一条直接通路, 用于主存与Cache之间的数据交换。有些计算机为了提高访问速度, 如果发生了未命中, 那么主存先通过数据

总线将数据送入CPU中, 然后再将块送入Cache存储体中。


4, Cache的读和写

首先来看看Cache的读操作。如下如所示:

上图的 Cache满 主要是指主存中的那个块可以放入Cache里面那一个或者几个块的位置是否满。如果还有位置, 将直接将内存块调入Cache中。

读操作的时候Cache内容并没有改变, 但是写操作就不是这样了, 因为有可能只对Cache写, 所以写操作一定要解决的问题是Cache与主存的一致性。

对Cache的写操作有两种方法:

写直达法(write - through):写操作时既对Cache写同时又对主存写, 写操作数的时间就是访问主存的时间, Cache退出时不需要对主存执行

写操作。这种方法可以保持Cache与主存的一致性

写回法:写操作时只把数据写入Cache而不写入主存, 只有当Cache中内容被替换出去时才写入主存; 这种方法允许一段时间内Cache与主存的

不一致, 写操作时间就是访问Cache的时间。


5, 对Cache的改进

a, Cache的分级

现在的Cache都是分级的,离CPU比较近的直接就放在CPU芯片里面, 甚至可以放两级Cache进CPU芯片。 这种叫片内Cache。

大容量的Cache放在主板上, CPU外面, 叫片外Cache。

现在的多核处理器, 每个核都有自己的Cache, 各个核之间还有共用的Cache。

b, 统一缓存与分立缓存

数据Cache, 指令Cache是否统一, 与指令执行的控制方式有关。

原创粉丝点击