当前位置: 首页 > article >正文

深刻理解虚拟内存机制

注意页框和页大小一样只是为了区分物理和虚拟本文统称为页声明本文借鉴参考小林coding和鸭大坑导进行整合有些个人理解站在巨人的肩膀上学习文章目录为什么要有虚拟内存怎么解决上述问题内存分页机制多级页表TLB页表项的属性缺页异常总结虚拟地址到物理地址映射全流程为什么要有虚拟内存虚拟内存的本质是给每个进程提供一个独立、连续、受保护、可控制的抽象空间没有虚拟内存会发生什么进程无法天然隔离进程A可以访问某段物理地址进程B也能访问这段地址程序需要连续的空间但是物理内存是离散的真实物理内存长期运行一定会碎片化不能高效按需分配了怎么解决上述问题加个中间层进程 虚拟内存 物理内存把所有进程使用的地址隔离开让每个进程都有独立的一套虚拟地址每个进程都有大家自己使用自己的地址互不干扰现在每个进程就不会直接访问物理内存了OS提供一种机制把不同进程的虚拟地址和不同的物理内存进行映射虚拟地址通过MMU操作映射到真实的物理地址内存分页机制分页是把连续的虚拟地址空间映射到离散的物理页框上这个固定大小的内存空间叫做页针对虚拟内存或页框针对物理内存Linux下一页为4KB通过什么方式映射虚拟地址和物理地址通过页表连续的数组来映射页表存储在内存中MMU把虚拟地址转换成物理地址当进程访问的虚拟地址在页表中查不到时触发缺页异常系统进入内核分配物理内存更新页表最后返回用户空间回复进程运行具体怎么映射把虚拟内存地址切分成页号和页偏移量根据页号从页表里面查询对应的物理页号拿物理页号加上前面的偏移量得到真实物理地址一次映射有什么缺陷在32位操作系统一个进程看到的虚拟地址空间大小是​2 32 4 G B 2^{32} 4GB2324GB页表大小是4KB:​4 K B 2 12 4KB 2^{12}4KB212整个4GB空间会被分割成​2 32 ÷ 2 12 2 20 2^{32} \div 2 ^{12} 2^{20}232÷212220大约100万张页表使用一级页表每个虚拟页号对应一个物理页号就形成一个页表项映射关系一共有2 20 2^{20}220个页表项每个页表项4字节页表大小是2 20 × 4 字节 4 M B 2^{20} \times 4字节 4MB220×4字节4MB那么就会出现如下问题页表太大100个进程就要400MB了很多页表根本用不到虚拟地址空间是4GB但是一个进程并不会真的把4GB全用满了不管你用不用以及页表都会把整个4GB地址空间对应的页表项准备好浪费很多空间连续大的内存不好找页表是一个很大的线性数组分配管理不方便多级页表连续大的数组太难存就把数组打散把4MB的大表切割成1024个小表4KB散落在内存中—形成二级页表每个二级页表又包含1024个页表项拆完之后的结构一级页表页目录放1024个指针每个指针指向一个二级页表二级页表页表项放1024个真正的映射关系现在32位地址怎么拆分才能支持二级查找高20位虚拟页号前10位去一级页表找二级页表位置后10位去二级页表找对应物理页号低12位页内偏移—找到最终物理地址为什么多级页表会省内存原来的一级页表必须全部分配1024个小表每个小表4KB全部分配4MB二级页表是按需分配只给真正用到的虚拟地址分配对应的二级页表举个例子假设一个进程用了8MB虚拟空间​8 M B ÷ 4 K B 2 32 ÷ 2 12 2 11 2048 页 8MB \div 4KB 2^{32} \div 2^{12} 2^{11} 2048页8MB÷4KB232÷2122112048页每个二级页表可以管理1024页2048页只需要2个二级页表外加一个一级页表内存开销​4 K B 8 K B 12 K B 4KB 8KB 12KB4KB8KB12KB多级页表的本质就是按需分配TLB多级页表解决了空间问题现在多级页表之间的映射时间问题TLB来解决根据程序局部性原理在一段时间内整个程序的执行仅限于程序中的某个部分相应的执行所访问的存储空间页局限于某个内存区域CPU给MMU传新的虚拟地址之后MMU先去问TLB那边有没有有的话直接拿物理地址不用查表了。但是TLB容量较小难免会缓存未命中此时才走页表找到物理内存还没完TLB会把这条映射关系所在的页缓存后面利用局部性原理就能减少查表了页表项的属性上文中是为了宏观理解把页表项当作虚拟页号和物理页号的映射关系宏观上没有问题现在从微观角度剖析页表项由物理页号一组属性位构成具体的属性有有效位缺页异常的开关标识当前虚拟页对应的物理页是否在内存中程序访问某个地址时MMU查到有效位是0触发缺页异常内核去磁盘找对应的物理内存读写位标识这块内存的访问权限只读区域被写了触发缺页异常权限位标识这个页是用户态可以访问还是只有内核态才能访问用户态访问了内核态专属页触发缺页异常修改位标识这个页被加载到内存中有没有被修改过物理内存满了OS要把某页放回磁盘先看修改位修改位0说明没有修改过直接丢弃节省一次磁盘写操作修改位1老老实实写回磁盘更新缺页异常缺页异常的本质是MMU校验页表项属性不达标无法完成地址翻译向操作系统发送的求救信号分为三种缺页硬缺页场景程序启动加载大文件内存不够用数据被换到了磁盘上流程查表发现有效位为0内核判断是合法的地址但是数据在磁盘中OS发起次磁盘IO直到数据读完把物理页填到页表更新有效位重新执行上次中断的命令软缺页场景共享内存两个进程同时加载一个动态库A已经加载到内存了B访问触发缺页写时拷贝fork出子进程一开始和父进程共享物理内存只读两个进程有一个尝试写数据触发缺页流程查表发现有效位为0或者读写位不匹配内核判断数据已经在物理内存or触发写时拷贝逻辑不进行磁盘IO只修改页表映射关系共享内存或者复制物理页写时拷贝重新执行上次中断的命令无效缺页场景空指针解引用、操作野指针越界访问访问没有申请的虚拟地址权限错误写只读段、用户态访问内核态地址OS判断行为不合法直接发信号显示段错误杀死进程总结虚拟地址到物理地址映射全流程TLB命中TLB未命中属性校验通过属性校验不通过硬缺页软缺页无效缺页进程发起虚拟地址访问CPU将虚拟地址传递给MMUMMU查询TLB快表提取物理页号 页内偏移 → 拼接物理地址拆分虚拟地址高20位前10位后10位虚拟页号 低12位页内偏移访问物理内存一级页表页目录前10位索引找二级页表指针二级页表后10位索引找页表项校验页表项属性有效位/读写位/权限位等提取物理页号 页内偏移 → 拼接物理地址将该映射关系缓存到TLB触发缺页异常OS内核介入处理判定缺页类型确认地址合法-磁盘IO-更新页表项共享内存修改页表映射写时拷贝复制物理页更新映射更新页表项OS发送段错误信号 → 终止进程重新执行地址访问流程done~

相关文章:

深刻理解虚拟内存机制

注意:页框和页大小一样,只是为了区分物理和虚拟,本文统称为页 声明:本文借鉴参考小林coding和鸭大坑导进行整合,有些个人理解,站在巨人的肩膀上学习 文章目录为什么要有虚拟内存怎么解决上述问题&#xff1…...

抢救你的数字青春:QQ空间记忆永久保存全攻略

抢救你的数字青春:QQ空间记忆永久保存全攻略 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 当你在整理旧物时偶然翻到泛黄的毕业照,是否会想起QQ空间里那些更鲜…...

构建一个抗揍的 Go TCP 聊天服务:异常兜底与防御性编程实践

构建一个抗揍的 Go TCP 聊天服务:异常兜底与防御性编程实践 在用 Go 实现一个简单的 TCP 聊天室时,实现“上线、下线、广播、私聊”等功能并不难。但如果要把它放到公网,面对真实网络环境中的网络抖动、恶意攻击(如超长消息洪水、…...

三步搞定空洞骑士模组管理:Scarab让复杂依赖关系变得简单

三步搞定空洞骑士模组管理:Scarab让复杂依赖关系变得简单 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为《空洞骑士》模组安装的各种技术难题而头疼吗&…...

Qt+OpenGL实战:从SOLIDWORKS到UR3机械臂OBJ模型渲染全流程

QtOpenGL实战:从SOLIDWORKS到UR3机械臂OBJ模型渲染全流程 在机器人仿真开发领域,将工业设计软件中的精密模型转化为可交互的三维可视化应用是一个关键且具有挑战性的环节。UR3协作机械臂作为工业自动化领域的明星产品,其高精度模型的渲染与操…...

开源抽卡模拟器:浏览器中的原神资源策略实验室

开源抽卡模拟器:浏览器中的原神资源策略实验室 【免费下载链接】Genshin-Impact-Wish-Simulator Best Genshin Impact Wish Simulator Website, no need to download, 100% running on browser! 项目地址: https://gitcode.com/gh_mirrors/gen/Genshin-Impact-Wis…...

Java SpringBoot+Vue3+MyBatis 图书进销存管理系统系统源码|前后端分离+MySQL数据库

摘要 随着信息技术的快速发展,传统图书进销存管理方式逐渐暴露出效率低下、数据冗余和人工操作繁琐等问题。图书行业对高效、精准的管理系统需求日益增长,尤其在库存管理、销售统计和数据分析方面,亟需一套智能化解决方案。基于前后端分离架构…...

PPOCRLabel快捷键全解析:告别鼠标点点点,提升标注效率的隐藏技巧

PPOCRLabel快捷键全解析:告别鼠标点点点,提升标注效率的隐藏技巧 当你面对上千张待标注的图片时,每次点击菜单、切换工具、调整选框的微小延迟,都会累积成惊人的时间损耗。专业标注员的秘密武器从来不是鼠标,而是那些藏…...

keil工程创建常见问题

问题描述 keil工程文件创建遇到十八个错误: 例如:./Start/core_cm3.h(1756): error: expected ‘;’ after top level declarator static __INLINE uint32_t ITM_SendChar (uint32_t ch)解决方案:提示:点击魔术棒→Target→Code G…...

广西大学电气专业课设资料包|短路计算课程设计全套(含源码+实验报告+理论PPT)

温馨提示:文末有联系方式广西大学电气专业课程设计资料合集 专注服务广大学生,精心整理广西大学电气工程及其自动化专业核心课设,覆盖课程设计全流程需求。短路电流计算课程设计全套电子资料 包含完整可编译运行的软件程序(支持主…...

【VBA】【EXCEL】分类汇总

option explicit option base 1Sub 分类汇总()Dim ws0 As Worksheet, ws1 As WorksheetDim arr0 As Variant, arr1 As VariantDim lastRow As Long, i As Long, m As Long, cnt As LongDim acct As String, opp As String, key As String, pts() As StringDim amt As Double, t…...

内容管理系统 CMS 发展史:从静态建站到 2026 智能一体化协同平台

内容管理系统(CMS)作为支撑互联网内容生态的核心基础软件,自诞生以来已走过 30 余年历程。它始终紧跟技术浪潮与市场需求,从最初简单的静态页面制作工具,逐步演进为集内容管理、低代码开发、智能分析、多端分发于一体的…...

2025届最火的六大降重复率助手推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 能降低AIGC检测率的关键之处在于模拟人类写作所具备的自然性以及逻辑跳跃。其一,…...

2026届学术党必备的十大降重复率神器解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 减少AIGC率的关键要点是全力去降低文本里那些能够被分辨出来的机器生成特性 ,这…...

2025届最火的降AI率神器推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 近期,知网发布了有关人工智能生成内容,也就是AIGC的检测服务以及使用…...

UART 入门指南(Linux新手版)

UART 入门指南(Linux新手版) 适用对象:嵌入式/电子/通信初学者 目录 什么是 UARTUART 工作原理硬件接口与接线通信参数详解编程示例常见问题与调试 1. 什么是UART 1.1 基本定义 UART 的全称是 Universal Asynchronous Receiver/Transmitte…...

C++20 协同调度原语:利用 std::atomic::wait/notify 实现低功耗自旋锁在高并发下的快速响应协议

各位同仁,女士们,先生们,欢迎来到今天的技术讲座。在现代C编程中,高性能与低功耗的追求从未停止。随着多核处理器的普及和异步编程模型的兴起,对并发原语的精细化控制变得尤为关键。C20标准为我们带来了诸多激动人心的…...

C++ 硬件特征自适应分发:利用 C++ 特性实现对不同 CPU 指令集(AVX2/AVX-512)的运行时代码路径最优选择

C 硬件特征自适应分发:运行时代码路径最优选择各位技术爱好者,大家好!在现代高性能计算领域,充分挖掘硬件潜力是提升程序性能的关键。我们知道,CPU架构在不断演进,其指令集也在持续扩展,以支持更…...

uniapp实战:uview Collapse组件动态数据加载后高度异常的3种解决方案

Uniapp实战:uView Collapse组件动态数据加载后高度异常的深度解决方案 在Uniapp开发中,uView UI库的Collapse折叠面板组件因其简洁易用而广受欢迎。但当我们需要动态加载数据并展开面板时,经常会遇到一个棘手的问题:面板高度计算不…...

ROS2 Jazzy机器人导航避坑指南:详解Navigation2参数配置中那些容易出错的‘坑’

ROS2 Jazzy导航系统参数配置实战:从踩坑到精通的避坑手册 当你第一次打开ROS2 Jazzy的Navigation2参数配置文件时,是否感觉像是面对一本没有注释的古老秘籍?那些看似简单的参数背后,往往隐藏着让机器人"发疯"的陷阱。本…...

在PhpStudy中进行PHP版本切换的详细流程(Linux和Windows)

在使用多样化的 PHP Web 应用程序时,选择合适的 PHP 版本至关重要。例如,一些老旧的应用程序可能是基于早期版本的 PHP 开发的,如果使用最新版本的 PHP 来运行,可能会遇到兼容性问题,导致错误。反之,如果用…...

PHP中比较两个对象的几种方式小结

在PHP中,比较两个对象并不是一件直接明了的事情,因为对象之间的比较通常依赖于它们的属性和状态,而这些属性和状态可能非常复杂且多样化。PHP提供了几种方式来比较对象,但每种方式都有其特定的用途和限制。1. 使用和运算符在PHP中…...

PHP脚本设置无限执行时间的四种方法

为 PHP 脚本设置无限执行时间是一个在特定场景下可能需要的操作,比如执行长时间运行的后台任务、数据迁移、大批量数据处理等。然而,值得注意的是,设置无限执行时间并不是一种推荐的做法,因为它可能导致服务器资源被长时间占用&am…...

ThinkPHP实现定时任务的操作步骤

到一个需求:定时检查设备信息,2分钟没有心跳的机器,推送消息给相关人员,用thinkphp5框架,利用框架自带的任务功能与crontab配合来完成定时任务。第一步:分析需求先写获取设备信息,2分钟之内没有…...

快速原型利器:在快马平台一键对比不同AI模型的代码生成效果

最近在开发一个需要快速验证AI模型代码生成能力的项目时,发现手动切换不同模型测试效率太低。于是尝试用InsCode(快马)平台搭建了个模型对比工具,意外地好用,分享下具体实现思路和踩坑经验。 核心需求拆解 这个工具的核心目标是解决三个痛点&…...

Ubuntu24.04下Qt6高效安装指南:从镜像加速到依赖解决

1. 准备工作:系统检查与资源规划 在开始安装Qt6之前,我们需要先做好基础准备工作。很多新手容易忽略这个环节,结果安装到一半才发现磁盘空间不足或者系统版本不兼容。我自己就曾经吃过这个亏,当时安装到90%突然报错,排…...

Java 从入门到精通(十一):异常处理与自定义异常,程序报错时到底该怎么处理?

Java 从入门到精通(十一):异常处理与自定义异常,程序报错时到底该怎么处理? 很多人刚学 Java 时,对“异常”这件事的第一反应通常很直接: 代码报错了控制台一大片红字程序停了然后开始慌 于是很…...

提升51%系统响应:开源工具Win11Debloat让老旧电脑焕发新生

提升51%系统响应:开源工具Win11Debloat让老旧电脑焕发新生 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…...

面向商业航天的高可靠电机控制系统:从环境约束到芯片实现

摘要商业航天已成为全球航天产业高质量发展的核心增长极,电机控制系统作为运载火箭、卫星平台、空间载荷与在轨服务装备的关键执行机构,其在轨可靠性、控制精度与环境适应性直接决定航天任务成败。本文系统梳理商业航天电机控制领域的技术演进、典型负载…...

如何在iPhone 6s上解决内核利用失败问题:TrollInstallerX完全指南

如何在iPhone 6s上解决内核利用失败问题:TrollInstallerX完全指南 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否在使用TrollInstallerX越狱iPhone 6…...