Cache超清晰逻辑详解(cache的三种映射)

在说之前要向大家安利一个网站,http://www.ecs.umass.edu/ece/koren/architecture/Cache/tutorial.html,这是马萨诸塞大学安姆斯特分校的体系结构课程的tutorial,能够对cache有更直观的理解。

之前课上老师讲的飞快,课后复习压力很大,无意间看了他的tutorial感觉非常有收获,本篇博客基于tutorial,详细说明cache,这一篇先详细说说cache的映射结构。



我们知道,存储分层是为了在速度和存储容量上获得最优解,从cache,到主存到辅存,速度上越来越慢,存储容量上越来越大。同理,单看cache,cache内部也是分层的,目的也是为了获得速度和容量上的最优解。层级被标记为L1,L2,L3。。。(如下图)
在这里插入图片描述

当一个数据要从cache中读,L1没有就要去L2,以此层层向下。如果在所有层上都没有找到则访问主存,从主存中取数据送到cpu,此时取出的数据从 主存------》 cache --------》 cpu, 如果cache已满则用置换算法换出一块给这个数据挪位,数据读到了cache中以便下次查找。

由此引出:

hit 命中 —— 在cache中找到了想要的数据

miss 不命中 —— cache中没有找到想要的数据

但是命中(hit)的方式有多种,为什么呢?这是因为cache内部的结构问题,这里必须要说一些cache的工作原理。

cache和主存储器之间以为单位进行数据交换,而块的大小以在主存储器的一个周期内能访问到的数据长度为限,而这个数据长度并不一定只是一个字哦,如果是主存储器采用并行或者地址交叉存取,则在主存周期内可以访问多个字。

因此,既然是以块为交换单位,所以将cache和主存储器都划分成大小相同的块。
主存地址:块号B+块内地址W
cache地址:块号b+块内地址w

这时,CPU要访问cache时,CPU要的主存地址放在了主存地址寄存器中,通过cache-主存的地址变换部件,将寄存器要求的主存地址转成cache中的地址,如果能在cache中找到则命中,如果不能则miss。

而主存和cache之间怎么变换的呢?其实只要映射块号地址,主存块号B-----》cache中的块号b,块内地址不变,解决。

这样是不是逻辑清楚了一点?

课本上有张图,初看有点复杂,但是经过以上文字叙述会好理解很多。

但这只是很笼统的表述,以上表粗和高亮的都要展开说。



我们上面说了,地址映射是:主存地址----》映射到cache中,而映射的规则是什么呢?
一共有3种映射规则。

1. 全映射

In fully associative mapping, when a request is made to the cache, the requested address is compared in a directory against all entries in the directory. If the requested address is found (a directory hit), the corresponding location in the cache is fetched and returned to the processor; otherwise, a miss occurs.

就是说,主存地址和目录表中的每一个都比较,如果找到了,表示hit,没有找到表示miss。

这个目录表是什么?

其实主存和cache的映像关系是有一个目录表存着的,它存放在高速存储器中,说明白话, 如果学过操作系统,快表就是这个目录表,TLB,他是单独的寄存器存放。

因此,主存地址和TLB中的每一条目录比较,这是全相连映像。

具体怎么比较呢?发现没有,这是一个纵向挖的逻辑。hh

TLB

结构: 记录 主存块号和 cache块号 ,还有一个有效位。有效位的作用---- 标记目录表中的这一项主存和cache有没有建立有效映像,建立了=1,没有=0

下面这张图,如果B和b不对应那么有效位就是0

在这里插入图片描述

评价:

  • 优点:命中率比较高,Cache存储空间利用率高。
  • 缺点:访问相关存储器时,每次都要与全部内容比较,速度低,成本高,因而应用少

应用:
虚拟存储器中,P175 这个还没弄明白 ,留坑

直接相连

lower order line address bits are used to access the directory. Since multiple line addresses map into the same location in the cache directory, the upper line address bits (tag bits) must be compared with the directory address to ensure a hit. If a comparison is not valid, the result is a cache miss, or simply a miss. The address given to the cache by the processor actually is subdivided into several pieces, each of which has a different role in accessing data.

将主存按cache的大小分成区,分成一组一组的,将主存中每个组里块号映射到cache中相同块号中。

这个映射过程也需要一个存储器,

怎么映射?

cache地址: 块号 +块内地址
主存地址: 区号(按照组划分)+ 块号(按照块划分) +块内地址

在这里插入图片描述

主存块号来查找存储器的表对应的那一line,读到区号是E,则将主存的区号和读到的E区号进行比较,如果一样则为有效=1,反之=0. 为0 则将主存的区号装入到该单元上。

评价:

  • 优点:硬件实现简单,不用采用相联访问的存储器,访问速度比较快。不需要地址变换
  • 缺点:冲突率高,命中率低

例:设主存容量为1MB,高速缓存容量为16KB,块的大小为512字节。采用直接地址映像法。
写出主存地址格式。
写出Cache地址格式。
块表的容量是多大。
画出直接方式地址映像及变换示意图。
解:
Cache块数=16KB/512B=32块
则主存每区为32块,共1MB/16KB=64区
所以主存地址为6位区号(共64区)+5位区内块号(共32块)+9位块内地址(块容量512B,按字节编址)
所以Cache地址为5位区内块号,9内块内地址(相当于主存的一个区)
自然的,块表的容量为32*6位(表示Cache32个块中分别存了第几区的主存块)
图使用教材上的图吧:
在这里插入图片描述

组相联映像

和之前都一样:主存和cache划分成相同的块,
和之前不一样:主存和cache划分成相同组

除了将主存和cache分成快之外,还将主存和cache按同样大小划分成组,每一组都有相同的块数。
因此,主存的组数要比cache的组数要多。从主存的组到cache的组之间采用直接映像。
选好一个主存的组和相应的cache的组后,组内是全相联映像。
例如:主存里的组0直接映像到cache的组0,主存中的块0可以映像到映射到块0,块1,块2…上。
在这里插入图片描述
主存地址:区号+组号+组内块号+块内地址 (区号==cache的组号)
cache地址: 组号+组内块号+块内地址

一个组相联映像Cache由64个存储块组成, 每组包含4个存储块。主存包含4096个存储块,每块由128字组成。访存地址为字地址。
(1)写出主存地址位数和地址格式
(2)写出Cache地址位数和地址格式;
(3)画出组相联映像方式示意图,
(4)主存字地址为7B568H单元映射到Cache哪个组?

主存地址的组成为8位区号(256区)+4位区内块号(16个存储块)+7位块内地址(一块128字,按字编址)
Cache地址为4位组号(16组)+2位组内块号(每组4快)+7位块内地址(一共128字,按字编址)

  • 30
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值