高速缓存Cache原理之-1.存储器层次结构
本节开始,系列介绍cache的相关知识。
目录框架为:
- 存储器层次结构
- cache和主存的关系
- 实现cache需要解决的问题
- cache的映射方式
- cache命中率和缺失率
- cache的关联度
下面开始第一节内容,存储器的层次结构,及cache在层次化结构中的位置。
我们希望的存储器是什么样子?
目前,我们所知道的存储器有寄存器、SRAM、DRAM、硬盘等,列出它们的相关指标:
寄存器:触发器,速度非常快,访问延时为1ns。
SRAM:SRAM由6个T管组成,通过在位线上写高低电平写入SRAM;靠读取位线上的电平读出数据,所以速率很快。但是其由6个T管组成,集成度低,所以容量也就很小。
DRAM:DRAM由一个T管和一个电容组成,集成度高,容量大。DRAM是靠寄生电容的电荷存储数据,靠电容的充电和放电过程实现写入和读取动作,我们知道电容的充放电曲线,所以DRAM读写速度比SRAM要低。
硬盘:读写为机械动作,所以速率更低。
我们想要的存储器为大容量、快速、便宜的存储器,没有单独的一种存储器能够满足要求,所以,提出了一种层次化的存储结构。
存储器的层次结构如下:
上图中的cache位于寄存器和主存之间。
层次化存储器结构的大概思想为:
数据总是在相邻两层之间复制传送。这里要强调下,数据传送是复制传送,比如将主存中的数据传送到Cache后,主存中的数据仍然存在的,并没有丢失。
Block:最小传送单位为定长块,互为副本。
问题: 为什么这种层次化的结构是有效的呢? 为什么每次复制传送一个block,一大块信息,没有白白浪费带宽呢?因为程序访问的局部性特点,在不久的将来,CPU访问的是这个block的指令和数据,所以,一次性搬一大块,可以减少搬运次数,某个时刻都去访问这个block。
局部性访问包含两点:
- 时间局部性(Temproal Locality)
含义:刚被访问过的单元不久很可能又被访问。
做法:让最近被访问过的信息保留在离CPU更近的存储器中。
例子:循环具有时间局部性。 - 空间局部性(Spatial Locality)
含义:刚被访问过的单元的邻近单元很可能被访问。
做法:将刚被被访问过的单元的邻近单元调到离CPU更近的存储器中。
例子: 循环,数组,具有空间局部性。
总结:程序的局部性访问使得层次化存储结构非常有效。
那么,程序为什么具有局部性访问的特性呢?
原因:- 指令:指令按序存放,地址连续,具有空间局部性;循环程序或者子程序段重复执行,具有时间局部性。
- 数据:连续存放,数组元素重复、按序访问。
为什么引入cache会加快访存速度?
在CPU和主存之间设置一个快速小容量的存储器,其中总是存放最活跃的程序和数据,由于程序访问的局部性特征,大多数情况下,CPU能直接从这个高速缓存中取得指令和数据,而不必访问主存。从而加快访存速度。
我们写程序的时候,如何来利用cache的特性呢?
下面以一个双重循环的不同写法来比较其性能。