页表和cache

页表基本原理

页表主要用来将虚拟地址映射到物理地址,在使用虚拟地址访问内存时,微处理器首先将虚拟地址拆分成页号和页内偏移量,然后使用页号在页表中查找对应的物理页框号,将物理页地址加上页内偏移量,得到最终的物理地址。
32位系统中,当页大小为4KB时,如要覆盖4GB内存,需要1M个页项,如果页项是连续的,每个页项占4字节的话,页表总共需要4MB。

虚拟地址组成:

20位12位
页号页内偏移

4MB如果在进程运行前都准备好,对于进程来说空间占用太大了。可以考虑用多级页表,实现动态分配,假如分两级,每级各占10比特:

10位10位12位
页目录项(Page Directory Entry,PDE)页表表项(Page Table Entry,PTE)页内偏移(Page Offset)

一个页目录项可以覆盖210个页,也就是1MB内存。

cache基本原理

cache是为了缓存经常用到的内存数据。
先不考虑缓存的是物理地址还是虚拟地址。

cache以cache line为单位进行缓存,如果cache line是8字节,那这8字节会一起加载到cache中,要失效也是一起失效。

直接映射缓存

下图是一个64字节大小的cache,data array中每行是一个cache line,cache line有一个D位,表示数据是否dirty。
直接映射缓存

cache将地址分为3部分:tag index offset。

offset是地址在cache line中的偏移,该例中cache line是8字节,所以需要3比特。
index是地址在data array中的索引,该例中cache size是64字节,cache line是8字节,所以data array有8行,index需要3比特。

地址 0x14 和 0x654 都映射到cache中一个位置,那怎么区分存储的是哪个数据呢,靠比较tag。
1个tag对应1个cache line,所以offset位不需要考虑,对比tag的时候已经定位到具体的行了,index位也是固定的了,所以tag只需要记录除offset和index外的位,该例中是32-3-3=26位。tag array和data array容量相同,并且一一对应,如果tag是 0x19,就表示当前cache line的起始地址是 0x650。

26位3位3位
tagindexoffset

我们可以从图中看到tag旁边还有一个valid bit,用来表示cache line中数据是否有效。当系统刚启动时,cache中的数据都应该是无效的。所以,上述比较tag确认cache line是否命中之前还会检查valid bit是否有效。只有在有效的情况下,比较tag才有意义。如果无效,直接判定cache缺失。

图中这种方式叫直接映射缓存,它对地址的缓存是循环的,0x00,0x40,0x80…开始的8字节都映射到同一个cache line中。
系统启动后,当我们访问 0x00 地址时,cache会缺失,然后数据会从主存加载到cache中第0行cache line。当我们访问0x40地址时,依然索引到cache中第0行cache line,由于此时cache line中存储的是地址0x00地址对应的数据,所以此时依然会cache缺失。然后从主存中加载0x40地址数据到第0行cache line中。同理,继续访问0x80地址,依然会cache缺失。这就相当于每次访问数据都要从主存中读取,访问0x40地址时,就会把0x00地址缓存的数据替换。这种现象叫做cache颠簸(cache thrashing)。

多路组相连缓存

针对这个问题,引入多路组相连缓存。我们首先研究下最简单的两路组相连缓存。
两路相连缓存
data array中竖着叫路,横着叫组。将64字节cache分成两路,之前data array有8行,现在有两个data array,所以只有4行了,index也只需要2比特了。tag还是占除index和offset外的所有位。
根据index找到是哪组,然后将组内的所有cache line对应的tag取出来和地址中的tag部分对比,如果其中一个相等就意味着命中。就像链表一样。
据说会降低cache颠簸的频率。

直接映射缓存是组相连缓存的一种特殊情况,每个组只有1个cache line,它只有1路。全相连缓存是另一种特殊情况,它只有1组。

cache size = 2index位数 * 路数 * 2offset位数 = 路数 * 2(index位数+offset位数)

cache组织方式

PIPT和VIPT

如果cache缓存的是物理地址,称为PIPT,Physically Indexed Physically Tagged。CPU发出的虚拟地址经过MMU转换成物理地址,再将物理地址发往cache控制器查找确认是否命中cache。

如果缓存的是虚拟地址,称为VIVT,Virtually Indexed Virtually Tagged。虚拟地址直接送到cache控制器,如果cache hit,直接从cache中返回数据给CPU,如果cache miss,则把虚拟地址发往MMU,经过MMU转换成物理地址,从主存读取数据。

缓存命中的时候,相比PIPT,VIVT少了虚拟地址到物理地址的转换。但是VIVT有歧义和别名的问题。
歧义是指不同的数据在cache中具有相同的tag和index。假设A进程虚拟地址0x4000映射物理地址0x2000,B进程虚拟地址0x4000映射物理地址0x3000。当A进程运行时,访问0x4000地址会将物理地址0x2000的数据加载到cache中。当切换到B进程的时候,B进程访问0x4000会怎样?当然是会cache hit,B进程本来想得到物理地址0x3000对应的数据,但是却由于cache hit得到了物理地址0x2000的数据。进程切换的时候flush cache可以避免歧义问题。
同一个物理地址的数据被加载到不同的cache line中就会出现别名现象。比如虚拟地址0x2000和0x4000(二者在不同的cache line中)都映射到相同的物理地址0x8000,这意味着进程既可以从0x2000读取数据,也能从地址0x4000读取数据。这是由页表的多对一导致的。一个解决方法是,让映射到同一物理地址的虚拟地址,在cache中也有相同的地址。但这只对直接映射缓存有效,细节后面会详细说。

VIPT

为了提升cache查找性能,我们不想等到虚拟地址转换物理地址完成后才去查找cache。因此,我们可以使用虚拟地址对应的index位查找cache,与此同时(硬件上同时进行)将虚拟地址发到MMU转换成物理地址。二者都完成时,比较cache line对应的tag和物理地址,以此判断是否命中cache。我们称这种方式为VIPT(Virtually Indexed Physically Tagged)。

cache line对应的tag可以使用完整的物理地址。此时不会有歧义问题,比如之前例子中,B进程访问0x4000时会发现tag不同,于是cache miss。由于物理地址和虚拟地址的低12位是相同的,cache line对应的tag可以只存物理地址的高20位,对比的时候将其加上地址的低12位便是完整的物理地址了。

别名问题是因为虚拟地址和物理地址多对一导致的,只要物理地址相同的虚拟地址,也在相同的cache地址中就不会有问题。也就是让这些虚拟地址的index位和offset位相同。
当index位和offset位之和不大于12时,各个虚拟地址的低12位和物理地址的低12位本就相同,所以index位和offset位也必然相同,此时不存在别名问题。
当index位和offset位之和大于12时,为同一物理地址分配多个虚拟地址时,则要保证虚拟地址的index位和offset位相同,可以让其全为0,也就相当于按“cache size/路数”对齐了。

这种方法在VIVT中只对直接映射缓存有效。因为在多路组相连缓存中,对应同一物理地址的多个虚拟地址会映射到同一组中,如果是Virtually Tagged,因为tag不同,它们会定位到不同的路中。

PIVT

不存在,因为PIVT方式首先要通过MMU转换成物理地址,然后才能根据物理地址index域查找cache,既然都有了物理地址,干嘛不直接用PIPT。

参考

Cache的基本原理
Cache组织方式

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

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

相关文章

IDEA高效编程快捷键

IDEA高效编程快捷键 for循环快捷键 快速生成for循环 foriTABfor (int i 0; i < ; i) {}在for循环中使用索引 iterTABfor (String s : list) {}在for循环中进行if条件判断 ifnTABif (list null) {} soutTAB快捷键 System.out.println();psfEnter快捷键 p…

arcgis 网络分析 生成可达范围/等时线

需求&#xff1a;生成从地铁站步行10分钟可达的范围面图层。 线图层预处理 在精度要求不是很高的情况下&#xff0c;可采用OSM路网&#xff0c;从中剔除不允许步行的道路类型&#xff1a;高速公路、快速路。 在路网图层中新增一个字段“步行时间”&#xff0c;用字段计算器&…

C++之map的介绍

C之map的介绍 1。定义和初始化 map可以使用一对<key, value>来初始化&#xff0c;如下所示&#xff1a; std::map<int, std::string> my_map { {1, "one"}, {2, "two"}, {3, "three"} };这将创建一个map&#xff0c;其中键是整数&…

Three.js 实现简单的PCD加载器(可从本地读取pcd文件)【附完整代码】

1 功能实现 初始会显示我们之前 SfM 做出的点云&#xff0c;包括相机位置可以点击右上角加载你本地的PCD文件可以通过选择多个文件加载多个点云并显示在同一场景中可以通过左上角的控制界面查看/调整点云的属性&#xff0c;如点大小、颜色等可以通过右上角的控制界面选择旋转 …

【考研数据结构代码题3】用栈实现十进制数转为八进制数

题目&#xff1a;将十进制数m1348转换成八进制数 难度&#xff1a;★ 算法思路&#xff1a;十进制转八进制的核心原理是“用辗转相除法不断对8取余&#xff0c;最后将余数反向输出”&#xff0c;即先求出来的余数后输出&#xff0c;符合“先进后出”的栈的特性&#xff0c;故设…

AI:71-基于深度学习的植物叶片识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

dRep-基因组质控、去冗余及物种界定

文章目录 Install依赖关系 常用命令常见问题pplacer线程超过30报错当比较基因组很多&#xff08;>4096&#xff09;有了Bdv.csv文件后无需输入基因组list 超多基因组为什么需要界定种&#xff1f;dRep重要概念次级ANI的选择Minimum alignment coverage3. 选择有代表性的基因…

linux 操作系统

先讲一下叭&#xff0c;自己学这的原因&#xff0c;是因为我在做项目的时候使用到啦Redis&#xff0c;其实在windows系统上我其实也装啦Redis上&#xff0c;但是我觉得后期在做其他的项目的时候可能也会用到这个然后就想着要不先学学redis&#xff0c;然后在后面也不至于什么都…

解决 matplotlib 中文字体无法显示问题

问题表现 使用 matplotlib 呈现出图片中文为方框□&#xff0c;表现如下所示 查找了以下解法&#xff1a; from matplotlib.font_manager import FontProperties # 指定字体路径 font_properties FontProperties(fname"./SimHei.ttf") plt.rcParams[font.family]…

【Docker安装RockeMQ:基于Windows宿主机,并重点解决docker rocketMQ安装情况下控制台无法访问的问题】

拉取镜像 docker pull rocketmqinc/rocketmq创建网络 docker network create rocketmq-net构建namesrv容器 docker run -d -p 9876:9876 -v D:/dockerFile/rocketmq/namesrv/logs:/root/logs -v D:/dockerFile/rocketmq/namesrv/store:/root/store --network rocketmq-net -…

图论——Dijkstra算法matlab代码

Dijkstra算法步骤 (1)构造邻接矩阵 (2)定义起始点 (3)运行代码 M=[ 0 5 9 Inf Inf Inf InfInf 0 Inf Inf 12 Inf InfInf 3 0 15 Inf 23 InfInf 6 Inf 0 Inf 8 7Inf 12 Inf 5 0 I…

lightdb Oracle模式下to_char支持格式‘HH24MiSS‘

文章目录 背景示例其他 背景 TO_CHAR(日期类型, 格式串) 函数根据格式串要求将日期类型的数据转为字符串&#xff0c; 以格式串HH24MISS举例&#xff0c;在Oracle中Hh24MiSS hh24miss结果都是一致的。 如下示例&#xff1a; SQL> select to_char(sysdate, HH24MISS) c1 …

计算机网络学习笔记(五):运输层(待更新)

目录 5.1 概述 5.1.1 TCP协议的应用场景 5.1.2 UDP协议的应用场景 5.2 三大关系 5.2.1 传输层协议和应用层协议之间的关系 5.3 用户数据报协议UDP(User Datagram Protocol) 5.3.1 UDP的特点 5.3.2 UDP的首部 5.4 传输控制协议TCP(Transmission Control Protocol) 5.…

obs whip 100ms端到端时延 webrtc验证

obs----whip---->媒体服务-----whep-----→chrome播放器&#xff08;webrtc demo&#xff09; 所有软件在同一台机器 1&#xff09;h264251080p 平均时延&#xff1a;162.8ms 采样点ms&#xff1a;167151168169151168166168167153 2&#xff09;h264301080p 平均时延&…

torch.mm

torch.mm(input, mat2, *, outNone) → Tensor执行矩阵input和mat2的矩阵乘法运算。 如果input是&#xff08;nm&#xff09;张量&#xff0c;mat2是&#xff08;mp&#xff09;张量&#xff0c;out将是&#xff08;n x p&#xff09;张量。 input&#xff08;张量&#xff0…

栈回溯之CmBacktrace

简介 CmBacktrace &#xff08;Cortex Microcontroller Backtrace&#xff09;是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位&#xff0c;错误原因自动分析的开源库。主要特性如下&#xff1a; 支持的错误包括&#xff1a; 断言&#xff08;assert&#xff09;…

Matplotlib数据可视化综合应用Matplotlib图形配置在线闯关_头歌实践教学平台

Matplotlib数据可视化综合应用图形配置 第1关 配置颜色条第2关 设置注释第3关 自定义坐标刻度第4关 配置文件与样式表 第1关 配置颜色条 任务描述 本关任务&#xff1a;使用colorbar绘制一个热成像图。 编程要求 在右侧编辑器Begin-End处补充代码&#xff0c;根据输入数据绘制…

P1529 [USACO2.4] 回家 Bessie Come Home 题解

文章目录 题目描述输入格式输出格式样例样例输入样例输出 提示完整代码 题目描述 现在是晚餐时间&#xff0c;而母牛们在外面分散的牧场中。 Farmer John 按响了电铃&#xff0c;所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓&#xff08;在给出的测试数…

【数据结构】单链表之--无头单向非循环链表

前言&#xff1a;前面我们学习了动态顺序表并且模拟了它的实现&#xff0c;今天我们来进一步学习&#xff0c;来学习单链表&#xff01;一起加油各位&#xff0c;后面的路只会越来越难走需要我们一步一个脚印&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x…

Vue中模板语法与el 和 data 的两种写法

模板语法 标签语法 //在.html文件中 <body><h3>{{name}}</h3> </body> <script>new Vue({el:#root,data:{name:jack,url:网页地址}}) </script> 指令语法 标签语法和指令语法的简单区分&#xff0c;就是指令语法用v-on,v-bind,v-model指…