高速缓存模块学习
决定从今天开始将自己的学习过程记录下来,当作学习笔记
存储器有三个层次结构,分别是硬盘、主存和高速缓存。其中,硬盘称为虚拟存储器,存储容量大但是访问速度慢;主存称为物理存储器,是虚拟存储器的一个子集;高速缓存容量最小但是访问速度快,是主存的一个子集,用来存放主存中的常用数据和指令。
为了节约成本,如今的存储系统会将快速、小容量、廉价的存储器和一个大容量、慢速、廉价的存储器组合使用,处理器首先会从高速缓存中寻找数据,找不到才去主存中找。本文主要介绍几类高速缓存的特点。
一、直接映射高速缓存
每个内存地址都会准确的映射到高速缓存的一个组。直接高速缓存每个组只有一个块,所以一个主存地址映射到高速缓存唯一的块,上图是一个容量为8个字,块大小为1个字的高速缓存,存储器地址为32位,由于字对齐故最低两位均为0,接下来的三位代表映射到哪一个组(这个例子中只有8个组,故用3位即可表示),余下的27位是标志位,用来与缓存中的标志位进行比较,判断是否为所需数据。
因为每个组只有一个块,所以会有多个地址映射到一个块(按顺序依次分配,所以0x04和0x24都会映射到第1组),这样的映射方式容易产生冲突,比如当访问到0x04地址时,这个地址中的数据会被放入缓存中的第1组,但是如果之后马上又访问到0x24地址,0x24地址的内容就会替代之前的数据存放在缓存的第1组。
二、多路组相联高速缓存
多路组相联高速缓存,每个组有N块,所以存储地址可以映射到一个组中的任意一块。上图是一个两路组相联高速缓存的例子(N=2),每一路由数据块、有效位和标志位组成,只有四个组,选择组只需要地址中的2位,故标志位增加为28位。
所有的地址会按顺序映射到这两个块中,也就是0x04和0x24,分别会映射到第一组的块1和块2,这样在临近 访问这两个地址时数据会被分别存到不同的块中就不会发生冲突。
高速缓存从选定的组中读取所有两路的块,检查标志和有效位以确定是否命中,如果其中一路命中,多路选择器从此路选择数据。当两路都满时,按照最近最少使用原则替换其中一路。
三、全相联高速缓存
全相联高速缓存只有一个组,必须对所有块的标志位进行比较判断,所以需要大量的比较器,硬件资源消耗大但是冲突少,只适合较小的高速缓存。
四、块的大小
前述的例子,块的大小均为一个字,但是块的大小也可以多于一个字用来存储几个连续的字,这样在发生缺失时,除了被访问的地址数据,它之后的临近字也会被存入缓存中,这样的预测是比较合理的,能够增加命中率。
因为一个块可以存多个字,故进行读取时还需要指定块内偏移地址,整个块只需要一个标志,因为块内字的地址是连续的。