虚拟地址传入CPU内部的内存管理单元MMU,MMU将其转化为物理地址传入MAR,MAR会优先访问cache,而知道映射的地址结构才能知道如何访问cache,因为不同的映射结构该物理地址能放入的cache行是不同的,(比如直接映射方式下某一个物理地址只可能存在于某个确定的cache行),我们比较所有可能的cache行中的内容来判断cache命中或未命中。cache行的总位(bit)数与cache行的内容有关。
由于有三种映射关系,cache地址与映射的地址结构对比图会不同,我们分别讨论。
但是三种映射方式求每个cache行的总位数以及cache总容量的方法一致。
直接映射
主存地址分为块号和块内地址两部分,Cache地址也分为行号和块内地址。
我们都知道内存大,cache小,所以若下图标记位为8bit,那么有256种可能的内存地址单元可以被放在了这个cache中,为了具体区分是哪一个内存地址单元,我们就需要在每一个cache行中分出一部分地址单元来存储这8bit的信息。
书上所谓的(直接)映射的地址结构其实就是内存地址被划分成的几个字段。我们通过映射的地址结构就能找到对应的cache行。
求cache行的总位数和cache容量
cache不只是用标记位就能判断对应的内存地址已经调入cache,它需要以下构成的标记项来完成“cache-内存层”的功能。
当给定一个内存地址后,我们通过映射的地址结构找到相对应的cache行(直接映射是唯一的,其他两种不唯一,后文讨论),然后依次对此处的cache块存储内容进行分析判断后得知cache中是否有该内存地址的内容。
cache行的总位数=有效位+修改位+替换控制位+标记位(tag)+数据位。
- 有效位是1bit
- 修改位(回写法是1位修改位,全写法无修改位)
- 替换控制位(看替换算法的需求,直接映射没有替换算法,其他两种映射如果采用随机算法也没替换控制位,采用LRU时替换位就是log2的路数,直接映射是一路,从这里也可以看出log2的1为0)
- 数据位由 “块内地址” 和 “计算机按什么编址” 得出,如果块内地址为3位,按字节编址,则数据位=2^3×8bit=64位(bit)
- 标记位,根据三种映射方式来计算。
一个cache的行的总位数已经知道了,则cache的总容量=cache行数×cache行的位数 (单位为bit)
事实上不违法常识的题中数据位是大头,因为不可能你本来要存储数据的存储器,为了判断地址是不是正确就花费太多的存储单元去存储标志项。
全相联映射
这种情况下由于主存块是随机装入cache的任一行,所以标记位只能取内存地址除去块内地址的高位地址。
由于给定的内存地址没有cache地址的行号信息,当我们拿到内存地址去Cache中找时,CPU需要与所有cache行进行比较。
组相联映射
上图与其他两种映射方式的图对比就能验证直接映射标记所占的额外空间开销最少、标记的比较速度最快,全相联映射标记所占的额外空间开销最大、标记的比较速度最慢。
组相联就不要关注行号了,没有意义,因为关注内存地址连不连续就是因为调入cache的时候是一整块调入的,连续的内容地址访问时都会cache命中。而直接映射和全相联映射关注cache的行号是为了判断cache命中与否,组相联关注组号判断命中与否,自然不需要关注行号。