组相连的cache 结构

cache 基本结构如下图。下图中,存在4路(way,黄框所示为一个way),每一路中有4Line(绿色填充的为一个cache line),每一Line有4个Wrod,假设每个Word有4个Byte。
四个绿色填充的位于不同Way 的Line,组成一个组(Set)。

在查找某个地址索对应的cache 时,使用地址中的index 位找到对应Line,offset 找到对应Word,bytes 位找到对应Word 中的某个Byte。然后使用地址中的tag 位(其实就是高位地址),与cache 中的tag 位对比,如果一致,则命中。

可以看出,具有相同index 的两个不同地址,会索引到相同的Cache Line。如果只有一个Way,在两个地址频繁交替访问的场景下,这两个地址势必频繁cache 未命中。多个way 相连则可以解决这个问题,组相连的意义就是在此。

PIPT 与VIVT 的访问方式

PIPT(physical index physical tag),物理高速缓存,即使用mmu 翻译过的物理地址来索引cache。因为mmu 翻译过程经常会读取main memory(一般就是DDR),因此必须承担这一项时间消耗。
VIVT(virtual index virtual tag),虚拟高速缓存,即直接使用虚拟地址来索引cache。优点是无需经过mmu 翻译,但是可以想象,由于虚拟地址与物理地址的复杂映射关系,势必存在问题:

  1. 重名问题,即不同的虚拟地址映射到相同的物理地址时,(比如对同一个物理地址mmap了两次这种情况)cache中将拥有两份该物理地址的缓存。如果都是读操作则只有浪费问题;但如果有一方存在写操作,那么还会带来一致性的问题
  2. 同名问题,即相同的虚拟地址映射到了不同的物理地址时,此时通常是不同的进程拥有相同的虚拟地址,但是对应的物理地址不同。此时的问题就是,虽然cache 命中了(cpu发出的虚拟地址一样),但是cache中的内容却是上一个进程的。

VIPT(virtual index physical tag),PIPT存在mmu 虚实转换耗时,VIVT存在重名和同名问题,有没有折中的办法?有,那就是VIPT 。cpu发出的地址中包含tag域和index,在VIPT中,index域直接送往cache进行索引,同时,tag域送往mmu 进行TLB和mmu进行转译。这样索引cache line 和mmu 转译的过程并行进行,节省了时间。但是同样存在问题:当高速缓存的way 的大小大于page 时,存在alias 问题。比如如下场景:
1、cache way 大小为8K,linux page大小为4K
2、两个虚拟地址VA1, VA2映射到了同一个物理地址(例如多次mmap 的情况)
3、两个虚拟地址只有bit12不一样
此时,由于cache way是8KB,所以索引域需要占用bit0-bit12(pow(2,13)/1024 = 8)。此时又由于VA1 VA2只有bit12不同,并且两者的tag域必然相同(因为tag就是物理地址,前述条件就是VA1/2映射到了同一个物理地址),因此两个虚拟地址VA1, VA2 映射到了不同的cache line。这就导致了重名问题。

现代处理器中,如ARM Cortex-A7, A9, A15, A53,数据cache 均采用了PIPT,指令cache采用了VIPT(可能是因为aliasing 问题只对写操作带来问题,而指令不需要修改?)

参考文献:
《奔跑吧linux内核(第2版)》笨叔 著

ARM cache 结构与访问方式相关推荐

  1. JVM篇--详解对象创建过程-对象结构-对象访问方式

    hello,hello,刚学过的东西瞬间忘记,是我年龄大了还是年龄大了,可我明明才20出头啊(凑不要脸),其实25了,偏题了....今天整理一下关于JVM对象篇的结构,会记录对象创建过程,还有对象的内 ...

  2. [mmu/cache]-ARM cache的学习笔记-一篇就够了

    ★★★ 个人博客导读首页-点击此处 ★★★ . 说明: 在默认情况下,本文讲述的都是ARMV8-aarch64架构,linux kernel 64位 . 相关文章 1.ARM MMU的学习笔记-一篇就 ...

  3. 4路组相连cache设计_Cache组织方式

    经过下面文章的介绍,我们已经知道cache的基本工作原理. smcdef:图说Cache - Cache的基本原理​zhuanlan.zhihu.com 但是,我们一直避开了一个关键问题.我们都知道c ...

  4. [计算机组成原理,Cache总容量的计算方法]假设主存地址位数是32位,按字节编址,贮存和Cache采用全相联映射的方式,主存块大小为1个字,每字32位,采用回写法和随机替换的策略,则能存放32K字数

    下面几道题涉及到直接映射.组相联映射.全相联映射 将通过下面几道题的讲解,彻底教会Cache总容量的求法 一.概念了解 1.1 首先,我们需要知道有关Cache的一些概念 Cache为高速缓冲存储器, ...

  5. 【zz】 现代CPU Cache结构 和 陈首席对CPU Cache的讲解

    http://www.tektalk.org/2011/04/14/%e7%8e%b0%e4%bb%a3-cpu-%e4%b8%ad%e7%9a%84-cache-%e7%bb%93%e6%9e%84 ...

  6. 收缩引擎CACHE结构——中科院张俊林

    Cache是目前实用的搜索引擎都必备的功能,因为研究表明用户的查询有相当比例(30%-40%)是重复的,而且大多数重复的用户查询会在较短的间隔时间被再次重复访问.比如说目前"芙蓉姐姐&quo ...

  7. 全网最硬核 Java 新内存模型解析与实验 - 4. Java 新内存访问方式与实验

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

  8. Go 学习笔记(14)— 结构体定义、实例化、初始化、匿名结构体、结构体访问、结构体作为形参、结构体指针

    Go 语言中没有 "类" 的概念,也不支持 "类" 的继承等面向对象的概念.Go 语言不仅认为结构体能拥有方法,且每种自定义类型也可以拥有自己的方法. 1. 结 ...

  9. php 访问类成员,PHP类成员的访问方式和权限_PHP教程

    PHP5的访问方式允许限制对类成员的访问. 这是在PHP5中新增的功能,但在许多面向对象语言中都早已存在. 有了访问方式,才能开发一个可靠的面向对象应用程序,并且构建可重用的面向对象类库. 像C++和 ...

最新文章

  1. C# Socket Server 收不到数据
  2. DOS攻击之详解--转载
  3. python关键字与标识符
  4. springboot jwt token前后端分离_「转」七个开源的 Spring Boot 前后端分离项目,建议收藏加转载...
  5. 【MFC系列-第24天】梯形分页和蝴蝶QQ宠物的实现
  6. Three.js制作360度全景图
  7. 自定义依赖注解无效_SpringValidation用注解代替代码参数校验解析
  8. F#简明教程二:F#类型系统和类型推断机制
  9. PGPDesktopWin32-10.2.0 加密与签名-软件实验8
  10. 线程结束后会自动关闭_多线程学习之如何中断线程
  11. 计算机文档保存了在文件夹中找不到,word文档保存后找不到了如何解决
  12. 解决idea百度翻译无法使用的问题
  13. 信息部门人员角色划分及任职资格
  14. 诺基亚安卓手机_神速!HMD公布诺基亚手机安卓10升级计划
  15. 服务器终端输出,服务器与终端数据交互程序
  16. 为什么要学习设计模式
  17. notes java api_lotus-notes-使用Java API读取Lotus Notes文档
  18. 通过pdfjs-dist批量渲染在页面渲染pdf
  19. QT影城网上售票系统
  20. 宣讲会 策划杂谈

热门文章

  1. 使用WPF与C#实现鼠标画线
  2. 螳螂捕蝉、黄雀在后——从一个成语谈观察家模式
  3. 日语学习之——五十音图及单词(3)
  4. Description 给出一个N*N的二维数组,求出其中的最大数和其所在的行号、列号(均从0开始计算)。 Input 第1行是一个正整数N(2≤N≤10),表示二维数组的大小。后跟N行,每行N个数。
  5. OpenCV学习第十三篇:提取水平和垂直线(去除干扰线)
  6. 习题3.8 符号配对 (20 分)【满分】【c语言】
  7. 隐私合规:检测第三方SDK调用的隐私权限
  8. 移动设备上“精灵图”的制作适配
  9. JavaScript前端判断文件是否存在(案例详解)
  10. 图案设计灵感怎么写_妆容设计灵感怎么写