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

虚拟内存核心常识

好的,这是一个非常核心的计算机基础概念。我们抛开复杂的细节,用最直白的方式梳理一下虚拟内存的核心常识

你可以把虚拟内存理解为一个给程序(进程)制造的“美好幻觉”和一套高效的“管理机制”。


一、核心目标:解决什么问题?

虚拟内存主要为了解决四个核心问题:

  1. 物理内存不足:当要运行的程序比实际物理内存(RAM)还大时,或者同时运行多个程序导致总内存需求超过物理内存时,怎么办?
  2. 内存碎片化:程序频繁申请和释放内存,会导致物理内存中出现很多不连续的小碎片,即使总空闲内存足够,也可能无法分配一块连续的大内存。
  3. 程序安全与隔离:一个程序不应该能够随意访问甚至修改另一个程序的内存数据,否则会引发致命错误或安全漏洞。
  4. 简化编程:程序员在写程序时,希望能认为程序拥有一块从0开始、连续的、独立的内存空间,而不用关心数据实际存放在物理内存的哪个地址。

二、核心思想:如何解决?

虚拟内存的核心思想是 “解耦”“欺骗”

  • 解耦:将程序看到的“地址空间”(虚拟地址)与硬件使用的“地址空间”(物理地址)分离开。
  • 欺骗:对每个运行的程序说:“你独占整个内存空间(比如从0到4GB),随便用!” 但实际上,程序的数据可能分散在物理内存的各个角落,甚至有一部分被临时“踢到”硬盘上去了。

三、核心机制:如何实现这个思想?

为了实现上述思想,虚拟内存依赖于三个关键机制:

  1. 分页

    • 是什么:将物理内存和虚拟内存都分割成固定大小的块。物理内存的块叫“页框”,虚拟内存的块叫“页”。通常大小为4KB。
    • 作用:解决了内存碎片问题。因为程序不需要一整块连续的物理内存,只需要足够多的、可以不连续的“页框”即可。
  2. 地址转换(MMU + 页表)

    • MMU:内存管理单元,是CPU中的一个硬件部件,专门负责将程序发出的虚拟地址转换为实际的物理地址。
    • 页表:一个存储在内存中的“映射字典”。每个程序都有自己独立的页表。它记录了“你的虚拟页X,对应着物理内存的页框Y”。
    • 工作流程:程序访问虚拟地址 → MMU查阅页表 → 找到对应的物理地址 → 访问真实数据。
  3. 页面置换

    • 是什么:当物理内存快被用完时,需要把一些不常用的“页”从物理内存中挪到硬盘上一个叫“交换空间”的特殊区域,为新的数据腾出空间。这个过程就是“换出”。当程序再次需要被换出的页面时,再把它从硬盘“换入”到内存。
    • 作用:这解决了物理内存不足的问题。硬盘充当了物理内存的“后备仓库”,使得程序可以使用的总内存量远大于实际物理内存。
    • 常见算法:LRU(最近最少使用)等,目标是尽量换出最不可能被再次使用的页面,以减少性能损耗。

四、核心好处(总结)

基于以上机制,虚拟内存带来了四大根本性好处:

  1. 隔离与安全:每个程序都在自己的“沙箱”(虚拟地址空间)里运行,无法窥探或破坏其他程序的内存。这是现代操作系统稳定的基石。
  2. 简化编程:程序员看到的是统一、连续、独立的虚拟地址空间,大大降低了开发难度。
  3. 更大的“内存”空间:程序可以使用比物理内存大得多的地址空间(例如,32位系统是4GB,64位系统更是天文数字)。
  4. 允许部分加载:程序启动时,无需将全部代码和数据载入内存,只需要加载当前运行所需的页面即可,加快了启动速度。

生动的比喻:图书馆与书架

  • 程序 = 一个读者
  • 虚拟地址空间 = 图书馆的图书目录(上面写着所有书的位置编号,比如A区-1架-2层)
  • 物理内存 = 图书馆里实际有限的书架空间
  • 硬盘/交换空间 = 图书馆后院巨大的仓库
  • 页表 = 图书管理员手中的一个映射本,记录着“目录上的A区-1架-2层,实际上对应着第3号书架的顶层”。
  • 页面置换 = 当书架满了,管理员会把一些很久没人看的书(页面)搬回仓库(换出),把新 requested 的书从仓库拿出来放到书架上(换入)。读者不需要知道这个过程,他只需要按目录索骥即可。

代价:频繁的“换入换出”(称为“颠簸”)会严重拖慢系统,因为硬盘读写速度远远慢于内存。所以,物理内存仍然是越快、越大越好。

http://www.dtcms.com/a/506935.html

相关文章:

  • ubuntu配置mysql8.0并设置Navicat网络连接
  • 深圳网站维护一般多少钱网址大全黄免费片
  • 从若依框架看权限设计与数据字典:背后的工程化思考
  • 邦策网站建设平台网站建设文化咨询
  • ASTM D7033-2022 定向刨花板检测
  • 使用ThreadLocal的一些注意事项
  • Kotion 常见用法注意事项(持续更新...)
  • 如何使用思维导图提升信息整理效率
  • K-VXE-TABLE二次封装,含table‘自定义列功能
  • 基于 GEE 开发的一种利用 OTSU 算法实现水体提取的便捷工具
  • Linux小课堂: 深入解析 top、htop、glances 及进程终止机制
  • 建设协会网站洛阳伟创科技
  • MongoDB 提供的 `GridFSTemplate` 操作 GridFS 大文件系统的常用查询方式
  • 2025年ASOC SCI2区TOP,基于模糊分组的多仓库多无人机电力杆巡检模因算法,深度解析+性能实测
  • 无人机地面站中不同的飞行模式具体含义释义(开源飞控常用的5种模式)
  • Inventor 转换为 3DXML 全流程技术指南:附迪威模型网在线方案
  • Maven POM 简介
  • pytorch踩坑记录
  • seo每天一贴博客南宁网站排名优化电话
  • 手机端网站开发书籍徐州vi设计公司
  • STM32F1和STM32F4在配置硬件SPI1时有什么不同?
  • 衣柜灯橱柜灯MCU方案开发
  • 数据访问对象模式(Data Access Object Pattern)
  • 滚动显示效果
  • Spring Cloud - Spring Cloud 微服务概述 (微服务的产生与特点、微服务的优缺点、微服务设计原则、微服务架构的核心组件)
  • YOLOv4:目标检测领域的 “速度与精度平衡大师”
  • agent设计模式:第二章节—路由
  • 玩转Docker | 使用Docker安装uptime-kuma监控工具
  • flutter开发小结
  • 【运维】鲲鹏麒麟V10 操作系统aarch64自制OpenSSH 9.8p1 rpm包 ssh漏洞修复