virtual cache基本概念

Virtual cache的引入

      

  • TLB只是加速了从虚拟地址到物理地址的转换,可以很快地得到所需要的数据(或指令)在物理内存中的位置,也就是得到了物理地址
  • 但是,如果直接从物理内存中取数据(或置指令),显然也是很慢的,因此可以使用在以前章节提到的Cache来缓存物理地址到数据的转换过程。
  • 实际上,从虚拟地址转化为物理地址之后,后续的过程就和前文讲述的内容是一样的了。
  • 因为这种Cache使用物理地址进行寻址,因此称为物理Cache(Physical Cache),使用 TLB 和物理 Cache 一起进行工作的过程如图 3. 26 所示。

存在的问题

        现在需要先访问TLB, 再访问physical cache, 必然会增加流水线的延迟;

        解决方式: 用虚拟地址来寻址cache;

            

        此时这个cache称之为virtual cache;

        既然使用虚拟Cache,可以直接从虚拟地址得到对应的数据,那么是不是就可以不使用TLB了呢?

  • 当然不是这样,因为一旦虚拟Cache发生了缺失,仍旧需要将对应的虚拟地址转换为物理地址,
  • 然后再去物理内存中获得对应的数据, 因此还需要TLB来加速从虚拟地址到物理地址的转换过程。

virtual cache带来的问题:

Aliasing 问题

       

        不同的虚拟地址,对应相同的物理地址;

        这样就会引入一个问题,虚拟地址不同,在virtual cache中会占用不同的way,但是实际上这些虚拟地址都对应的是同一个物理地址,最终导致:

        ● 浪费了宝贵的cache空间,造成cache等效容量的减少,降低了整体的性能;

        ● 当执行store时,会将数据写入虚拟地址(tag)对应的way中,但是,实际上当前cache中,有很多tag都对应的是同一个物理地址,那么其他va来读时,读不到最新的数据;

是不是所有的virtual cache都有alising问题?

         这取决于page的大小和cache的大小;

  • 假设page的大小为4KB, 则VA/PA的低12bits是完全相同的;
  • cache的大小,<=4KB, direct-mapped cache;
  • 此时索引cache的地址范围,只能在低12bit范围内;
  • 此时即使VA不同,但是他们最终索引到的way是一样的,所以,不会出现不同VA,占用多个cache entry的情况;
  • 只有cache size > 4KB时,才会出现aliasing问题;

怎么解决aliasing问题 

考虑8KB, 直接相连结构的cache的alising 问题;

         

当两个虚拟地址映射到同一个物理地址时,两个虚拟地址的第 12 位可能是 0、也可能是 1。

也就是说,此时在虚拟Cache中会有两个不同的地方存储着同一个物理地址的值;

解决方式一:

        当一个虚拟地址写Cache时,将Cache中可能出现同义问题的两个位置都进行更新,这就相当于将它们作为一个位置来看待;

  • 要实现这样的功能,就需要使用物理地址作为Cache的Tag部分(VIPT),并且能够同时将虚拟Cache中两个可能重名的位置都读取出来,这就要在Cache中使用bank的结构,
  • 例如图3.29所示的大小为8KB、直接相连结构的Cache就需要两个bank,使用虚拟地址VA[11:0]进行寻址。
  • 在写Cache时,两个bank中对应的位置都需要更新,这样在读取Cache时,也就会从两个bank中得到同一个值了;
  • 但是这样的方法相当于将Cache的容量减少了一半,显然无法在实际当中使用。

解决方式二: 分bank处理

        同样考虑8KB, 直接相连的cache; 内部分为两个4KB的bank;

    

  •  读取时:
    • 两个bank的对应位置,数据和tag都读出来;
    • VA经过TLB转换后,得到PA, 将PA和tag进行比较,和谁比得上,读谁的数据;
    • (由于物理地址需要经过TLB才可以得到,所以当Cache中两个bank输出的值送到多路选择器的时候,物理地址可能还没有从TLB中得到,这样在一定程度上增加了处理器的周期时间)
  • 写入时:其实可以同理,都比较一下,判断是否hit;

这种方式需要增加额外的逻辑,比如bank的增加,选择电路的增加;

Homonyms问题

        即相同的VA, 对应不同的PA;

        这是因为,不同的进程,会存在很多相同的虚拟地址,这些虚拟地址实际上对应的物理地址是不同的,当进程之间进行切换时,如果还是映射到上一个进程的物理地址,肯定是会有问题;

解决方式:

1. 在进程切换的时候,直接invalid所有的TLB entry;

        当进程切换很频繁时,就需要经常将TLB和虚拟Cache的内容清空,这样可能浪费了大量有用的值,降低了处理器的执行效率。

2. 给每一个进程,都赋一个ID, 称之为PID/ASID

        使用ASID相当于扩展了虚拟存储器的空间,此时仍然是每个进程可以看到整个的4GB的虚拟存储器空间,而且每个进程的4GB都互相不交叠。

        例如,当使用8位的ASID时,那么虚拟存储器就有28=256 个4GB的空间,就相当于此时虚拟存储器的空间为256×4GB=1024GB,也就是说,使用ASID就等于扩大了虚拟存储器的空间。

        

考虑这样一个问题:如果不同的进程之间,想要共享一些page的时候,如何实现?

  • 再增加一个标志位,Global(G);
  • 当一个页不只是属于某一个进程,而是被所有的进程共享时,就可以将这个Global位置为1,这样在查找页表的时候,如果发现G位是 1,那么就不需要再理会ASID的值,这样就实现了一个page被所有的进程共享的功能;

增加ASID后带来的问题

        增加ASID后,会导致地址的范围增大,从而导致页表的索引bit增多,这会导致页表过大,过大的页表会导致其内部出现碎片,降低页表的利用效率;

        为了解决这个问题,可以采用三级页表的方式,增加一个额外的页表,使用ASID进行索引;          使用这样的方式,要从虚拟地址中得到需要的数据,相比于两级页表,需要多一次物理内存的访问,这会造成TLB缺失的处理时间变长,是使用ASID带来的一个负面影响,尤其是 TLB 缺失发生的频率很高时,这种负面影响更为严重。

在使用多级页表的系统中,只有第一级页表才会常驻物理内存中,第一级页表的基地址由处理器当中专用的寄存器指定,例如图 3. 32 中的 PTR 寄存器。

  • 支持 ASID 的处理器中还会有一个寄存器来保存当前进程的 ASID值,
  • 每次操作系统创建一个进程时,就会给当前的进程分配 ASID值,并将其写到 ASID 寄存器中
  • 这个进程中所有的虚拟地址都会在前面被附上这个ASID的值。
  • 在TLB中, ASID和VPN一起组成了新的虚拟地址,参与地址的比较,这样就在TLB中对不同的进程进行了区分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集成电路的引脚分布规律及识别

集成电路的引脚分布规律根据不同的封装方式而确定&#xff0c;引脚的序号和集成电路图中的编号是一一对应的&#xff0c;识别集成电路的引脚号对分析集成电路的内部框图和工作原理&#xff0c;以及排除集成电路的故障都具有重要的意义。 1.单列集成电路引脚的分布规律及识别 …

Python 点对点的ICP配准算法(同样适用于超大点云)

目录 一、ICP精配准1.1 算法概念1.2 算法流程二、代码示例三、结果示例本教程做了算法改进,使其同样适用于超大的点云数据的配准处理。 一、ICP精配准 1.1 算法概念 点云ICP配准(Iterative Closest Point Registration)是一种将两个或多个点云数据集对齐的算法。其工作原理…

区块链技术:金融行业的信任基石

一、引言 在数字化转型的浪潮中,区块链技术以其独特的优势,正逐渐成为金融行业的信任基石。本文将深入探讨区块链技术在金融行业的应用,通过具体案例的细化和完善,分析其特点和影响。 二、区块链技术的核心特点 1. 去中心化:区块链技术通过分布式账本,实现去中心化的数…

栈和队列题目练习

本节小编选了两道题来加深对栈和队列的认识理解&#xff01; 有效的括号 方法1&#xff1a;直接用栈的结构&#xff08;动态数组&#xff09; 本题可以用栈这个结构来解答&#xff0c;将(,{,[ 左括号压入栈中&#xff0c;然后取出栈顶元素与右括号),},]匹配。不匹配的话&…

【Qt】【模型视图架构】 在项目视图中启用拖放

文章目录 1. 在便捷类中启用拖放2. 在模型/视图类中启用拖放 模型/视图框架支持Qt的拖放应用。 列表、表格和树中的项目可以在视图中被拖拽&#xff0c;数据作为MIME编码的数据被导入和导出。标准视图可以自动支持内部的拖放。 默认视图的拖放功能并没有被启用&#xff0c;如果…

前端防抖与节流使用实例

一&#xff0c;节流&#xff1a;在指定时间内的多次请求&#xff0c;只执行一次&#xff0c;比如滚轮事件&#xff0c;需要节流限制避免出发大量数据 function jythrottle(fn, interval) {let timeout;return function(){const contextthis;const args arguments;clearTimeOu…

Opencv实用笔记(一): 获取并绘制JSON标注文件目标区域(可单独保存目标小图)

文章目录 背景代码 背景 如果我们想要根据json标注文件&#xff0c;获取里面的指定目标的裁剪区域&#xff0c;那么我们可以根据以下代码来实现&#xff08;也可以校验标注情况&#xff09;。 代码 from tqdm import tqdm import os, json, cv2, copy import numpy as npdef…

opencv进阶 ——(八)图像处理之RMBG模型AI抠图

BRIA.AI团队于HuggingFace开源了一个基于ISNet背景移除模型RMBG-1.4&#xff0c;它可以有效对前景与背景进行分离。RMBG-1.4在精心构建的数据集上训练而来&#xff0c;该数据包含常规图像、电商、游戏以及广告内容&#xff0c;该方案达到了商业级性能&#xff0c;但仅限于非商业…

【PHP项目实战训练】——laravel框架的实战项目中可以做模板的增删查改功能(1)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

【管理咨询宝藏120】顶级咨询公司领导管控优化设计方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏120】顶级咨询公司领导管控优化设计方案 【格式】PDF版本 【关键词】人力资源、组织管控、领导力 【核心观点】 - 管的过细” “高层的管理要往…

【排序】冒泡排序

在我们的生活中&#xff0c;到处都离不开排序的作用&#xff0c;考试分数要排序&#xff0c;商场购物要排序&#xff0c;可以说排序对我们来说处处存在&#xff0c;那么从本章开始&#xff0c;我将要依次分享一些排序方法&#xff0c;从易到难&#xff0c;包括冒泡&#xff0c;…

随身wifi和手机流量卡,你知道该怎么选吗?

网络已经成为我们这个时代的代名词&#xff01; 那么&#xff0c;在上网的时代&#xff0c;我们有很多问题都要考虑&#xff0c;比如如何选择上网方式&#xff0c;是选择一张流量卡&#xff0c;还是一个随身WIFI&#xff1f; 听小编一句劝&#xff0c;先不要着急买&#xff0c…

接口测试工具:Postman的下载安装及使用

1 Postman 介绍 1.1 Postman 是什么 Postman 是一款功能超级强大的用于发送 HTTP 请求的 测试工具 做 WEB 页面开发和测试的人员常用工具 创建和发送任何的 HTTP 请求(Get/Post/Put/Delete...) 1.2 Postman 相关资源 1.2.1 官方网站&#xff1a;https://www.postman.com/ …

sde the Upgrade Geodatabase tool to install/upgrade system tables (-64).

数据库端迁移sde导入后&#xff0c;在sde端启动服务报错&#xff1a; ------------------------------------------------------- ArcSDE 10.0 for Oracle11g Build 685 Fri May 14 12:05:43 2010 ------------------------------------------------------- ST_Geometry Sc…

Java——面向对象初阶

前言&#xff1a; Java面向对象相关讲解 文章目录 一、面向对象二、类与对象三、封装四、构造方法及重载五、this关键字六、基本数据类型和引用数据类型七、JavaBean类 一、面向对象 面向对象&#xff08;Object-Oriented Programming, OOP&#xff09;是一种编程范式&#xff…

从handle得到GraphicBuffer

先定义一个宏&#xff1a; #ifndef container_of #define container_of(ptr, type, member) \(type *)((char*)(ptr) - offsetof(type, member)) #endif 然后&#xff1a; ANativeWindowBuffer *anwBuffer container_of(buffer, ANativeWindowBuffer, handle); 其中buffer…

C++第二十二弹---vector深度剖析及模拟实现(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、容量操作 2、内容修改操作 3、打印函数 4、迭代器失效 4.1、什么是迭代器失效 4.2、哪些操作会引起迭代器失效 总结 1、容量操作 size()…

技术速递|使用主构造函数重构 C# 代码

作者&#xff1a;David Pine 排版&#xff1a;Alan Wang 作为 .NET 8 一部分的 C# 12 引入了一组引人注目的新功能&#xff01;在这篇文章中&#xff0c;我们将探讨其中一个功能&#xff0c;特别是主构造函数&#xff0c;解释其用法和相关性。然后&#xff0c;我们将演示一个重…

华为OD刷题C卷 - 每日刷题 1

1、&#xff08;两数之和&#xff09;&#xff1a; 这段代码是针对力扣&#xff08;LeetCode&#xff09;上的“两数之和”问题。它提供了一个Java类Solution&#xff0c;其中包含一个方法twoSum&#xff0c;该方法接收一个整数数组nums和一个整数目标值target。目的是找出数组…

Idea的相关操作

1、关闭自动更新 点击左上角File->Setting&#xff0c;进入配置页面&#xff0c;点击Appearance & Behavior > System Settings > Updates&#xff0c;取消勾选更新选项&#xff0c;如图&#xff1b; 2、代码提示忽略大小写 点击左上角File->Setting&#xf…