计算机体系结构——5 存储层次
5.1 存储器的层次结构
5.1.1 从单级存储到多级存储
-
为什么?
- 主存储器与CPU 速度差距越来越大,存储墙问题严重制约着计算机性能的提升如图
- 系统与应用的规模不断扩大,需要更大的存储器来支撑程序的运行
- 各类存储器的容量/速度/价格不可兼得,如SRAM、DRAM、磁盘等,凭现有单种存储器件,无法构建一个可行的存储系统
-
怎么办?
- 利用多种存储器件,取长补短,构建层次式存储系统
- 快速但昂贵的存储器:容量少点,尽量让CPU多访问
- 慢速但容量大的存储器:容量大点,CPU尽可能少访问
- 利用多种存储器件,取长补短,构建层次式存储系统
-
能否达到预期效果?
- 访问速度方面:采用快速存储器,尽量让CPU多访问快速存储器中的内容(增加Cache层次)
- 程序局部性原理;
- 时间局部性:当前访问的数据存放Cache中
- 空间局部性:把与当前访问地址相邻的数据放入Cache中(以块为单位从内存调入)
- 程序局部性原理;
- 容量方面:采用慢速但容量大的存储器,内存不够时数据可以放到外存中(增加辅存层次)
- 访问速度方面:采用快速存储器,尽量让CPU多访问快速存储器中的内容(增加Cache层次)
5.1.2 Cache -主存和主存-辅存层次
最主要的两种存储层次
- 从主存的角度来看
- Cache一主存层次:弥补主存速度的不足
- 主存一辅存层次:弥补主存容量的不足
“Cache——主存”与“主存——辅存”层次的区别
5.1.3存储层次的四个问题
- 1.当把一个块调入高一层(靠近CPU)存储器时, 可以放在哪些位置上?
- (映象规则 调入块可以放在哪些位置)
- 2.当所要访问的块在高一层存储器中时,如何 找到该块?
- (查找算法 如何在映象规则规定的候选位置查找)
- 3.当发生失效时,应替换哪一块?
- (替换算法 规定的候选位置均被别的块占用)
- 4.当进行写访问时,应进行哪些操作?
- (写策略 /如何处理写操作)
5.1.4存储层次的性能参数
5.2 Cache基本知识
5.2.1 映象规则
1.全相联映象
- 全相联:主存中的任一块可以被放置到Cache中的任 意一个位置。
- 对比:阅览室位置——随便坐
- 特点:空间利用率最高,冲突概率最低,
实现最复杂。
2.直接映象
- 直接映象:主存中的每一块只能被放置到Cache中 唯一的一个位置。 (循环分配)
- 对比:阅览室位置——只有一个位置可以坐
- 特点:空间利用率最低,冲突概率最高, 实现最简单。
5.2.2 查找方法
- 1.如何确定Cache中是否有所要访问的块?若有的话如何确定其位置?
- Cache块调入时记录存放的位置到目录表中
- 只需查找候选位置所对应的目录表项
- 并行查找与顺序查找
- 提高性能的重要思想:主候选位置(MIRU块) Most Recently Used
- 并行查找的实现方法:
- ▲相联存储器
- ▲单体多字存储器+比较器
5.2.3替换算法
-
所要解决的问题:当新调入一块,而该块能够占用的Cache位置已被占满时,替换哪一块?
-
1.随机法:实现简单
-
2.FIFO:实现简单
-
3.LRU(Least Recently Used最近最少使用):
- 长期不被使用的数据,在未来被用到的几率也不大,所以当新的数据进来时我们可以优先把这些数据替换掉。失效率低。
- LRU是淘汰最长时间没有被使用的页面。
- LRU 关键是看页面最后一次被使用到发生替换的时间长短,时间越长,页面就会被置换;
-
4.LFU(least frequently used最近最不经常使用):最不常使用法
- LFU是淘汰一段时间内,使用次数最少的页面。
- LFU关键是看一定时间段内页面被使用的频率(次数),使用频率越低,页面就会被置换。
5.2.4 写策略
- 1.“写”操作所占的比例
- Load指令:26% Store指令:9%
- “写”在所有访存操作中所占的比例:9%1(100%+26%+9%)=7%
- “写”在访问数据Cache操作中所占的比例:9%/l(26%+9%)=25%
- 2.“写”操作必须在确认是否命中后才可进行
- 3.“写”访问有可能导致Cache和主存内容的不一致
- 4.两种写策略 写直达法:执行“写”操作时,不仅写入Cache,而且也写入下一级存储器。 写回法:执行“写”操作时,只写入Cache。仅当Cache中相应的块被替换时,才写回主存。 (设置“污染位”)
- 5.两种写策略的比较 写回法的优点:速度快,占用存储器频带低写直达法的优点:易于实现,一致性好
- 6.写存储器
5.2.5 Cache结构
5.2.6 性能分析
5.2.7 改进Cache性能
- 平均访存时间=命中时间+失效率×失效开销可以从三个方面改进Cache的性能:
- ⑴)降低失效率
- (2)减少失效开销
- (3)减少Cache命中时间
- 15种Cache优化技术
5.3 降低Cache失效率的方法
降低失效率共7种
- 增加块大小
- 提高相联度
- Victim Cache
- 伪相联Cache
- 硬件预取
- 编译器控制的预取
- 用编译器技术减少Cache失效
5.3.1 失效率
-
1.三种失效(3C)
-
(1)强制性失效(Compulsory miss)
当第一次访问一个块时,该块不在Cache中,需从下一级存储器中调入Cache,这就是强制性失效 (冷启动失效,首次访问失效) -
(2)容量失效(Capacity miss )
如果程序执行时所需的块不能全部调入Cache中,则当某些块被替换后,若又重新被访问,就会发生失效。这种失效称为容量失效。 -
(3)冲突失效(Conflict miss)
在组相联或直接映象Cache中,若太多的块映象到同一组(块)中,则会出现该组中某个块被别的块替换(即使别的组或块有空闲位置),然后又被重新访问的情况。这就是发生了冲突失效。(碰撞失效,干扰失效) -
2.三种失效所占的比例
-
(SPEC92)图示I(绝对值)可以看出:
-
(1)相联度越高,冲突失效就越少;
-
(2)强制性失效不受Cache容量的影响,但容量失效 却随着容量的增加而减少;强制性失效和容量失效不受相联度的影响.
-
(3)表中的数据符合2:1的Cache经验规则,即大小为N 的直接映象Cache的失效率约等于大小为N/2的两路组相联Cache的失效率。
-
3.减少三种失效的方法
- 强制性失效:增加块大小,预取(本身很少)
- 容量失效:增加容量(防止出现抖动现象)
- 冲突失效:提高相联度(理想情况:全相联)
-
4.许多降低失效率的方法会增加命中时间或失效开销
5.3.2 提高相联度
5.3.3 Victim Cache
5.3.4 硬件预取技术
5.3.5 编译器优化
5.4 减少Cache失效开销
- 写缓冲及写合并
- 让读失效优先于写
- 子块放置技术
- 请求字处理技术
- 多级Cache
- 非阻塞Cache技术
5.4.1 写缓存与写合并
5.4.2 让读失效优先于写
5.4.3 子块放置技术
5.4.4 多级Cache
5.4.5 非阻塞Cache技术
5.5 减少命中时间
- 采用容量小、结构简单的Cache
- 虚拟Cache
- 流水化写
5.5.1 容量小、结构简单的Cache
5.5.2虚拟Cache
5.6 主存
- 存储层次的性价比特征
- 速度越快,每位价格就越高;
- 容量越大,每位价格就越低;
- 容量越大,速度越慢。
- 主存的主要性能指标:延迟和带宽
- 以往:Cache主要关心延迟,I/O主要关心带宽
- 现在:Cache关心两者
- 本节讨论几种提高主存性能的存储器组织技术在下面的讨论中,以处理Cache失效为开销例来说明各种存储器组织结构的好处。
5.6.1 存储器组织技术
5.6.2 存储器芯片技术
5.7 虚拟存储器
5.7.1 存储器基本原理
5.7.2 块表TLB
5.7.3 虚拟内存和Cache关系
5.8 进程保护和虚拟存储实例
5.8.1 进程保护
5.8.2 页式虚拟举例