CPU缓存实现方式:VIVT、VIPT和PIPT
处理器在进行存储器访问时,处理器访问的是虚拟地址,经过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相关推荐
- cache组织方式(VIVT、VIPT、PIPT)
cache组织方式 本文主要讲述如何根据虚拟地址或物理地址来寻找cache,及各种方案的优劣比较.在阅读前,需要对cache基本工作原理及MMU工作原理有一定了解,比如cache的映射方式(直接映射, ...
- Cache的组织形式(VIVT、VIPT、PIPT)
Cache 组织形式(VIVT.VIPT.PIPT) !!! 查看此篇文章前建议对 Cache 基本原理以及 TLB/MMU 有所了解.!!! Cache 基本原理参考 Cache的基本原理 1. 虚 ...
- Cache(一):VIVT、VIPT、PIPT等概要
前面两天学习了一下Linux的内存相关的东西,但是学习内存,那必然要学习一下缓存.cache这个玩意可是老有名气了. 前面也在学习的时候看到了几个关于cache的名词,先放在前面.中间学习的时候忘了就 ...
- CPU CACHE中的VIPT与PIPT的工作原理
转自CPU CACHE中的VIPT与PIPT的工作原理_Linux与SoC的博客-CSDN博客 启动信息描述 内核启动过程中有如下打印信息: CPU: PIPT / VIPT nonaliasing ...
- 10 张图打开 CPU 缓存一致性的大门
前言 直接上,不多 BB 了. 正文 CPU Cache 的数据写入 随着时间的推移,CPU 和内存的访问性能相差越来越大,于是就在 CPU 内部嵌入了 CPU Cache(高速缓存),CPU Cac ...
- 基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程
许多以Java多线程开发为主题的技术书籍,都会把对Java虚拟机和Java内存模型的讲解,作为讲授Java并发编程开发的主要内容,有的还深入到计算机系统的内存.CPU.缓存等予以说明.实际上,在实际的 ...
- CPU缓存L1/L2/L3工作原理
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 小麦大叔 来源 | 公众号「朱小厮的博客」 一 ...
- 高并发编程-通过volatile重新认识CPU缓存 和 Java内存模型(JMM)
文章目录 概述 volatile定义 CPU缓存 相关CPU术语 CPU缓存一致性协议MESI 带有高速缓存的CPU执行计算的流程 CPU 多级的缓存结构 Java 内存模型 (JMM) 线程通信的两 ...
- 科普:CPU缓存一致性协议
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 CPU为何要有高速缓存 CPU在摩尔定律的指导下以每18个月翻一番的速度在 ...
最新文章
- 在 Mac OSX 版的 LispBox 环境上安装配置 SBCL 详细过程
- mybatis 开发环境搭建
- 数据结构(五)---栈的链式存储的实现---java版
- 自由还是霸权? TPP将撤销政府的数据主权
- 小程序 长按转发_微信小程序实现限制用户转发功能的实例代码
- Docker部署homeassitant
- html文字竖排垂直居中显示,CSS文字竖排效果且垂直居中水平居中
- 关于-O0、O1、O2、O3优化
- win7没有显示wifi连接到服务器地址,Win7连接wifi出现感叹号
- 2月面经:真可惜...拿了小米的offer,字节却惨挂在三面
- AR技术与VR技术有什么区别呢?
- ASIHTTPRequest 状态栏网络等待指示器
- Azure Messaging
- android onkeydown()简介
- 《深入理解 Java 虚拟机》转载周志明
- 2021-2025年中国兽医美容用具行业市场供需与战略研究报告
- python excel画图_matplotlib 画图直接写入excel
- 20170908一些随笔感悟
- 英语c开头语言,C开头的英语谚语大全带汉语
- SpringBoot+自定义注解实现多数据源配置
热门文章
- 实力凸显 | 思迈特软件入选“2022中国软件150强“等三大重磅榜单
- 运用js在网页中输出九九乘法表 (带边框)(附代码)
- 微信公众号 语音转文字api_微信新出功能太好用!免费语音转文字,秒变会议神器...
- Matlab绘制柱状图(非bar函数)
- void相关注意事项
- 软件工程面向对象方法画图题_软件工程试题(1)
- 服务器型号sc2312怎么看,HP MSA2312sa实施过程全记录
- 最短路径Floyd算法图解与C++实现
- replace的用法
- 【K70例程】022I2S音频驱动_SGTL5000_SDHC_MQX_K70EKT7