计算机体系结构——储存层次
计算机的储存层次定义了计算机如何储存数据,一种典型的储存层次为:
代号 | 名称 | 说明 |
---|
L0 | 寄存器 | 寄存器的数据从内存缓存中获取数据 |
L1 | 芯片内高速缓存( SRAM ) | L1 缓存从 L2 缓存获取数据 |
L2 | 芯片外缓存( SRAM ) | L2 缓存从内存中获取数据 |
L3 | 主存( DRAM ) | 主存从本地硬盘获取数据 |
L4 | 本地存储 | 硬盘储存计算机产生的数据或者从网络中获取数据 |
L6 | 远程储存 | 包括网络分发文件系统, Web 服务等 |
这些储存结构从上到下依次:
- 容量递增;
- 价格递减‘;
- 速度递减;
- 体积递增。
储存层次中的缓存
储存层次第 k 层是第 k+1 层的缓存,缓存的主要作用是将那些在 k+1 层经常使用的数据块复制到第 k 层,这样就可以提高访问的速度。
缓存命中
当程序想要获取第 j 个数据块,发现第 k 层缓存缓存了这个数据块称为缓存命中。
一个好的程序通常需要具有好的缓存友好性,分为:
- 时间缓存友好性,指程序应该在短时间内访问同一个变量。
- 空间缓存友好性,程序应该连续访问数据,而不是跨越访问数据。
上面两点都能提高缓存命中的概率。
缓存失效
当程序想要获取第 j 个数据块,发现第 k 层缓存没有缓存第 j 个数据块,进而要从第 k+1 层获取第 j 个数据块,称为缓存失效。
如果第 k 层的缓存空间使用已满,这时需要用第 j 个数据块去覆盖某个数据块。被覆盖的数据块称为牺牲数据块,觉得被覆盖的数据块取决于缓存替换算法。例如,随机缓存替换随机选取一个数据块进行替换, LRU 缓存算法将替换距最后一次访问时间距离现在最长的那个数据块。
缓存失效的类型
如果第 k 层缓存是空的,即没有任何数据块,称为冷缓存。此时的缓存失效类型称为强制失效或者 冷失效 ,这种缓存失效持续时间不长,常发生在缓存预热之前。
第 k 层的储存通常比第 k+1 层小的很多,如何在第 k 层放置数据块和定位数据块成了一个严峻的问题。通常来说,使用一种取余策略,即将第 k + 1层第 i 个数据块放在第 k 层的第 imod4i \mod 4imod4 的位置上,假如第 k 层有 4 个可用的位置。
这种策略引发了一种 冲突性失效的缓存失效 的类型,例如程序连续访问 0,8,0,8,0,8 恰好这两个数据块共用一个缓存位置,那么每次查询缓存的时候都被另外一个占用,缓存永远无法发挥作用。
最后一种,当程序反复使用一段内存,但是这段内存大于缓存区的长度,那么这段内存将会重复载入缓存区,造成 容量缓存失效 。