虚拟内存机制

虚拟内存(深入了解计算机系统) 文章目录1.物理和虚拟寻址1.1 物理寻址1.2 虚拟寻址2.虚拟内存作为缓存的工具2.1 DRAM 缓存的组织结构2.2 页表2.3 页命中2.4 缺页2.5 分配页面3 虚拟内存作为内存管理的工具4 虚拟内存作为内存保护的工具5 地址翻译5.1 结合高速缓存和虚拟内存5.2 利用TLB加速地址翻译5.3 多级页表5.4 深入理解端到端的地址理解(示例)6. Linux 虚拟内存系统6.1 Linux 缺页异常处理7 内存映射7.1 共享对象7.2 fork函数7.3 execve函数7.4 mmap函数 阅读详情

http://blog.csdn.net/zdy0_2004/article/details/44259407

虚拟内存是单机系统最重要的几个底层原理之一,它由底层硬件和操作系统两者软硬件结合来实现,是硬件异常,硬件地址翻译,主存,磁盘文件和内核的完美交互。它主要提供了3个能力:
1. 给所有进程提供一致的地址空间,每个进程都认为自己是在独占使用单机系统的存储资源
2. 保护每个进程的地址空间不被其他进程破坏,隔离了进程的地址访问
3. 根据缓存原理,上层存储是下层存储的缓存,虚拟内存把主存作为磁盘的高速缓存,在主存和磁盘之间根据需要来回传送数据,高效地使用了主存

包括几块内容
1. 虚拟地址和物理地址
2. 页表
3. 地址翻译
4. 虚拟内存相关的数据结构
5. 内存映射

虚拟地址和物理地址
对于每个进程来说,它使用到的都是虚拟地址,每个进程都看到一样的虚拟地址空间,对于32位计算机系统来说,它的虚拟地址空间是 0 - 2^32,也就是0 - 4G。对于64位的计算机系统来说,理论的虚拟地址空间是 0 - 2^64,远高于目前常见的物理内存空间。虚拟地址空间不需要和物理地址空间一样大小。
Linux内核把虚拟地址空间分为两部分: 用户进程空间和内核进程空间,两者的比例一般是3:1,比如4G的虚拟地址空间,3G用户用户进程,1G用于内核进程。
下图是一个典型的Linux进程的虚拟地址空间分布
这里写图片描述
在说CPU高速缓存的时候说过CPU只直接和寄存器和高速缓存打交道,CPU在执行进程的指令时要取一个实际的物理地址的值的时候主要有几步:
1. 把进程指令使用的虚拟地址通过MMU转换成物理地址
2. 把物理地址映射到高速缓存的缓存行
3. 如果高速缓存命中就返回
4. 如果不命中,就产生一个缓存缺失中断,从主存相应的物理地址取值,并加载到高速缓存中。CPU从中断中恢复,继续执行中断前的指令

所以高速缓存是和物理地址相映射的,进程指令中使用到的是虚拟地址。

操作系统内存管理
在缓存原理中,数据都是按块来进行逻辑划分的,一次换入/换出的数据都是以块为最小单位,这样提高了数据处理的性能。同样的原理应用到具体的内存管理时,使用了页(page)来表示块,虚拟地址空间划分为多个固定大小的虚拟页(Virtual Page, VP),物理地址空间划分为多个固定大小的物理页(Physical Page, PP), 通常虚拟页大小等于物理页大小,这样简化了虚拟页和物理页的映射。虚拟页的大小通常在4KB - 2MB之间。在JVM调优的时候有时候会使用2MB的大内存页来提高GC的性能。
要明白一个重要的概念:
1. 对于CPU来说,它的目标存储器是物理内存,使用高速缓存做物理内存的缓存
2. 同样,对于虚拟内存来说,它的目标存储器是磁盘空间,使用物理内存做磁盘的缓存

所以,从缓存原理的角度来理解,在任何时刻,虚拟页的集合都分为3个不相交的子集:
1. 未分配的页,即没有任何数据和这些虚拟页关联,不占用任何磁盘空间
2. 缓存的页,即已经分配了的虚拟页,并且已经缓存在具体的物理页中
3. 未缓存的页,即已经为磁盘文件分配了虚拟页,但是还没有缓存到具体的物理页中

页表
页表(page table)是存放在主存中的,每个进程维护一个单独的页表。它是一种管理虚拟内存页和物理内存页映射和缓存状态的数据结构。它逻辑上是由页表条目(Page Table Entry, PTE)为基本元素构成的数组。
1. 数组的索引号对应着虚拟页号
2. 数组的值对应着物理页号
3. 数组的值可以留出几位来表示有效位,权限控制位。有效位为1的时候表示虚拟页已经缓存。有效位为0,数组值为null时,表示未分配。有效位为0,数组值不为null,表示已经分配了虚拟页,但是还未缓存到具体的物理页中。权限控制位有可读,可写,是否需要root权限
这里写图片描述
DARM缓存的命中称为页命中,不命中称为缺页。举个例子来说,
1. CPU要访问的一个虚拟地址在虚拟页3上(VP3),通过地址翻译硬件从页表的3号页表条目中取出内容,发现有效位0,即没有缓存,就产生一个缺页异常
2. 缺页异常调用内核的缺页异常处理程序,它会根据替换算法选择一个DRAM中的牺牲页,比如PP3。PP3中已经缓存了VP4对应的磁盘文件的内容,如果VP4的内容有改动,就刷新到磁盘中去。然后把VP3对应的磁盘文件内容加载到PP3中。然后更新页表条目,把PTE3指向PP3,并修改PTE4,不再指向PP3.
3. 缺页异常处理程序返回后重新启动缺页异常前的指令,这时候虚拟地址对应的内容已经缓存在主存中了,页命中也可以让地址翻译硬件正常处理了

磁盘和主存之间传送页的活动叫做交换(swapping)或者页面调度(页面调入,页面调出)。现代操作系统都采用按需调度的策略,即不命中发生时才调入页面。操作系统都会在主存中分配一块交换区(swap)来作缓冲区,加速页面调度。
由于页的交换会引起磁盘流量,所以具有好的局部性的程序可以大大减少磁盘流量,提高性能。而如果局部性不好产生大量缺页,从而导致不断地在磁盘和主存交换页,这种现象叫缓存颠簸。可以用Unix的函数getrusage来统计缺页的次数

现代操作系统都采用多级页表的方式来压缩页表的大小。举个例子,
1. 对于32位的机器来说,支持4G的虚拟内存大小,如果每个页表是4KB大小,那么采用一级页表的话,需要10^6(1MB)个页表条目PTE。32位机器的页表条目是4个字节,那么页表需要4MB大小的空间。
2. 假设使用4MB大小的页,那么只需要1KB的页表项。假设每个4MB大小的页又分为4KB大小的子页,那么每个4MB大小的页需要1KB的页表项来指向子页。也就是说可以分为两级页表,第一级页表项只需要1KB的页表项,每个一级页表项又指向一个1KB的二级页表项,二级页表项则指向实际的物理页。

页表项加载是按需加载的,没有分配的虚拟页不需要建立页表项, 所以可以一开始只建立一级页表项,而二级页表项按需创建,这样大大压缩了页表的空间。Core i7采用4级页表的结构
这里写图片描述

地址翻译
地址翻译就是把N个元素的虚拟地址空间(VAS)映射到M个元素的物理地址空间(PAS)的过程。下表是地址翻译时用到的符号
这里写图片描述
下面看一下CPU如何把一个虚拟地址翻译到对应的物理地址。
1. CPU有一个专门的页表基地址寄存器(page table base register, PTBR)指向当前页表的基地址,从而可以快速定位到该进程的页表
2. n位的虚拟地址划分为p位的虚拟地址偏移量VPO和(n - p)位的虚拟页号VPN
3. 物理地址同样划分为p位的物理地址偏移量PPO和(m - p)位的物理页号PPN
4. 由于虚拟页大小和物理页大小相同,所以VPO = PPO

这里写图片描述

页面的命中完全由硬件完成,缺页则由硬件和内核共同完成

这里写图片描述
总结一下地址翻译的过程:
1. CPU拿到一个虚拟地址,分为两步,先通过页表机制确定该地址所在虚拟页的内容是否从磁盘加载到物理内存页中,然后通过高速缓存机制从该物理地址中取到数据
2. 地址翻译硬件要把这个虚拟地址翻译成一个物理地址,从而可以再根据高速缓存的映射关系,把这个物理地址对应的值找到
3. 地址翻译硬件利用页表数据结构,TLB硬件缓存等技术,目的只是把一个虚拟地址映射到一个物理地址。要记住DRAM缓存是全相联的,所以一个虚拟地址和一个物理地址是动态关联的,不能直接根据虚拟地址推导出物理地址,必须根据DRAM从磁盘把数据缓存到DRAM时存到页表时存的实际物理页才能得到实际的物理地址,用物理页PPN + VPO就能算出实际的物理地址 (VPO = PPO,所以直接用VPO即可)。 PPN的值是存在页表条目PTE中的。地址翻译做了一堆工作,就是为了找到物理页PPN,然后根据VPO页面偏移量,就能定位到实际的物理地址。
4. 得到实际物理地址后,根据高速缓存的原理,把一个物理地址映射到高速缓存具体的组,行,块中,找到实际存储的数据。

AI测试:手把手教你用AI生成测试用例并支持导出Excel「喂饭教程」 如果我告诉你,有一种方法,你只需要输入需求内容,AI就能自动帮你设计出结构清晰、覆盖全面的测试用例,并直接生成一份精美的Excel表格,你会不会心动? 阅读详情

相关推荐

蛋白质组学进阶指南 | (八)差异蛋白筛选与功能解析实战

本文是蛋白质组学差异蛋白筛选与功能解析的实战指南。详细讲解了如何利用R语言的limma包进行差异表达分析,结合FDR校正和差异倍数设定筛选关键蛋白,并通过火山图可视化结果。进一步介绍了使用clusterProfiler进行GO与KEGG功能富集分析,以及利用STRING数据库和Cytoscape构建蛋白互作网络以识别枢纽分子,最终串联分析形成可验证的生物学假说。

weixin_29208077的博客 664

虚拟内存详解

CASPP之虚拟内存

qq_45335146的博客 1万+

【原创】Ubuntu20.04 安装 Isaac Gym 仿真器

Ubuntu20.04 安装 Isaac Gym

qq_54900679的博客 3019

虚拟内存及内存管理机制

图源自 小林coding。

qq_43710228的博客 1689

虚拟内存介绍

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为「连续的虚拟内存地址」,以借此「欺骗」程序,使它们以为自己正在使用一大块的「连续」地址。

General_zy的博客 9747

SBM与超效率SBM模型实战:从原始面板数据到MATLAB高效实现

本文详细介绍了SBM模型与超效率SBM模型的核心原理,并提供了从原始面板数据预处理到MATLAB高效实现的完整实战指南。通过具体代码解析,帮助研究者掌握如何利用MATLAB进行数据标准化、模型构建、效率求解及结果可视化,从而精准评估决策单元的相对效率,尤其适用于在高效单元中进一步精细排名的场景。

weixin_29100399的博客 430

虚拟内存原理介绍

我们知道系统中的所有进程都是共享CPU和主存资源,但这样就会存在一个问题,这么多进程怎么知道主存上的一块内存是已分配给了其它进程还是空闲状态。所有我们需要一种机制来专门负责操作系统上内存资源的管理,而虚拟内存就充当这样一个角色。虚拟内存是操作系统提供的一种内存管理技术,是对主存的一种抽象。由硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。

子居的博客 1450

MT9V034摄像头学习笔记(一)_mt9v034摄像头循迹代码(1)

函数名称:uint8_t SCB_RegRead(uint8_t Device,uint8_t Address,uint16_t *Data)* 函数名称:uint8_t SCB_RegWrite(uint8 Device,uint8 Address,uint16 Data)* 函数名称:uint8 SCCB_SendByte(uint8 Data)* 函数名称:uint8 SCCB_ReadByte(void)* 修改时间:2018年3月4日。* 修改时间:2018年3月4日。

2401_87555661的博客 882

【虚拟内存机制】

页表当中存放的是虚拟地址与物理地址的映射,当映射的物理地址存在,则直接从物理内存中取出数据,如果不存在,则需要进行页面置换,从磁盘当中换入所需要的页面。也就相当于虚拟地址 = 物理内存 + 磁盘。

小呆鸟blog 860

Linux 虚拟内存机制

华为面试官问了我一个问题就是关于Linux虚拟内存机制,虽然我多少是回答上来,感觉好久没看操作系统的我是时候将其拿起来重温一遍 。 每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构。 Linux内存管理采用的是页式管理,使用的是多级页表,动态地址转换机构与主存、辅存共...

chongqie9010的博客 910

ESP32蓝牙广播数据自定义指南:让你的设备更容易被手机发现

本文详细介绍了如何通过自定义ESP32蓝牙广播数据提升设备在手机端的可发现性。从广播数据结构、扫描响应优化到跨平台兼容性设置,提供了全面的技术指南和实战代码示例,帮助开发者解决智能硬件开发中的蓝牙连接难题。

weixin_29172201的博客 258

【简单说下】REDIS的虚拟内存机制,会吗?别翻书

!!最近的自己在涉及高并发和REDIS的相关知识点的深挖以及基础夯实,其中在学习REDIS中的有一点,我认为很有必要写篇博客进行记录下REDIS的虚拟内存机制,学过操作系统,想必大家也知道也有个虚拟内存机制(这里我们OS和REDIS有什么呢?~思考下,后面我们一起看,看完就懂了)

aristo 1365

超速U盘选购避坑指南:如何通过Rx Detect机制识别真伪USB3.0设备

本文深入解析了USB 3.0超速U盘的选购避坑要点,重点介绍了通过Rx Detect机制识别真伪设备的核心原理。文章提供了从软件检测到实际性能测试的完整方案,帮助消费者和技术人员有效辨别虚假的USB3.0设备,确保获得真正的超速传输体验。

weixin_29189373的博客 423

虚拟内存的机制

虚拟内存的机制概述物理寻址和虚拟寻址1. 物理寻址2. 虚拟寻址地址空间虚拟内存作为缓存工具DRAM&SRAM缓存的组织结构页表Virtual Address 转成 Physical Address 概述 虚拟内存:为每个进程提供了一个非常大的,一致的和私有的地址空间。虚拟内存提供了以下的三个关键能力: 它将主存看成是一个存储在磁盘空间上的地址空间的高速缓存,主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据。 它为内阁进程提供了一致的地址空间,简化了内存管理。 它保护了每个进程的地址空

weixin_44284014的博客 908

linux虚拟内存实现机制,虚拟内存机制浅析

现在的操作系统基本上都实现了虚拟内存的功能。本文就简单的记录一下我对虚拟内存的理解。1. 虚拟内存的作用1.1 便于写程序,特别是多进程环境下的程序。想象一下,如果每个程序都要在固定的物理地址执行,读取指定物理地址处的数据,那么多个程序如何共存,数据如何保护?有了虚拟内存这一层,每个程序都运行在自己相对独立的虚拟空间中,不需要考虑别的程序。1.2 可以访问比物理内存多的虚拟空间理论上程序可以访问虚...

weixin_35950078的博客 495

AUTOSAR进阶图解==>AUTOSAR_SWS_BSWGeneral

本文详细解析AUTOSAR基础软件(BSW)模块的通用规范,涵盖其分层架构、配置管理、初始化流程和状态转换机制。AUTOSAR采用清晰的分层设计,包括应用层、服务层、ECU抽象层和微控制器抽象层,各层模块通过标准化接口交互。BSW模块配置采用类型化定义,支持预初始化、初始化和后期构建配置。文档还阐述了模块初始化流程中的依赖管理,以及运行时的状态转换与错误处理机制,为汽车电子控制单元的标准化开发提供规范指导。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1099

Linux虚拟内存:原理、机制与优化

Linux虚拟内存:原理、机制与优化

weixin_46619605的博客 1458

YOLO26改进策略【Neck】| ICCV2025 反向卷积 Converse2D 数学逆运算提重构 + 特征域建模降伪影,提升多尺度目标检测精度

本文记录的是利用Converse2D 算子改进 YOLO26 的上采样。(Converse 2D Convolution)通过正则化最小二乘闭式解与深度化空间建模结合,实现YOLO26特征提取与上采样阶段的卷积逆运算及特征精准重构。本文利用算子,通过闭式解的非迭代计算还原卷积下采样后的原始特征,再通过可学习核与自适应正则化参数稳定逆问题求解,同时依托圆形填充与插值初始估计保留特征高频细节,对YOLO26中不同尺度检测目标的特征进行针对性重构强化、抑制卷积/转置卷积带来的伪影与信息损失干扰,在特征融合与上采样

Limiiiing的博客 616

虚拟内存、分页机制

目录1. 虚拟内存1.1 linux进程内存布局内核空间(kernel space)(1G)用户空间(3G)1.2 分页1.3 页表页表项的结构1.4 加速分页过程转换检测缓冲区软件TLB管理1.5 针对大内存的页表多级页表倒排页表 1. 虚拟内存 虚拟内存的基本思想:每个程序都有自己的地址空间,这个空间被分割成多个块,每一个块被称作一页或页面。每一页有连续的地址范围。这些页被映射到物理内存,但并...

你又来看我了,一起学习吧 1万+

深入了解 Linux 的虚拟内存管理机制:Swap 机制

Swap 空间是硬盘或固态硬盘(SSD)上专门用来扩展虚拟内存的区域。当物理内存不足时,操作系统会将一些内存页交换到磁盘上的 Swap 空间,以释放内存供其他进程使用。Swap 是一种虚拟内存技术,它能够在物理内存不够用时,确保系统继续运行,但由于磁盘的读写速度远远低于内存,因此 Swap 空间的访问速度较慢。Swap 是 Linux 中重要的虚拟内存管理机制,它通过将不活跃的内存数据转移到磁盘,确保系统在内存不足时仍能稳定运行。

缘友一世的博客 2469

1942-2022全国400多个气象站气候数据【重磅,更新!!!】

完整数据-全国400多个气象站气候数据1942-2022本次收集到的气象资料为1942-2022全国400多个气象站气候数据,数据来自美国国家气候数据中心(NCDC)整理成EXCEL格式,以供科研工作者方便使用。本站免费提供自1942年以来的中国地面气象数据下载。数据源为NCDC(美国国家气候数据中心,NaionalCimaic DataCenter),隶属于NOAA(美国国家海洋及大气管理局,NationalOceanicandAtmosphericAdministration)。时间范围:1942年至2022年(目前更新至10月)。。时间精度:近年的数据大多为3小时数据,少量站点有1小时数据。站点数量:近年为400多个。气象要素:气温、气压、露点、风向风速、云量、降水量,

虚拟内存,映射,分页机制

这是我找到的关于虚拟内存和分页机制的我个人比较容易理解的一篇文章。 虚拟存储器的思想是程序、数据和堆栈的大小都有可能超过物理内存大小,由操作系统把当前使用的放在内存,而不需要的放在磁盘。          而绝大部分操作系统使用的虚拟存储器技术就是分页技术。          在虚拟存储器中,程序所产生的地址为虚拟地址,虚拟地址构成了虚拟地址空间。(当然了在没有虚拟存储器的系统上,程序产

阿草 5109

夜神模拟器_setup_v6.0.7.5_full.zip

经典版本来一下

虚拟内存(分页机制)

以前的一片文章讲了为什么会出现分页, 是为了解决什么问题? 首先澄清一个概念.其实虚拟内存和分页是两件事, 分页是指将把地址空间人为地等分成固定大小的页, 这个页的粒度比段更小, 以方便在外存与内存换入换出, 而虚拟内存是为了解决线性地址与物理地址之间的相等关系, 因为如果这样, 线性地址是由编译器翻译出来的, 它本身是连续的, 而物理地址也必须连续才行, 但物理内存往往在运行时间长了之后, 成为各个碎片, 这就导致物理地址很难成为连续的(所以平时使用完电脑要记得关机), 所以要建立一种线性地址与物理地址之

qq_43811102的博客 2326
上一篇: 模板两种特化
下一篇: Labview-学习
DDHKing
博客等级 码龄10年 8粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值