预读:CPU发起预读操作(现在基本分工给cache了),cache根据局部性原理将主存的子集调入,同时保存cache与主存间的索引。
CPU访cache:CPU需要访问主存某个地址时,先访问cache看看有没有对应的镜像。
命中:主存和cache的容量差很多,cache中恰好有CPU需要的数据。
miss:cache猜错咯,哭哭。去访问主存把数据调入cache。(替换)
映射功能
首先分清楚这几个东西……(大概只有我蠢
主存地址:块号|块内地址
CPU在访主存的时候会根据主存地址去找相应内容。
cache地址:行号|行内地址
CPU在访cache的时候会根据cache地址去找相应内容。
主存的内容和cache的内容
映射就是把主存地址和cache地址联系起来
直接映射
主存的每一块对应cache中确切的一行
i=j mod 2C
主存地址:Tag|Line|Word
原主存地址的块号被分成了标记和行两部分,因为cache数量远小于主存,所以这种映射关系是cache一行对主存多块,行部分用来区分每一块应该映射到哪一行,标记部分则用于确认当前cache里存的是对应那么多块中的哪一块。
标记:
行:标识cache的确切一行
字:标识主存块中的确切一字/字节
CPU访cache:
首先根据行,找到cache行,然后比较主存地址中的标记和cache部分存的标记。一样则命中
命中:使用主存地址的块内地址,访问该cache块相应的字单元。
Miss:使用主存地址直接访主存。
CPU需要访问某个地址时,首先根据该主存地址的C字段找到cache的相应块,然后将该块标志字段中存放的标志与主存地址的T标志进行比较。
当一个主存块调入 Cache中时,会同时将主存地址的T标志存入Cache块的标记字段中。当CPU送来一个访存地址时,首先,根据该主存地址的C字段找到Cache的相 应块,然后将该块标志字段中存放的标志与主存地址的T标志进行比较,若相符,说明主存的块目前已调入该Cache块中,则命中,于是使用主存地址的W字段
全相联映射
主存地址:Tag|Word
CPU的访cache地址:
当 一个主存块调入Cache中时,会同时在一个存储主存块号和Cache块号映射表的相联存储器中进行登记。CPU访存时,首先,根据主存地址中的主存块号 M在相联存储器中查找Cache块号,若找到,则本次访Cache命中,于是将对应的Cache块号取出,并送访Cache地址的块号C字段;紧接着将主存地址的块内字号W直接送Cache地址的块内字号W字段,从而形成一个访Cache的地址;最后根据该地址完成对Cache单元的访问.
组相联映射
主存地址:Tag|Set|Word
将cache分组,组间是直接映射,组内是全关联映射。
即主存的每一块,先找到对应的cache中确切的一组,然后对应这一组中任意的一行。
公式
命中率 H = Nc/(Nc+Nm)
主存慢于cache的倍率 r = Tm/Tc
访问效率 e = 1/[r+(1-r)H]
平均访问时间 Ta = (TcNc+Tm*Nm)/N = Tc/e