Cache和主存的地址映射
Cache结构图
Cache和主存被划分为很多块, 块(Cache Block ) 作为映射的最小单元,块大小(Cache Block size) 反应块内所包含的字节数。
以256byte大小Cache为例,其Cache Block size=4 byte,被划分为32块。
Cache地址相当于被划分为了2部分:块号(index) 块内地址/偏移量(offset)
主存的结构与Cache相同,Main Memory Block size = Cache Block size
直接映射
直接映射就是每个主存块只与一个缓存块相对应,映射关系为 i = j m o d C i = j\;mod\;C i=jmodC(其中 i i i为缓存块号, j j j主存块号, C C C为缓存块数)。
以4个Block的Cache与32个Block的主存为例 (Cache Block size = Main Memory Block size),这里假设每块含4字节,Main Memory中每4个Block为一组 (每组的Block数量 = Cache的Block数量) ,每组的第1块映射到Cache中的Cache Block[0],第2块映射到Cache Block[1]…
Cache index | Main Memory index |
---|---|
0 | 0,4,8…28 |
1 | 1,5,9…29 |
2 | 2,6,10…30 |
3 | 3,7,11…31 |
假设现在需要主内存中的地址为15H的数据,CPU首先会在Cache中查找,这就需要将主存中15H地址映射到Cache中。
15 H = 0001 01 01 15H = 0001\;01\;01 15H=00010101,其中offset(01)表示在块内的偏移量,index(01)表示在Cache的块号。每一组相同index将映射到Cache中的同一块,因此需要一个tag来区分不同的组。
图上还有一个valid bit,这个是用来标记Cache Block是否有效的,当根据Main Memory地址映射到Cache所在块之后会先检查valid bit是否有效,只有在有效的情况下,比较tag才有意义。如果无效,直接判定cache缺失。当系统刚启动时,cache中的数据都应该是无效的,因为还没有缓存任何数据。
直接相连映射的优缺点
优点:简单易实现,硬件成本会比较低
缺点:不够灵活,Cache中的每个Block对应Main Memory中每组index相同的Block,一个一对多的关系,如果需要访问Main Memory每组index=1的Block,则Cache中只有index=0的Block会被使用,并且数据还会被不断替换,其他空闲位置无法使用,命中率降低。
全相联映射
全相联映射允许Main Memory中的每一个Block映射到Cache中的任何一个位置上面,只有当Cache中的Block全部被占用时,才考虑替换。
假设Cache被划分为4个Block,Main Memory被划分为32个Block,(Cache Block size = Main Memory Block size),假设此时需要地址为15H(00010101)的数据。CPU首先会查找Cache是否有存储,由于采用全相联映射,Main Memory中的Block可以映射到Cache中的任一个一个地Block,因此需要逐一检验tag标签来判断。如下图所示在Cache中Block[1]的tag匹配成功。通过offset来确定该内容在Block中的位置。
全相联映射的优缺点:
优点:因为Main Memory中的Block可以映射到Cache中的任一个一个地Block,不像直接映射一样,Main Memory中某一个Block映射到Cache中唯一的Block灵活,这种方式命中率更高,缩小了块冲突(只有当Cache全部Block都被占用才会冲突)。
缺点:直接相连映射定位到Cache中的Block之后,只需要检验一次tag标签即可,而全相联映射,需要逐一匹配Cache中每一个Block的tag标签,这种方式的硬件成本较高。
组相联映射
组相联映射是直接相连映射和全相联映射的一种折中方法。
直接相连映射是Main Memory中的任一Block只能映射到Cache中唯一的Block,而组相联映射则是映射到Cache中唯一的组(Group)(一组包含若干Block),映射规则为i i = j m o d C i = j\;mod\;C i=jmodC(其中 i i i为Cache中的组号, j j j为Main Memory的块号,C为Cache的组数)。
对于同一组,采用全相联映射,Main Memory中的Block可以映射到对应组中的任一个一个地Block,通过逐一检查tag标签来定位。
假设Cache被划分为4个Group,每个Group有2个Block,Main Memory被划分为32个Block,现需要Main Memory中地址为15H的数据,CPU会先到Cache中寻找,15H = 0001 01 01,其中的index(01)确定为Group[1],然后逐一匹配Group[1]中所有Block对应的tag,最后确定15H在Cache所映射的位置。
可见直接相联映射和全相联映射都是特殊的组相联映射,直接相联映射是当Cache中每组只有一个Block情况下的组相联映射,而全相联映射则是Cache只划分一个组(即Cache所有Block作为一个组)情况下的组相联映射。
牙牙yyds
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhieciee
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
excel图片置于文字下方的方法
PHP中文网 06-27 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信提示登录环境异常是什么意思原因
PHP中文网 04-09 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
微信人名旁边有个图标有什么用
PHP中文网 03-11