注:写的时候忘记统一内存/主存的称呼,特别声明文中内存=主存。阅读本文建议画图辅助理解

Cache是什么

cache高速缓冲存储器一种特殊的存储器子系统,其中复制了主存中频繁使用的数据以利于快速访问。为了便于根据CPU送来的地址信息到Cache中去读取数据,必须有某种函数把主存地址映象成Cache地址。实现这种映象的函数叫映象函数。不同的映像函数有:

  • 直接映像法
  • 全相联映像法
  • 组相联映象法

直接映像法

原则:
  • 直接映象函数为i=j mod 2c ,其中i是Cache块号,j是主存块号, 2c为Cache总块数。
  • 将主存分为若干区,每区容量与Cache总容量相等。每区块数与Cache的块数相同,这样,每区中第i块映射的位置就是Cache的第i块
  • 维护一个块表,表的长度为Cache的块数(为了记录Cache中每块存的是主存的第几区),表中每个项目长度是主存区号的长度(为了存下块的编号)。在每次访问主存时查这个块表来对应访问Cache。

例:设主存容量为1MB,高速缓存Cache容量为16KB,块的大小为512字节。采用直接地址映像法。

  1. 写出主存地址格式。
  2. 写出Cache地址格式。
  3. 块表的容量是多大。
  4. 画出直接方式地址映像及变换示意图。

解:
Cache块数=16KB/512B=32块
则主存每区为32块(解释:将主存分为若干区,每区容量与Cache总容量相等。每区块数与Cache的块数相同,这样,每区中第i块映射的位置就是Cache的第i块),共1MB/16KB=64区
所以主存地址为6位区号(共2^6 =64区)+5位区内块号(共 2^5 =32块)+9位块内地址(块容量2^9=512B,按字节编址)
所以Cache地址为5位区内块号(共 2^5 =32块),9内块内地址(块容量2^9=512B,按字节编址),Cache其实相当于主存的一个区而已

自然的,块表的容量为32*6位(解释:这里的32对应Cache的块数是32块。这里的6可以这么理解,因为主存有64个区,2的6次方是64,表示Cache32个块中分别存了第几区的主存块,也就是说Cache里的不同块可能存的是不同区的内容,比如Cache的第1个块存的是主存的第1个区里的第1个块的内容,Cache的第2个块存储的是主存的第3个区里的第2个块的内容,Cache的第3个块存储的是主存的第5个区里的第3个块的内容

图使用教材上的图吧:(讲解:如下图说明Cache的第一个块只能存主存的每个区的第一块的内容,第二块只能存主存的每个区的第二块的内容,依次对应
Cache的映像方法_Cache
特点:冲突多,命中率低,使用率低(解释:比如Cache的第一个块,存了主存的第1个区里的第一个块的数据,那就不能再存主存的其他区里的第一个块的数据了)。但是访问速度快。

全相联映像法

原则:
  • 主存中每一块可存入Cache中的的任一位置
  • 维护一个目录表,记录Cache每块存的是内存的哪一块。表的长度就为Cache块数(原因上同),每条项目的长度为主存的主存块号的长度,每次访存的时候查表访问。
    特点:目录表容量很大,访存慢。但Cache的使用率高。

组相联映像法

原则:

(结合下面的图来理解)

  • 是前两种方法的组合,结合了各自的优点。
  • 将Cache分组,将主存分区。主存区内的块数和Cache的组数相同(原因稍后介绍)。
  • 主存区内的块和Cache的组采用直接相联映像法,即第主存每区的第i块都映射到Cache的第i组。
  • Cache每组组内采用全相联映像法,例如Cache的第3组中有个4块,Cache的第1块存了来自内存第2区的第3块,第2块存了来自内存第6区的第3快,第3、4块空.
  • 按照上面的原则,就需要一个表来说明Cache每一组存了哪几区的内存块。访存时查表到对应的区中寻找有没有该内存块。

例. 一个组相联映像Cache由64个存储块组成, 每组包含4个存储块。主存包含4096个存储块,每块由128字组成。访存地址为字地址。(例题结合下面的图来理解,图在最下面,往下看)
(1)写出主存地址位数和地址格式
(2)写出Cache地址位数和地址格式;
(3)画出组相联映像方式示意图,
(4)主存字地址为7B568H单元映射到Cache哪个组?
解:
Cache组数为64/4=16组
主存每区内的块数=Cache的组数,则主存的区数为4096/16=256区,每区内有16个存储块
那么主存地址的组成为8位区号(256区)+4位区内块号(16个存储块)+7位块内地址(一块128字,按字编址)
Cache地址为4位组号(16组)+2位组内块号(每组4快)+7位块内地址(一共128字,按字编址)
7B568H=(二进制)11110110 1010 1101000
按照前面主存地址的分析,内存映射到Cache的哪个位置是根据其第8到12位(从0开始,从左往右数),为1010=5,所以映射到第5组。

教材中的图:
讲解:如下图,Cache被分成了0~15个组,每个组里面包含4个块。而主存有4096个块,被分成256个区,每个区有16个块。 从下图可以看到主存的每个区的第一块都是存到Cache的第一个组的块里面,主存的每个区第二个块都是存到Cache的第二个组的块里面
Cache的映像方法_Cache_02