- 存储系统的层次结构
- Cache基本知识
- 降低Cache不命中率
- 减少Cache不命中开销
- 减少命中时间
- 并行主存系统
- 虚拟存储器
走出容量价格和速度三者困境的唯一方法是采用多种存储器技术,构成多级存储层次结构。
一般来说,整个存储系统的容量即是第二级存储器M2的容量,例如在由高速缓冲存储器Cache和主存组成的系统中,存储系统的容量就是主存的容量。
不命中开销是在M1中没有找到,然后到M2中去找找到了,再传回M1,CPU必须从M1中取得数据。
要点:
1. 主存和Cache被分成大小相同的块,Cache是按块进行管理的
2. 主存信息以块为单位调入Cache
3. 块大小放几十字节
4. Cache中的数据是主存中的副本
5. 全相联和直接映像都是特殊的组相联,全相联的组数就等于1,直接映像的组数就等于块数
6. 一定要注意一个概念,所谓的 n路组相联,指的是组相联中,每组里的块数,而不是组数
主存中的任一块可以被放置到Cache中的任意一个位置。
特点:空间利用率最高,冲突概率最低,实现最复杂
主存中的每一个块只能被放到Cache中唯一一个位置。
特点:空间利用率最低,冲突概率最高,实现最简单
Cache被等分成若干组,每组由若干个块构成。主存中的每一块可被放到Cache中唯一一个组的任何一个位置。组的选择常采用位选择算法:
例题:
设cache共有8块,每块大小为4B,主存共有64块,请给出直接映像、2路组相联映像、4路组相联映像和全相联映像时的访存地址格式和具体分析过程
cache每块大小位4B,则偏移为2位。总位数为2+6=8位
直接映像:(分成8组,每组1块)index=3位;tag=6-3=3位
2路组相联:(分成4组,每组2块)index=2位;tag=6-2=4位
4路组相联:(分成2组,每组4块)index=1位;tag=6-1=5位
【根据主存大小确定地址长度】
【分析】
容量是8KB的Cache
块大小 32B :块内偏移 5 位
(写缓冲器和相联度无关,而且题目中已经告知是直接映像)写缓冲器大小是 4 个块:(4-路组相联)组内偏移 2 位
共有 256 个块:索引 8 位
tag = 34-5-8=21位
写缓冲器的介绍:
为了提高写访问的速度,才设置了一个写缓冲器。这个写缓冲器是按字寻址的,含有4个块,每块大小4个字。当要进行写入操作时,如果写缓冲器不满,那么就把数据和完整的地址写入缓冲器。对CPU而言,本次写访问已经完成,CPU可以继续往下执行,由写缓冲器负责把该数据写入主存。
⚠️在写入缓冲器时,要进行写合并检查。即检查本次写入数据的地址是否与缓冲期内某个有效块的地址匹配。如果匹配,就把新数据与该块合并。
由于21064的数据Cache是直接映像的,所以当发生调块时必然引起替换,因为该Cache使用写直达法,所以替换时不必把被替换块写回主存。当发生不命中时,21064将使数据绕过Cache,直接写入主存。
Cache相关问题的解题方法:
- 整个内存数据块大小,确认主存地址位数,即CPU发送过来的地址位数
- 然后根据每块大小和组数,确认块内偏移和索引
- 目录项中第一位为有效位,剩余位为标识。有多少个取决于组数(每组设1个,所以换索引即直接对应同组位置一样的地址)
- 同时去存储数据的地方找数据
- 进行标识比对(相联存储器、单字多节的按地址访问的存储器和比较器)
some ideas:
数据块调入内存时发生冲突,需要将Cache中的块替换出,尽量避免替换掉马上就要用到的信息。
随机选择被调出的块,不能正确的反应程序的局部性
最早调入最先被替换,不能正确的反应程序的局部性。
本来是选择近期使用次数最少的块作为被替换的块,但实际上是只选择最久没有被访问的块。能较好地反应程序的局部性原理,命中率在三种策略中最高,硬件实现成本较高。
不用相邻比较,仅仅使用一般的门、触发器来实现LRU替换算法。
两个重要公式:
Cache的作用是弥补主存在速度上的不足,因此Cache的性能重点关注的是它对访存时间的提升。【在提升和改进某个部件的性能时要考虑这个部件存在的意义是什么,这个部件有什么作用,再去考虑如何提升性能】
平均访存时间=命中时间+不命中率x不命中时间
所以可以从三个方面来改进Cache的性能:降低不命中率、减少不命中开销、减少命中时间
问题1:不命中率为什么会降低?
首次访问,Cache是空的,所以发生强制失效。发生失效只有要从主存调入一块。块越大,调入的字节越多,下次访存的时候不失效的可能性就越大。所以强制性不命中率降低。
问题2:不命中率为什么后来又升高了?
块大了,块数少了。所以带来强制性不命中降低的同时,带来了冲突不命中的增加。两者共同作用,导致总的不命中率增加。看来,块大小设置多大,是需要好好设置一下的。
问题3:增加块大小,会不会对其他性能参数有影响?
当然有影响,块大了,调块的时间长,所以会增加不命中的开销。
2条经验规则:
通过软件的方法进行优化来降低不命中率,这种方法的特色是无须对硬件做任何改动。分为减少指令不命中和减少数据不命中两个方面。
设置一个大小适中的写缓冲器
一般由存储管理部分MMU完成,按照访问地址是物理地址还是虚拟地址,把Cache分成物理Cache和虚拟Cache。
不命中
时地址转换和访问Cache时并行进行的,速度比物理Cache快很多。直接用虚地址中的页内位移,作为访问Cache的索引,但标识却是物理地址。
局限性:直接映像Cache的容量不能超过页面大小。
为了既能实现大容量Cache,又能使索引位数比较少,可以采用提高相联度的方法:
另一种方法:硬件散列变换
把对第一级Cache的访问按流水方式组织,使得访问Cache需要多个时钟周期才能完成。实际上它并不能真正减少Cache的命中时间,但可以提高访问Cache的带宽。
开发指令级并行性所遇到的一个挑战:当要每个时钟周期流出超过4条指令时,要提供足够多条彼此互不相关的指令是很困难的。
解决方法:踪迹Cache,存放的是CPU所执行过的动态指令序列,其中包含了由分支预测展开了的指令,该分支预测是否正确要在取到该分支指令时进行确认。
主存的性能主要由带宽和延迟来衡量。
延迟:存储器的访问时间,也就是启动1次存储器操作到完成该操作时所需要的时间
带宽:单位时间内存储器存取的信息量
以往Cache主要关心的是主存的延迟(影响Cache的不命中开销),而I/O主要关心的是主存的带宽。随着第二级Cache的广泛使用,主存带宽对于Cache来说也重要,因为第二级Cache的块比较大。实际上,Cache可以通过增加Cache块的大小来利用主存带宽的增加,因为==在高带宽的情况下,块大小增大并不会使不命中开销增加多少。
并行存储系统:在一个访存周期内能并行访问多个存储字的存储器,它能有效地提高存储器的带宽。
在相同器件条件下(TM相同),如果要提高主存的带宽,可以采用以下两种并行存储器结构:单体多字存储器和多体交叉存储器。
体冲突:指两个访问请求要访问同一个存储体
解决这个问题的一种方法:采用许多体去减少体冲突的次数。
许多计算机采用段式和页式的组合——段页式
两者兼顾的优点:每段被划分为若干个页面,这样既保持了段作为逻辑单元的优点,又简化了替换的实现,而且段不必作为整体全部一次调入主存,而是可以以页面为单位部分调入。