处理器在进行存储器访问时,处理器访问的是虚拟地址,经过TLB和MMU的映射,最终变成了物理地址。那么在查询cache组的时候,需要使用虚拟地址的索引域或者物理地址的索引域(Index),同样地,在查询到cache组之后,可以使用虚拟地址的标记域或者物理地址的标记域(Tag)来匹配cache line. cache可以设计成通过虚拟地址或者物理地址来访问,这个在处理器设计的时候已经确定下来,可以分成如下三种:

  • VIVT(Virtual Index Virtual Tag):使用虚拟地址索引域和虚拟地址的标记域。
  • VIPT(Virtual Index Physical Tag):使用虚拟地址的索引域和物理地址的标记域。
  • PIPT(Physical Index Physical Tag):使用物理地址的索引域和物理地址的标记域。
    先来看一下VIVT,这种缓存模式直接使用虚拟地址的索引域和标记域来查找cache line,不经过MMU的翻译,所以查找速度会快一些。然而VIVT的方式可能会导致缓存别名(cache aliasing)的问题,也就是多个相同的虚拟地址可能会被映射到同一个物理地址(synonyms)例如进程间通信,这会导致指向同一个内存地址的虚拟地址的缓存被分开存储,所以可能产生一致性问题,比如更改了一个虚拟地址的缓存行后,与它指向相同物理地址的虚拟地址的缓存行没有更改,导致数据不一致。还有可能是相同的虚拟地址指向不同的物理地址(homonyms)(比如说在不同的进程中),仅仅依靠Virtual Index是不能区分这种情况的,不过可以通过清除缓存来解决这一问题(在进程切换的时候不清除缓存),或者可以为每个虚拟地址空间加个标记(ASID)来区分不同的地址空间。另外还有一个问题是当虚拟地址到物理地址的映射发生变化时,也需要清除一些缓存。所有的这些问题在使用VIPT之后都会迎刃而解。
    再来看一下VIPT,VIPT使用虚拟地址的索引域和物理地址的标记域来查找cache line,它可以避免homonyms问题。至于synonyms问题,以Linux kernel为例,它是以4kb为页面进行管理的,那么对于一个页来说,虚拟地址和物理地址的低12bit是相同的,所以不同的虚拟地址映射到同一个物理地址的时候,这些虚拟地址的低12bit也是相同的,在这种情况下,如果索引域在0~12bit之内,那么这些虚拟地址的cache组是相同的,同样的它们的Physical Tag也是相同的,那么这些不同的虚拟地址的cache line在cache里面是同一个,因此不会产生一致性问题。另外,VIPT其实相比VIVT也没有太大的性能缺失,按照正常的TLB命中率和一些内部的探测手段可以绕过地址翻译,那么VIPT和VIVT相比起来性能也差不多。
    最后看一下PIPT,这种方式下索引域和标记域都采用物理地址,这种方式也可以避免缓存别名问题,不过性能方面要差一些,因为要先经过地址翻译的过程。
    缓存对于CPU的性能来说很关键,所以一些L1-cache使用的是virtual index,这样至少能和TLB的查询过程一起并行地从cache中取出一组数据,然后根据TLB的结果从中选择Tag相同的那条数据。但是virtual index并不是对于所有级别的缓存都是最佳选择,缓存别名问题对于越大的缓存解决起来就越代价越大,所以一些二级或更大的缓存使用的是physical index.在过去CPU曾经使用过virtual tag和physical tag,但是现在使用virtual tag的已经不多了,毕竟如果TLB查询能够在从cache中返回数据之前结束的话,那就不需要使用virtual tag了。大的缓存都倾向于使用physical tag,只有一些小的、低延迟的缓存才使用virtual tag。在最近的通用CPU中,virtual tag已经被vhints所取代。

CPU缓存实现方式:VIVT、VIPT和PIPT相关推荐

  1. cache组织方式(VIVT、VIPT、PIPT)

    cache组织方式 本文主要讲述如何根据虚拟地址或物理地址来寻找cache,及各种方案的优劣比较.在阅读前,需要对cache基本工作原理及MMU工作原理有一定了解,比如cache的映射方式(直接映射, ...

  2. Cache的组织形式(VIVT、VIPT、PIPT)

    Cache 组织形式(VIVT.VIPT.PIPT) !!! 查看此篇文章前建议对 Cache 基本原理以及 TLB/MMU 有所了解.!!! Cache 基本原理参考 Cache的基本原理 1. 虚 ...

  3. Cache(一):VIVT、VIPT、PIPT等概要

    前面两天学习了一下Linux的内存相关的东西,但是学习内存,那必然要学习一下缓存.cache这个玩意可是老有名气了. 前面也在学习的时候看到了几个关于cache的名词,先放在前面.中间学习的时候忘了就 ...

  4. CPU CACHE中的VIPT与PIPT的工作原理

    转自CPU CACHE中的VIPT与PIPT的工作原理_Linux与SoC的博客-CSDN博客 启动信息描述 内核启动过程中有如下打印信息: CPU: PIPT / VIPT nonaliasing ...

  5. 10 张图打开 CPU 缓存一致性的大门

    前言 直接上,不多 BB 了. 正文 CPU Cache 的数据写入 随着时间的推移,CPU 和内存的访问性能相差越来越大,于是就在 CPU 内部嵌入了 CPU Cache(高速缓存),CPU Cac ...

  6. 基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程

    许多以Java多线程开发为主题的技术书籍,都会把对Java虚拟机和Java内存模型的讲解,作为讲授Java并发编程开发的主要内容,有的还深入到计算机系统的内存.CPU.缓存等予以说明.实际上,在实际的 ...

  7. CPU缓存L1/L2/L3工作原理

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 小麦大叔 来源 | 公众号「朱小厮的博客」 一 ...

  8. 高并发编程-通过volatile重新认识CPU缓存 和 Java内存模型(JMM)

    文章目录 概述 volatile定义 CPU缓存 相关CPU术语 CPU缓存一致性协议MESI 带有高速缓存的CPU执行计算的流程 CPU 多级的缓存结构 Java 内存模型 (JMM) 线程通信的两 ...

  9. 科普:CPU缓存一致性协议

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 CPU为何要有高速缓存 CPU在摩尔定律的指导下以每18个月翻一番的速度在 ...

最新文章

  1. 在 Mac OSX 版的 LispBox 环境上安装配置 SBCL 详细过程
  2. mybatis 开发环境搭建
  3. 数据结构(五)---栈的链式存储的实现---java版
  4. 自由还是霸权? TPP将撤销政府的数据主权
  5. 小程序 长按转发_微信小程序实现限制用户转发功能的实例代码
  6. Docker部署homeassitant
  7. html文字竖排垂直居中显示,CSS文字竖排效果且垂直居中水平居中
  8. 关于-O0、O1、O2、O3优化
  9. win7没有显示wifi连接到服务器地址,Win7连接wifi出现感叹号
  10. 2月面经:真可惜...拿了小米的offer,字节却惨挂在三面
  11. AR技术与VR技术有什么区别呢?
  12. ASIHTTPRequest 状态栏网络等待指示器
  13. Azure Messaging
  14. android onkeydown()简介
  15. 《深入理解 Java 虚拟机》转载周志明
  16. 2021-2025年中国兽医美容用具行业市场供需与战略研究报告
  17. python excel画图_matplotlib 画图直接写入excel
  18. 20170908一些随笔感悟
  19. 英语c开头语言,C开头的英语谚语大全带汉语
  20. SpringBoot+自定义注解实现多数据源配置

热门文章

  1. 实力凸显 | 思迈特软件入选“2022中国软件150强“等三大重磅榜单
  2. 运用js在网页中输出九九乘法表 (带边框)(附代码)
  3. 微信公众号 语音转文字api_微信新出功能太好用!免费语音转文字,秒变会议神器...
  4. Matlab绘制柱状图(非bar函数)
  5. void相关注意事项
  6. 软件工程面向对象方法画图题_软件工程试题(1)
  7. 服务器型号sc2312怎么看,HP MSA2312sa实施过程全记录
  8. 最短路径Floyd算法图解与C++实现
  9. replace的用法
  10. 【K70例程】022I2S音频驱动_SGTL5000_SDHC_MQX_K70EKT7