虚拟内存

如何为你的Ubuntu添加虚拟内存 小树 | 如何为你的Ubuntu添加虚拟内存。 阅读详情

虚拟内存

出现

为了更加有效的管理内存并且减少出错,现代系统提供了一种对主存的抽象概念—虚拟内存(VM)。

虚拟内存提供的三个重要能力
  • 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效的使用了主存

  • 它为每个进程提供了一致的地址空间,从而简化了内存管理

  • 它保护了每个进程的地址空间不被其他进程破坏

物理寻址

计算机系统主存被组织成一个由M个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址(PA)。

CPU访问内存最直接的方法就是直接使用物理地址。

下图展示了一个使用物理寻址的例子:

图1.png

该例子上下文为一条加载指令,它读取从物理地址4处开始的4字节字,当CPU执行这条加载指令时,会生成一个有效的物理地址,通过内存总线,把它传递给主存。主存取出从物理地址4处开始的4字节字,并将它返回给CPU。

当这种方式有很大缺陷,比如:

图3.png

上图有两个程序,分别为图中a和b,a加了阴影表示它与b使用不同的内存键。当程序转入内存后就会发生问题,a中执行指令JMP 24,按照指令跳到了对应的位置,此时第二个程序也运行了,b执行指令 JMP 28,会跳到a中的ADD指令处,而不是CMP指令,这种对内存的不正确访问可能导致程序直接奔溃。

上面的关键问题就是直接使用了物理地址。

虚拟寻址

现代处理器使用的是一种虚拟寻址的寻址形式,如下图:

图2.png

CPU通过生成一个虚拟地址(VA)来访问主存,这个虚拟地址在被送到内存之前先转换成适当的物理地址,这个过程叫地址翻译,通过CPU芯片上的内存管理单元(MMU)完成。

地址空间

地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间。

地址空间的概念在很多场合有使用。比如电话号码,在一些国家,一个本地电话号码通常为一个7位数字,所以,电话号码的地址空间从0 000 000 到 9 999 999。IPV4的地址是32位的数字,所以它的地址空间为2^32-1.。

虚拟内存作为缓存的工具

概念而言,虚拟内存被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。

VM系统通过将虚拟内存分割为虚拟页(VP)的大小固定的块来处理。

虚拟地址空间按照固定大小划分成被称为页面的若干单元,在物理内存中对应的单元称为页框

图5.png

任意时刻,虚拟页面的集合都分三个不相交的子集:

  • 未分配的

  • 缓存的

  • 未缓存的

下图展示了一个有8个虚拟页的小虚拟内存

  • 0和3没有被分配,在磁盘上还不存在

  • 1 4 6被缓存在物理内存

  • 2 5 7 已经被分配了,但并未缓存在主存

图4.png

页表

虚拟内存系统需要判断一个虚拟页是否缓存在主存中,如果是,那么这个虚拟页存放在哪个物理页,如果不命中,系统要判断这个虚拟页在磁盘的什么位置,进行后续处理。

页表,存放在物理内存中的数据结构,将虚拟页映射到物理页,每次地址翻译硬件将一个虚拟地址转换为物理地址时,都会读取页表。

页表的目的是把虚拟页面映射为页框,可以把页表看成一个函数,它的参数是虚拟页号,结果是物理页框号,通过这个函数可以把虚拟地址中的虚拟页面替换成页框,从而形成物理地址。

图6.png

上图展示了一个页表的基本组织结构。

页表就是一个页表条目(PTE)的数组。虚拟地址空间中的每个页在页表中一个固定偏移量处都有一个PTE,每个PTE由一个有效为和一个n位地址字段组成。上图中展示了一个有8个虚拟页和4个物理页的系统的页表。

  • VP1 VP2 VP4 VP7 当前被缓存在DRAM

  • VP0 VP5 未分配

  • VP3 VP6 分配了当未缓存

页命中

图71.png

上图中,CPU读取包含在VP2中的虚拟内存的一个字会发生什么?

VP2被缓存在DRAM中,地址翻译硬件将虚拟地址作为一个索引来定位PTE2,从内存中读取它,因为设置了有效位,则地址翻译硬件知道VP2缓存在内存了,所以它使用PTE中的物理内存地址,构造出这个字的物理地址。

缺页

图8.png

DRAM缓存不命中叫做缺页

上图,CPU引用VP3中一个字,VP3没有缓存在DRAM,地址翻译硬件从内存中读取PTE3,从有效位推断出VP3未被缓存,并且触发一个缺页异常。缺页异常调用内核的缺页异常处理程序,程序选择一个牺牲页,此例子中为PP3的VP4

虚拟内存作为内存管理的工具

图9.png

操作系统为每个进程提供了一个独立的页表,也就是一个独立的虚拟地址空间。

上图中,进程i的页表将VP1映射到PP2,VP2映射到PP7,相似的,进程j的页表将VP1映射到PP7,VP2映射到PP10。

多个虚拟页面可以映射到同一个共享物理页面上

按需页面调度和独立的虚拟地址空间的结合,有很大的意义:

  • 简化链接

  • 简化加载

  • 简化共享

  • 简化内存分配

虚拟内存作为内存保护的工具

现代计算机系统必须为操作系统提供手段来控制对内存系统的访问。

因为每次CPU生成一个地址时,地址翻译硬件都会读一个PTE,所以通过在PTE上添加一些额外的许可位来控制对一个虚拟页面内容的访问十分简单。

图10.png

上图中,每个PTE已经添加了三个许可位

  • SUP位表示进程是否必须运行在内核模式下才可以访问该页

  • READ位和WRITE位控制对页面的读和写访问

地址翻译

图11.png

上图展示了MMU如何利用页表来实现地址映射

CPU中的一个控制寄存器,页表基址寄存器(PTBR)指向当前页表。n位的虚拟地址包含两个部分

  • 一个p位的虚拟页面偏移(VPO)

  • 一个(n-p)位的虚拟页号(VPN)

MMU利用VPN选择适当的PTE,如:VPN 0选择PTE 0,VPN 1选择PTE 1。将页表条目中物理页号(PPN)与虚拟地址中的VPO串联起来,得到相应的物理地址。

因为物理和虚拟页面都是P字节的,所以物理页面偏移(PPO)和VPO是一样的。

图12.png

上图展示了页面命中时,CPU硬件的执行步骤

  • 1 处理器生成一个虚拟地址,传给MMU

  • 2 MMU生成PTE地址,从高速缓存/主存请求得到它

  • 3 高速缓存/主存向MMU返回PTE

  • 4 MMU构造物理地址,把它传送给高速缓存/主存

  • 5 高速缓存/主存返回请求的数据字给处理器

利用TLB加速地址翻译

每次CPU产生一个虚拟地址,MMU都必须查阅一个PTE,以便将虚拟地址翻译为物理地址,这一过程有时太耗费时间了。所以在MMU中加入一个关于PTE的小的缓存,叫做翻译后备缓冲器(TLB)

TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个由单个PTE组成的块。

图13.png

上图展示了TLB命中时的步骤,关键点在于:所有的地址翻译步骤都是在芯片上的MMU执行的,因此速度很快。

  • 1 CPU产生一个虚拟地址

  • 2和3 MMU从TLB中取出相应PTE

  • 4 MMU将这个虚拟地址翻译成一个物理地址,将它发送到高速缓存/主存

  • 5 高速缓存/主存将所请求的数据字返回给CPU

多级页表

在使用单级页表时,假设我们的地址空间为32位,也就是4GB,每个页面大小为4KB,则我们需要(4GB/4KB=1M)1M个页面,其中假设每个PTE需要占用4个字节,那一个页表需要(4B*1M=4MB)4MB的空间大小,当系统中进程增大到一定数量时,就太耗费内存了。

这个时候我们考虑使用二级页表

同样的条件,一级页表映射4MB大小,二级页表映射4KB大小。则需要1K个一级页表项(4GB / 4MB = 1K)、每个一级页表项对应1K个二级页表项(4MB / 4KB = 1K)。

图14.png

如上图所示,一级页表中的每个PTE负责映射虚拟地址空间中的一个4MB的片,每一片又由1024个连续的页面组成,如:PTE 0映射第一片,PTE 1映射接下来的一片。

假设片i中每个页面都没分配,那么一级PTE i 为空,如上图:片2-7未被分配,但如果片i中至少有一个页是分配了的,那么一级PTE i就指向一个二级页表的基址。

如上图:0 1 8的所有或者部分已经被分配好了。

这种设计从两个方面减少了内存需求:

  • 如果一级页表中一个PTE为空,那么就不会存在相应的二级页表。对于一个典型的程序来说,4GB的虚拟地址空间大部分是未分配的

  • 只有一级页表才需要在主存,虚拟内存系统可以在需要时创建,页面调入或调出二级页表,减少主存压力。

虚拟内存(深入了解计算机系统) 文章目录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函数 阅读详情

相关推荐

虚拟内存--虚拟内存到物理内存的映射

系统实现地址翻译的大致流程

weixin_59413024的博客 3995

什么是虚拟内存?

前言概述什么是虚拟内存地址和物理地址为什么需要虚拟内存内存映射内存碎片内存交换内存分段总结内存分页多级页表TLB总结本文目的是回顾与梳理所学知识,采用费曼学习法帮助自己巩固学习的同时试图教会不会的人。所以本文不适用于快速阅读提炼知识点。虚拟内存是虚拟机进行内存管理的一个重要的技术。操作系统将通过一种机制将虚拟内存和物理内存映射起来。学编程的应该都有这么一个概念 “引入一个新的技术,就必然会带来新的问题。"因为,没有十全十美的机制和技术,只有最合适的。

qq_60869552的博客 1768

虚拟内存以及进程的虚拟内存分布(第六章)

在早期的计算机中,程序都是直接运行在物理内存上的,运行时访问的地址都是物理地址,而这要求程序使用的内存空间不超过物理内存的大小。在现代计算机操作系统中,计算机同时运行多个程序,为了提高CPU的利用率和物理内存的利用率,操作系统应用虚拟内存机制来管理内存。 本文介绍一些与虚拟内存相关的概念。 目录 1.物理内存 vs 虚拟内存 2.物理内存空间 和 虚拟内存空间 3.4GB虚拟内存 cp...

u012138730的专栏 1万+

初识虚拟内存

虚拟内存(Virtual Memory)是一种计算机内存管理技术,它使得应用程序认为它们拥有连续的可用内存(一个大的地址空间),即使实际上可能被分散在物理内存和磁盘存储中。虚拟内存通过地址映射机制将程序使用的虚拟地址转换为物理地址,从而使得计算机系统可以更高效地利用内存资源。分段(Segmentation)优点逻辑单元管理:每个段可以表示一个逻辑单元(如代码段、数据段、堆栈段),有助于程序结构化灵活的大小:段的大小是可变的,可以根据实际需要进行分配,减少内存浪费。

小楠的博客 1916

HMC7044芯片模拟SPI配置

摘要: HMC7044是一款高性能双环路整数N分频抖动衰减器,支持SPI接口配置,适用于高速数据转换器时钟系统。该芯片采用双PLL级联架构,具有14路可配置输出,可满足GSM/LTE基站设计需求。SPI接口采用3线模式(SLEN/SCLK/SDATA),支持24位寄存器读写(13位地址+8位数据)。驱动实现基于Zynq EMIO模拟SPI,提供初始化、数据传输及寄存器配置功能,支持三线制工作模式和多种时钟参数设置。

toonyhe的博客 1094

六维力传感器选型指南:电阻式vs电容式,哪个更适合你的工业场景?

本文深入解析六维力传感器在工业自动化中的选型要点,重点对比电阻式与电容式传感器的核心原理、环境适应性及成本结构。针对不同工业场景(如高精度装配、重载机器人等),提供专业选型建议,帮助工程师优化系统性能与经济效益。

weixin_42525005的博客 395

虚拟内存怎么设置?16g设置多大的虚拟内存好呢?电脑小白速看!

作为电脑小白,可能不太了解什么是虚拟内存?虚拟内存的关键在于虚拟地址空间,它为每个进程提供一个独立的地址空间。每个进程认为它拥有一个完整的内存空间,而操作系统则负责将这些虚拟地址映射到物理内存地址。简而言之,虚拟内存就像物理内存的临时工作台,物理内存在为电脑一系列程序工作时,选择性将暂时不重要/用不上的程序或数据放置在虚拟内存中,可以随时唤醒进程/数据,从而提高工作效率。

heikejiruanjian的博客 7487

Rk3568 百兆以太网RMII模式DTS配置详解

本文详细解析了RK3568芯片在百兆以太网RMII模式下的DTS配置方法,包括时钟树配置、PHY接口模式定义及实际工程中的进阶设置。通过实战案例和调试技巧,帮助开发者快速解决RMII模式下的常见问题,提升工业控制设备的网络稳定性。

weixin_29189377的博客 420

什么是虚拟内存?虚拟内存的原理

虚拟内存 最近看Binder原理的时候,讲到一个概念MMap,Memory Map,内存映射,一言蔽之就是物理内存和虚拟内存的映射(这个不是重点)。然而突然产生个疑问——什么是虚拟内存?我大概是傻了,横竖睡不着,坐起身来,看了很多帖子,字里行间写着两个大字“懵逼”。一方面我着急弄清楚Binder、mmap原理,一方面悬在我心里的疑问让我惶惶不可终日,左思右想,还是先弄清楚什么是虚拟内存,毕竟不积畦步无以至千里。 坎坷之路 什么是虚拟内存?我百度半天,帖子不少,或许是我愚钝理解能力不行,没有一篇帖子能告诉

blankmargin的博客 1万+

操作系统笔记【全-408统考】【附思维导图】

操作系统 思维导图 概述 操作系统的概念 管理计算机软件和硬件资源 最基本的系统软件 特征 并发 区分并发并行 共享 互斥共享方式 同时访问方式 虚拟 逻辑上多个。虚拟处理器的分时,空分复用的虚拟存储器 采用多道程序设计 异步 由于资源有限,进程走走停停 可能会导致进程产生与时间有关的错误。访问顺序 目的和功能 1.管理计算机资源 功能 处理机管理、存储器管理、文件管理、设备管理 目标:安全、有效 2.作为用户与计算机硬件系统

wvdon 2363

STM32寄存器级电机驱动:DRV8833 H桥与PWM调速原理

电机驱动是嵌入式控制系统的核心基础能力,其本质是微控制器通过数字信号精确控制功率器件的开关时序。理解H桥电路结构、反电动势防护机制及PWM调制原理,是实现可靠直流电机控制的前提。DRV8833作为典型双H桥驱动芯片,支持快衰减与慢衰减两种PWM调速模式,分别对应不同的电流泄放路径与动态响应特性。在STM32平台上,需结合时钟树配置、GPIO复用、定时器寄存器(PSC/ARR/CCR)精确计算,将抽象的转速需求转化为可执行的硬件操作。该技术广泛应用于智能小车、机器人关节、工业定位系统等实时运动控制场景,是掌握

weixin_42613017的博客 675

虚拟内存(为什么要有虚拟内存)

操作系统有虚拟内存与物理内存的概念。在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。并且这是固定的,如果没有虚拟内存,且每次开启一个进程都给4G的物理内存,就可能会出现很多问题: 因为我的物理内存时有限的,当有多个进程要执行的时候,都要给4G内存,很显然你内存小一点,这很快就分配完了,于是没有得到分配资源的进程就只能等待。当一个进程执行完了以后,再将等待的进程装入内存。这种频繁...

小吕的博客 6545

分布式推理服务(策略:数据并行、张量并行、流水线并行、专家并行)技术分析

摘要:分布式推理突破单GPU内存和算力限制,支持大模型部署。四种核心策略包括: 数据并行:复制模型拆分数据,提升吞吐但内存效率低; 流水线并行:模型分阶段执行,支持超大模型但存在计算气泡; 张量并行:拆分层内矩阵运算,延迟低但通信开销大; 专家并行:动态激活MoE模型专家,计算高效但路由复杂。实际应用中常组合策略(如3D并行),需权衡模型规模、硬件条件与性能目标。

技术引领业务创新 940

Win系统设置虚拟内存

虚拟内存可以让系统将硬盘上的部分空间当做内存使用,使计算机可以运行更多的应用程序,但若将其设置的过大,则会大量占用系统盘(C盘)空间,那么如何设置虚拟内存呢。

NSJim的博客 2万+

IgH EtherCAT 从入门到精通:第 3 章 第一次运行 Hello EtherCAT

摘要:启动EtherCAT主站实践指南 本章详细介绍了如何配置和启动EtherCAT主站系统,主要内容包括: 配置文件详解:讲解/etc/ethercat.conf中的关键配置项,包括主网卡指定、冗余备份设置和网卡驱动选择。 启动流程:说明通过systemd服务和手动命令两种方式加载内核模块,重点介绍了ec_master和ec_generic模块的加载顺序及验证方法。 命令行工具:列举ethercat工具的常用命令,如查看主站状态、扫描从站设备、读取PDO/SDO数据等。 示例程序:简要介绍内核态示例min

从事嵌入式linux android驱动开发,拥有全栈能力 310

IEC 61400-1:2019 中的 Vref ——从分类基准到极端风模型的应用

IEC 61400-1:2019 中的 Vref ——从分类基准到极端风模型的应用

weixin_46713695的博客 1286

虚拟内存详解

CASPP之虚拟内存

qq_45335146的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

linux 关闭虚拟内存,Linux关于虚拟内存

虚拟内存是个怎么强调也不过分的概念,它的存在极大地方便了程序设计任务,解放了程序员的手脚。下面看看虚拟内存的作用以及如何在存储管理机制的基础上实现它。关于虚拟内存:什么是虚存?为什么需要它?我们知道程序代码和数据必须驻留在内存中才能得以运行,然而系统内存数量很有限,往往不能容纳一个完整程序的所有代码和数据,更何况在多任务系统中,可能需要同时打开子处理程序,画图程序,浏览器等很多任务,想让内存驻留所...

weixin_34175919的博客 2585

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

虚拟内存-什么是虚拟内存

关于虚拟内存的面试题以及一些衍生的问题

qq_62602996的博客 3075

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

w7计算机虚拟内存设置,win7虚拟内存怎么设置最好

电脑内存是决定计算机运行速度快慢的重要因素,因为所有运行的程序都要内存的支撑来执行,如果电脑一下子开太多程序,而内存就会不够,内存不够的情况下,电脑就会死机,或者运行很慢很卡,所以这才诞生了虚拟内存,虚拟内存可以解决电脑内存不足的情况,原理就是把硬盘的一部分空间当内存使用,当大家在运行类似CAD,或者玩大型的网络游戏时,需要对虚拟内存进行设置优化,那么电脑虚拟内存怎么设置呢,今天系统圣地的小编以w...

weixin_36003021的博客 4568

Redis 虚拟内存

虚拟内存(Virtual Memory)是一种计算机系统中的内存管理技术。它允许将物理内存(RAM)与磁盘上的存储空间(通常是硬盘)进行交换和合理利用。虚拟内存的基本原理是将进程的地址空间分为多个固定大小的块,称为页面(Page)。每个页面可以被加载到物理内存中或者从物理内存交换到磁盘上,以便为其他进程腾出内存空间。当一个进程需要访问某个页面时,如果该页面不在物理内存中,操作系统会将其从磁盘加载到内存中,然后执行对该页面的访问操作。

架构师之路。。 1676

Windows虚拟内存简介

在Windows系统中,系统内存本身的空间可能非常有限,但是通过虚拟内存(Virtual Memory),可以让程序可以拥有超过系统物理内存大小的可用内存空间。   顾名思义,虚拟内存是逻辑层面的划分。操作系统通过内存管理器(Memory Manager)将虚拟内存地址与物理地址进行对应。通常在系统中,虚拟内存的大小都要大于系统的实际内存大小,因此内存管理器会将一部分虚拟内存中的内容映射到

Han的小站 9565

什么是虚拟内存,为什么要使用虚拟内存,虚拟内存可能比物理内存大吗?

虚拟内存是现代操作系统的一个关键特性,它为应用程序提供了一个大且独立的内存空间,通过将部分内存数据存储到硬盘中,帮助系统更有效地管理内存资源。虚拟内存不仅可以比物理内存大,还可以在提高安全性和稳定性的同时简化编程模型。然而,过度依赖虚拟内存可能导致性能下降,因而需要在性能与内存使用之间取得平衡。

2302_80908313的博客 3286

Linux虚拟内存

文章目录前言一、虚拟内存的引入1.基本概念2.局部性原理3.引入二、实现虚拟内存1.载入内存2. 分配虚存、 建段表3.分配内存、建立页表总结 前言 提示:以下是本篇文章正文内容 一、虚拟内存的引入 1.基本概念 虚拟内存: 用辅助存储器(一般指磁盘)作为内存的补充。虚拟内存允许进程执行时只将部分程序放入内存,因此程序可以比物理内存大。虚拟内存的大小受计算机寻址机制和可用辅助存储器容量大限制,而不受内存容量的限制。 特征: ①运行进程时只把现在要执行的页/段装入内存,其余页/段放在外存,需要时..

风间琉璃的博客 2376

mac关闭虚拟内存_为什么不应该关闭Mac上的虚拟内存

mac关闭虚拟内存Your Mac comes with a set amount of physical memory applications can use. Your running programs, open files, and other data your Mac is actively working with are stored in this physical memor...

7564
上一篇: Java-8-Optional类
下一篇: 操作系统—线程
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值